Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MR414N-ID
GitHub Repository: MR414N-ID/botku2
Path: blob/master/node_modules/@adiwajshing/baileys/lib/Utils/generics.js
1129 views
1
"use strict";
2
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
if (k2 === undefined) k2 = k;
4
var desc = Object.getOwnPropertyDescriptor(m, k);
5
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
desc = { enumerable: true, get: function() { return m[k]; } };
7
}
8
Object.defineProperty(o, k2, desc);
9
}) : (function(o, m, k, k2) {
10
if (k2 === undefined) k2 = k;
11
o[k2] = m[k];
12
}));
13
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
Object.defineProperty(o, "default", { enumerable: true, value: v });
15
}) : function(o, v) {
16
o["default"] = v;
17
});
18
var __importStar = (this && this.__importStar) || function (mod) {
19
if (mod && mod.__esModule) return mod;
20
var result = {};
21
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
__setModuleDefault(result, mod);
23
return result;
24
};
25
var __importDefault = (this && this.__importDefault) || function (mod) {
26
return (mod && mod.__esModule) ? mod : { "default": mod };
27
};
28
Object.defineProperty(exports, "__esModule", { value: true });
29
exports.isWABusinessPlatform = exports.getCodeFromWSError = exports.getCallStatusFromNode = exports.getErrorCodeFromStreamError = exports.getStatusFromReceiptType = exports.generateMdTagPrefix = exports.fetchLatestWaWebVersion = exports.fetchLatestBaileysVersion = exports.printQRIfNecessaryListener = exports.bindWaitForConnectionUpdate = exports.bindWaitForEvent = exports.generateMessageID = exports.promiseTimeout = exports.delayCancellable = exports.delay = exports.debouncedTimeout = exports.unixTimestampSeconds = exports.toNumber = exports.encodeBigEndian = exports.generateRegistrationId = exports.encodeWAMessage = exports.unpadRandomMax16 = exports.writeRandomPadMax16 = exports.BufferJSON = exports.Browsers = void 0;
30
const boom_1 = require("@hapi/boom");
31
const axios_1 = __importDefault(require("axios"));
32
const crypto_1 = require("crypto");
33
const os_1 = require("os");
34
const WAProto_1 = require("../../WAProto");
35
const baileys_version_json_1 = require("../Defaults/baileys-version.json");
36
const Types_1 = require("../Types");
37
const WABinary_1 = require("../WABinary");
38
const PLATFORM_MAP = {
39
'aix': 'AIX',
40
'darwin': 'Mac OS',
41
'win32': 'Windows',
42
'android': 'Android'
43
};
44
exports.Browsers = {
45
ubuntu: browser => ['Ubuntu', browser, '20.0.04'],
46
macOS: browser => ['Mac OS', browser, '10.15.7'],
47
baileys: browser => ['Baileys', browser, '4.0.0'],
48
/** The appropriate browser based on your OS & release */
49
appropriate: browser => [PLATFORM_MAP[(0, os_1.platform)()] || 'Ubuntu', browser, (0, os_1.release)()]
50
};
51
exports.BufferJSON = {
52
replacer: (k, value) => {
53
if (Buffer.isBuffer(value) || value instanceof Uint8Array || (value === null || value === void 0 ? void 0 : value.type) === 'Buffer') {
54
return { type: 'Buffer', data: Buffer.from((value === null || value === void 0 ? void 0 : value.data) || value).toString('base64') };
55
}
56
return value;
57
},
58
reviver: (_, value) => {
59
if (typeof value === 'object' && !!value && (value.buffer === true || value.type === 'Buffer')) {
60
const val = value.data || value.value;
61
return typeof val === 'string' ? Buffer.from(val, 'base64') : Buffer.from(val || []);
62
}
63
return value;
64
}
65
};
66
const writeRandomPadMax16 = (msg) => {
67
const pad = (0, crypto_1.randomBytes)(1);
68
pad[0] &= 0xf;
69
if (!pad[0]) {
70
pad[0] = 0xf;
71
}
72
return Buffer.concat([msg, Buffer.alloc(pad[0], pad[0])]);
73
};
74
exports.writeRandomPadMax16 = writeRandomPadMax16;
75
const unpadRandomMax16 = (e) => {
76
const t = new Uint8Array(e);
77
if (0 === t.length) {
78
throw new Error('unpadPkcs7 given empty bytes');
79
}
80
var r = t[t.length - 1];
81
if (r > t.length) {
82
throw new Error(`unpad given ${t.length} bytes, but pad is ${r}`);
83
}
84
return new Uint8Array(t.buffer, t.byteOffset, t.length - r);
85
};
86
exports.unpadRandomMax16 = unpadRandomMax16;
87
const encodeWAMessage = (message) => ((0, exports.writeRandomPadMax16)(WAProto_1.proto.Message.encode(message).finish()));
88
exports.encodeWAMessage = encodeWAMessage;
89
const generateRegistrationId = () => {
90
return Uint16Array.from((0, crypto_1.randomBytes)(2))[0] & 16383;
91
};
92
exports.generateRegistrationId = generateRegistrationId;
93
const encodeBigEndian = (e, t = 4) => {
94
let r = e;
95
const a = new Uint8Array(t);
96
for (let i = t - 1; i >= 0; i--) {
97
a[i] = 255 & r;
98
r >>>= 8;
99
}
100
return a;
101
};
102
exports.encodeBigEndian = encodeBigEndian;
103
const toNumber = (t) => ((typeof t === 'object' && t) ? ('toNumber' in t ? t.toNumber() : t.low) : t);
104
exports.toNumber = toNumber;
105
/** unix timestamp of a date in seconds */
106
const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000);
107
exports.unixTimestampSeconds = unixTimestampSeconds;
108
const debouncedTimeout = (intervalMs = 1000, task) => {
109
let timeout;
110
return {
111
start: (newIntervalMs, newTask) => {
112
task = newTask || task;
113
intervalMs = newIntervalMs || intervalMs;
114
timeout && clearTimeout(timeout);
115
timeout = setTimeout(() => task === null || task === void 0 ? void 0 : task(), intervalMs);
116
},
117
cancel: () => {
118
timeout && clearTimeout(timeout);
119
timeout = undefined;
120
},
121
setTask: (newTask) => task = newTask,
122
setInterval: (newInterval) => intervalMs = newInterval
123
};
124
};
125
exports.debouncedTimeout = debouncedTimeout;
126
const delay = (ms) => (0, exports.delayCancellable)(ms).delay;
127
exports.delay = delay;
128
const delayCancellable = (ms) => {
129
const stack = new Error().stack;
130
let timeout;
131
let reject;
132
const delay = new Promise((resolve, _reject) => {
133
timeout = setTimeout(resolve, ms);
134
reject = _reject;
135
});
136
const cancel = () => {
137
clearTimeout(timeout);
138
reject(new boom_1.Boom('Cancelled', {
139
statusCode: 500,
140
data: {
141
stack
142
}
143
}));
144
};
145
return { delay, cancel };
146
};
147
exports.delayCancellable = delayCancellable;
148
async function promiseTimeout(ms, promise) {
149
if (!ms) {
150
return new Promise(promise);
151
}
152
const stack = new Error().stack;
153
// Create a promise that rejects in <ms> milliseconds
154
const { delay, cancel } = (0, exports.delayCancellable)(ms);
155
const p = new Promise((resolve, reject) => {
156
delay
157
.then(() => reject(new boom_1.Boom('Timed Out', {
158
statusCode: Types_1.DisconnectReason.timedOut,
159
data: {
160
stack
161
}
162
})))
163
.catch(err => reject(err));
164
promise(resolve, reject);
165
})
166
.finally(cancel);
167
return p;
168
}
169
exports.promiseTimeout = promiseTimeout;
170
// generate a random ID to attach to a message
171
const generateMessageID = () => 'BAE5' + (0, crypto_1.randomBytes)(6).toString('hex').toUpperCase();
172
exports.generateMessageID = generateMessageID;
173
function bindWaitForEvent(ev, event) {
174
return async (check, timeoutMs) => {
175
let listener;
176
let closeListener;
177
await (promiseTimeout(timeoutMs, (resolve, reject) => {
178
closeListener = ({ connection, lastDisconnect }) => {
179
if (connection === 'close') {
180
reject((lastDisconnect === null || lastDisconnect === void 0 ? void 0 : lastDisconnect.error)
181
|| new boom_1.Boom('Connection Closed', { statusCode: Types_1.DisconnectReason.connectionClosed }));
182
}
183
};
184
ev.on('connection.update', closeListener);
185
listener = (update) => {
186
if (check(update)) {
187
resolve();
188
}
189
};
190
ev.on(event, listener);
191
})
192
.finally(() => {
193
ev.off(event, listener);
194
ev.off('connection.update', closeListener);
195
}));
196
};
197
}
198
exports.bindWaitForEvent = bindWaitForEvent;
199
const bindWaitForConnectionUpdate = (ev) => bindWaitForEvent(ev, 'connection.update');
200
exports.bindWaitForConnectionUpdate = bindWaitForConnectionUpdate;
201
const printQRIfNecessaryListener = (ev, logger) => {
202
ev.on('connection.update', async ({ qr }) => {
203
if (qr) {
204
const QR = await Promise.resolve().then(() => __importStar(require('qrcode-terminal'))).catch(() => {
205
logger.error('QR code terminal not added as dependency');
206
});
207
QR === null || QR === void 0 ? void 0 : QR.generate(qr, { small: true });
208
}
209
});
210
};
211
exports.printQRIfNecessaryListener = printQRIfNecessaryListener;
212
/**
213
* utility that fetches latest baileys version from the master branch.
214
* Use to ensure your WA connection is always on the latest version
215
*/
216
const fetchLatestBaileysVersion = async () => {
217
const URL = 'https://raw.githubusercontent.com/adiwajshing/Baileys/master/src/Defaults/baileys-version.json';
218
try {
219
const result = await axios_1.default.get(URL, { responseType: 'json' });
220
return {
221
version: result.data.version,
222
isLatest: true
223
};
224
}
225
catch (error) {
226
return {
227
version: baileys_version_json_1.version,
228
isLatest: false,
229
error
230
};
231
}
232
};
233
exports.fetchLatestBaileysVersion = fetchLatestBaileysVersion;
234
/**
235
* A utility that fetches the latest web version of whatsapp.
236
* Use to ensure your WA connection is always on the latest version
237
*/
238
const fetchLatestWaWebVersion = async () => {
239
try {
240
const result = await axios_1.default.get('https://web.whatsapp.com/check-update?version=1&platform=web', { responseType: 'json' });
241
const version = result.data.currentVersion.split('.');
242
return {
243
version: [+version[0], +version[1], +version[2]],
244
isLatest: true
245
};
246
}
247
catch (error) {
248
return {
249
version: baileys_version_json_1.version,
250
isLatest: false,
251
error
252
};
253
}
254
};
255
exports.fetchLatestWaWebVersion = fetchLatestWaWebVersion;
256
/** unique message tag prefix for MD clients */
257
const generateMdTagPrefix = () => {
258
const bytes = (0, crypto_1.randomBytes)(4);
259
return `${bytes.readUInt16BE()}.${bytes.readUInt16BE(2)}-`;
260
};
261
exports.generateMdTagPrefix = generateMdTagPrefix;
262
const STATUS_MAP = {
263
'played': WAProto_1.proto.WebMessageInfo.Status.PLAYED,
264
'read': WAProto_1.proto.WebMessageInfo.Status.READ,
265
'read-self': WAProto_1.proto.WebMessageInfo.Status.READ
266
};
267
/**
268
* Given a type of receipt, returns what the new status of the message should be
269
* @param type type from receipt
270
*/
271
const getStatusFromReceiptType = (type) => {
272
const status = STATUS_MAP[type];
273
if (typeof type === 'undefined') {
274
return WAProto_1.proto.WebMessageInfo.Status.DELIVERY_ACK;
275
}
276
return status;
277
};
278
exports.getStatusFromReceiptType = getStatusFromReceiptType;
279
const CODE_MAP = {
280
conflict: Types_1.DisconnectReason.connectionReplaced
281
};
282
/**
283
* Stream errors generally provide a reason, map that to a baileys DisconnectReason
284
* @param reason the string reason given, eg. "conflict"
285
*/
286
const getErrorCodeFromStreamError = (node) => {
287
const [reasonNode] = (0, WABinary_1.getAllBinaryNodeChildren)(node);
288
let reason = (reasonNode === null || reasonNode === void 0 ? void 0 : reasonNode.tag) || 'unknown';
289
const statusCode = +(node.attrs.code || CODE_MAP[reason] || Types_1.DisconnectReason.badSession);
290
if (statusCode === Types_1.DisconnectReason.restartRequired) {
291
reason = 'restart required';
292
}
293
return {
294
reason,
295
statusCode
296
};
297
};
298
exports.getErrorCodeFromStreamError = getErrorCodeFromStreamError;
299
const getCallStatusFromNode = ({ tag, attrs }) => {
300
let status;
301
switch (tag) {
302
case 'offer':
303
case 'offer_notice':
304
status = 'offer';
305
break;
306
case 'terminate':
307
if (attrs.reason === 'timeout') {
308
status = 'timeout';
309
}
310
else {
311
status = 'reject';
312
}
313
break;
314
case 'reject':
315
status = 'reject';
316
break;
317
case 'accept':
318
status = 'accept';
319
break;
320
default:
321
status = 'ringing';
322
break;
323
}
324
return status;
325
};
326
exports.getCallStatusFromNode = getCallStatusFromNode;
327
const UNEXPECTED_SERVER_CODE_TEXT = 'Unexpected server response: ';
328
const getCodeFromWSError = (error) => {
329
var _a;
330
let statusCode = 500;
331
if (error.message.includes(UNEXPECTED_SERVER_CODE_TEXT)) {
332
const code = +error.message.slice(UNEXPECTED_SERVER_CODE_TEXT.length);
333
if (!Number.isNaN(code) && code >= 400) {
334
statusCode = code;
335
}
336
}
337
else if ((_a = error.code) === null || _a === void 0 ? void 0 : _a.startsWith('E')) { // handle ETIMEOUT, ENOTFOUND etc
338
statusCode = 408;
339
}
340
return statusCode;
341
};
342
exports.getCodeFromWSError = getCodeFromWSError;
343
/**
344
* Is the given platform WA business
345
* @param platform AuthenticationCreds.platform
346
*/
347
const isWABusinessPlatform = (platform) => {
348
return platform === 'smbi' || platform === 'smba';
349
};
350
exports.isWABusinessPlatform = isWABusinessPlatform;
351
352