xhyphersockets 1.4.3 → 2.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.MD +1295 -0
- package/WAProto/p.html +1 -0
- package/lib/Defaults/index.js +47 -35
- package/lib/Defaults/wileys-version.json +3 -0
- package/lib/Socket/chats.js +132 -125
- package/lib/Socket/messages-recv.js +1 -1
- package/lib/Socket/messages-send.js +1 -32
- package/lib/Socket/newsletter.js +71 -124
- package/lib/Socket/socket.js +1 -1
- package/lib/Store/make-in-memory-store.js +1 -1
- package/lib/Types/Newsletter.js +18 -38
- package/lib/Utils/browser-utils.js +35 -0
- package/lib/Utils/event-buffer.js +2 -2
- package/lib/Utils/generics.js +47 -8
- package/lib/Utils/index.js +3 -4
- package/lib/Utils/message-retry-manager.js +128 -0
- package/lib/Utils/messages-media.js +37 -45
- package/lib/Utils/messages.js +19 -0
- package/lib/Utils/process-message.js +19 -0
- package/lib/Utils/use-multi-file-auth-state.js +1 -1
- package/lib/Utils/validate-connection.js +77 -21
- package/lib/Utils/{baileys-event-stream.js → wileys-event-stream.js} +1 -1
- package/lib/WABinary/jid-utils.js +3 -1
- package/lib/index.js +12 -18
- package/package.json +28 -22
- package/README.md +0 -252
- package/WAProto/index.d.ts +0 -55057
- package/WAProto/index.ts.ts +0 -53473
- package/lib/Defaults/baileys-version.json +0 -3
- package/lib/Defaults/index.d.ts +0 -51
- package/lib/Signal/Group/ciphertext-message.d.ts +0 -9
- package/lib/Signal/Group/group-session-builder.d.ts +0 -14
- package/lib/Signal/Group/group_cipher.d.ts +0 -17
- package/lib/Signal/Group/index.d.ts +0 -11
- package/lib/Signal/Group/keyhelper.d.ts +0 -10
- package/lib/Signal/Group/queue-job.d.ts +0 -1
- package/lib/Signal/Group/sender-chain-key.d.ts +0 -13
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -16
- package/lib/Signal/Group/sender-key-message.d.ts +0 -18
- package/lib/Signal/Group/sender-key-name.d.ts +0 -17
- package/lib/Signal/Group/sender-key-record.d.ts +0 -30
- package/lib/Signal/Group/sender-key-state.d.ts +0 -38
- package/lib/Signal/Group/sender-message-key.d.ts +0 -11
- package/lib/Signal/libsignal.d.ts +0 -3
- package/lib/Socket/Client/index.d.ts +0 -2
- package/lib/Socket/Client/types.d.ts +0 -16
- package/lib/Socket/Client/websocket.d.ts +0 -13
- package/lib/Socket/RHandler.d.ts +0 -416
- package/lib/Socket/RHandler.js +0 -530
- package/lib/Socket/business.d.ts +0 -172
- package/lib/Socket/chats.d.ts +0 -94
- package/lib/Socket/groups.d.ts +0 -124
- package/lib/Socket/index.d.ts +0 -172
- package/lib/Socket/messages-recv.d.ts +0 -161
- package/lib/Socket/messages-send.d.ts +0 -152
- package/lib/Socket/newsletter.d.ts +0 -136
- package/lib/Socket/socket.d.ts +0 -43
- package/lib/Socket/usync.d.ts +0 -36
- package/lib/Store/index.d.ts +0 -2
- package/lib/Store/make-in-memory-store.d.ts +0 -118
- package/lib/Store/make-ordered-dictionary.d.ts +0 -13
- package/lib/Store/object-repository.d.ts +0 -10
- package/lib/Types/Auth.d.ts +0 -103
- package/lib/Types/Call.d.ts +0 -13
- package/lib/Types/Chat.d.ts +0 -109
- package/lib/Types/Contact.d.ts +0 -23
- package/lib/Types/Events.d.ts +0 -199
- package/lib/Types/GroupMetadata.d.ts +0 -64
- package/lib/Types/Label.d.ts +0 -35
- package/lib/Types/LabelAssociation.d.ts +0 -29
- package/lib/Types/Message.d.ts +0 -402
- package/lib/Types/Newsletter.d.ts +0 -103
- package/lib/Types/Product.d.ts +0 -78
- package/lib/Types/Signal.d.ts +0 -57
- package/lib/Types/Socket.d.ts +0 -119
- package/lib/Types/State.d.ts +0 -27
- package/lib/Types/USync.d.ts +0 -25
- package/lib/Types/index.d.ts +0 -64
- package/lib/Utils/audioToBuffer.js +0 -29
- package/lib/Utils/auth-utils.d.ts +0 -18
- package/lib/Utils/baileys-event-stream.d.ts +0 -16
- package/lib/Utils/business.d.ts +0 -22
- package/lib/Utils/chat-utils.d.ts +0 -70
- package/lib/Utils/crypto.d.ts +0 -40
- package/lib/Utils/decode-wa-message.d.ts +0 -35
- package/lib/Utils/event-buffer.d.ts +0 -35
- package/lib/Utils/generics.d.ts +0 -89
- package/lib/Utils/history.d.ts +0 -19
- package/lib/Utils/index.d.ts +0 -19
- package/lib/Utils/link-preview.d.ts +0 -21
- package/lib/Utils/logger.d.ts +0 -11
- package/lib/Utils/lt-hash.d.ts +0 -12
- package/lib/Utils/make-mutex.d.ts +0 -7
- package/lib/Utils/messages-media.d.ts +0 -124
- package/lib/Utils/messages.d.ts +0 -75
- package/lib/Utils/noise-handler.d.ts +0 -19
- package/lib/Utils/process-message.d.ts +0 -42
- package/lib/Utils/signal.d.ts +0 -33
- package/lib/Utils/streamToBuffer.js +0 -15
- package/lib/Utils/use-multi-file-auth-state.d.ts +0 -12
- package/lib/Utils/validate-connection.d.ts +0 -10
- package/lib/WABinary/constants.d.ts +0 -27
- package/lib/WABinary/decode.d.ts +0 -6
- package/lib/WABinary/encode.d.ts +0 -2
- package/lib/WABinary/generic-utils.d.ts +0 -14
- package/lib/WABinary/index.d.ts +0 -5
- package/lib/WABinary/jid-utils.d.ts +0 -36
- package/lib/WABinary/jid-utils.js.bak +0 -83
- package/lib/WABinary/types.d.ts +0 -18
- package/lib/WAM/BinaryInfo.d.ts +0 -8
- package/lib/WAM/constants.d.ts +0 -38
- package/lib/WAM/encode.d.ts +0 -2
- package/lib/WAM/index.d.ts +0 -3
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -9
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -22
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -12
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -12
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -25
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -8
- package/lib/WAUSync/Protocols/index.d.ts +0 -4
- package/lib/WAUSync/USyncQuery.d.ts +0 -28
- package/lib/WAUSync/USyncUser.d.ts +0 -12
- package/lib/WAUSync/index.d.ts +0 -3
- package/lib/index.d.ts +0 -16
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MessageRetryManager = void 0;
|
|
4
|
+
|
|
5
|
+
const lru_cache_1 = require("lru-cache");
|
|
6
|
+
|
|
7
|
+
const RECENT_MESSAGES_SIZE = 512;
|
|
8
|
+
|
|
9
|
+
const RECREATE_SESSION_TIMEOUT = 60 * 60 * 1000;
|
|
10
|
+
|
|
11
|
+
const PHONE_REQUEST_DELAY = 3000;
|
|
12
|
+
|
|
13
|
+
class MessageRetryManager {
|
|
14
|
+
constructor(logger, maxMsgRetryCount) {
|
|
15
|
+
this.logger = logger;
|
|
16
|
+
this.maxMsgRetryCount = maxMsgRetryCount;
|
|
17
|
+
this._recentMessagesMap = new lru_cache_1.LRUCache({
|
|
18
|
+
max: RECENT_MESSAGES_SIZE
|
|
19
|
+
});
|
|
20
|
+
this._sessionRecreateHistory = new lru_cache_1.LRUCache({
|
|
21
|
+
ttl: RECREATE_SESSION_TIMEOUT * 2,
|
|
22
|
+
ttlAutopurge: true
|
|
23
|
+
});
|
|
24
|
+
this._retryCounters = new lru_cache_1.LRUCache({
|
|
25
|
+
ttl: 15 * 60 * 1000,
|
|
26
|
+
ttlAutopurge: true,
|
|
27
|
+
updateAgeOnGet: true
|
|
28
|
+
});
|
|
29
|
+
this._pendingPhoneRequests = {};
|
|
30
|
+
this.statistics = {
|
|
31
|
+
totalRetries: 0,
|
|
32
|
+
successfulRetries: 0,
|
|
33
|
+
failedRetries: 0,
|
|
34
|
+
mediaRetries: 0,
|
|
35
|
+
sessionRecreations: 0,
|
|
36
|
+
phoneRequests: 0
|
|
37
|
+
};
|
|
38
|
+
this.maxMsgRetryCount = maxMsgRetryCount;
|
|
39
|
+
}
|
|
40
|
+
addRecentMessage(to, id, message) {
|
|
41
|
+
const key = { to, id };
|
|
42
|
+
const keyStr = this._keyToString(key);
|
|
43
|
+
this._recentMessagesMap.set(keyStr, {
|
|
44
|
+
message,
|
|
45
|
+
timestamp: Date.now()
|
|
46
|
+
});
|
|
47
|
+
this.logger.debug(`Added message to retry cache: ${to}/${id}`);
|
|
48
|
+
}
|
|
49
|
+
getRecentMessage(to, id) {
|
|
50
|
+
const key = { to, id };
|
|
51
|
+
const keyStr = this._keyToString(key);
|
|
52
|
+
return this._recentMessagesMap.get(keyStr);
|
|
53
|
+
}
|
|
54
|
+
shouldRecreateSession(jid, retryCount, hasSession) {
|
|
55
|
+
if (!hasSession) {
|
|
56
|
+
this._sessionRecreateHistory.set(jid, Date.now());
|
|
57
|
+
this.statistics.sessionRecreations++;
|
|
58
|
+
return {
|
|
59
|
+
reason: "we don't have a Signal session with them",
|
|
60
|
+
recreate: true
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (retryCount < 2) {
|
|
64
|
+
return { reason: '', recreate: false };
|
|
65
|
+
}
|
|
66
|
+
const now = Date.now();
|
|
67
|
+
const prevTime = this._sessionRecreateHistory.get(jid);
|
|
68
|
+
if (!prevTime || now - prevTime > RECREATE_SESSION_TIMEOUT) {
|
|
69
|
+
this._sessionRecreateHistory.set(jid, now);
|
|
70
|
+
this.statistics.sessionRecreations++;
|
|
71
|
+
return {
|
|
72
|
+
reason: 'retry count > 1 and over an hour since last recreation',
|
|
73
|
+
recreate: true
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return { reason: '', recreate: false };
|
|
77
|
+
}
|
|
78
|
+
incrementRetryCount(messageId) {
|
|
79
|
+
this._retryCounters.set(messageId, (this._retryCounters.get(messageId) || 0) + 1);
|
|
80
|
+
this.statistics.totalRetries++;
|
|
81
|
+
return this._retryCounters.get(messageId);
|
|
82
|
+
}
|
|
83
|
+
getRetryCount(messageId) {
|
|
84
|
+
return this._retryCounters.get(messageId) || 0;
|
|
85
|
+
}
|
|
86
|
+
hasExceededMaxRetries(messageId) {
|
|
87
|
+
return this.getRetryCount(messageId) >= this.maxMsgRetryCount;
|
|
88
|
+
}
|
|
89
|
+
markRetrySuccess(messageId) {
|
|
90
|
+
this.statistics.successfulRetries++;
|
|
91
|
+
this._retryCounters.delete(messageId);
|
|
92
|
+
this._cancelPendingPhoneRequest(messageId);
|
|
93
|
+
}
|
|
94
|
+
markRetryFailed(messageId) {
|
|
95
|
+
this.statistics.failedRetries++;
|
|
96
|
+
this._retryCounters.delete(messageId);
|
|
97
|
+
}
|
|
98
|
+
schedulePhoneRequest(messageId, callback, delay = PHONE_REQUEST_DELAY) {
|
|
99
|
+
this._cancelPendingPhoneRequest(messageId);
|
|
100
|
+
this._pendingPhoneRequests[messageId] = setTimeout(() => {
|
|
101
|
+
delete this._pendingPhoneRequests[messageId];
|
|
102
|
+
this.statistics.phoneRequests++;
|
|
103
|
+
callback();
|
|
104
|
+
}, delay);
|
|
105
|
+
this.logger.debug(`Scheduled phone request for message ${messageId} with ${delay}ms delay`);
|
|
106
|
+
}
|
|
107
|
+
cancelPendingPhoneRequest(messageId) {
|
|
108
|
+
const timeout = this._pendingPhoneRequests[messageId];
|
|
109
|
+
if (timeout) {
|
|
110
|
+
clearTimeout(timeout);
|
|
111
|
+
delete this._pendingPhoneRequests[messageId];
|
|
112
|
+
this.logger.debug(`Cancelled pending phone request for message ${messageId}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
_keyToString(key) {
|
|
116
|
+
return `${key.to}:${key.id}`;
|
|
117
|
+
}
|
|
118
|
+
_cancelPendingPhoneRequest(messageId) {
|
|
119
|
+
const timeout = this._pendingPhoneRequests[messageId];
|
|
120
|
+
if (timeout) {
|
|
121
|
+
clearTimeout(timeout);
|
|
122
|
+
delete this._pendingPhoneRequests[messageId];
|
|
123
|
+
this.logger.debug(`Cancelled pending phone request for message ${messageId}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
exports.MessageRetryManager = MessageRetryManager;
|
|
@@ -60,7 +60,6 @@ const WAProto_1 = require("../../WAProto");
|
|
|
60
60
|
const Defaults_1 = require("../Defaults");
|
|
61
61
|
const WABinary_1 = require("../WABinary");
|
|
62
62
|
const crypto_1 = require("./crypto");
|
|
63
|
-
const streamToBuffer = require("./streamToBuffer")
|
|
64
63
|
const generics_1 = require("./generics");
|
|
65
64
|
const getTmpFilesDirectory = () => (0, os_1.tmpdir)();
|
|
66
65
|
const getImageProcessingLibrary = async () => {
|
|
@@ -365,59 +364,43 @@ async function getAudioDuration(buffer) {
|
|
|
365
364
|
metadata = await musicMetadata.parseStream(buffer, undefined, options);
|
|
366
365
|
}
|
|
367
366
|
return metadata.format.duration;
|
|
368
|
-
}
|
|
369
|
-
const toBuffer = async (stream) => {
|
|
370
|
-
const chunks = [];
|
|
371
|
-
for await (const chunk of stream) {
|
|
372
|
-
chunks.push(chunk);
|
|
373
|
-
}
|
|
374
|
-
stream.destroy();
|
|
375
|
-
return Buffer.concat(chunks);
|
|
376
|
-
};
|
|
377
|
-
exports.toBuffer = toBuffer;
|
|
378
|
-
|
|
367
|
+
}
|
|
379
368
|
async function getAudioWaveform(buffer, logger) {
|
|
380
369
|
try {
|
|
381
|
-
const { default: decoder } = await eval('import(
|
|
382
|
-
let audioData
|
|
383
|
-
|
|
370
|
+
const { default: decoder } = await eval('import(\'audio-decode\')');
|
|
371
|
+
let audioData;
|
|
384
372
|
if (Buffer.isBuffer(buffer)) {
|
|
385
|
-
audioData = buffer
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
373
|
+
audioData = buffer;
|
|
374
|
+
}
|
|
375
|
+
else if (typeof buffer === 'string') {
|
|
376
|
+
const rStream = (0, fs_1.createReadStream)(buffer);
|
|
377
|
+
audioData = await (0, exports.toBuffer)(rStream);
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
audioData = await (0, exports.toBuffer)(buffer);
|
|
391
381
|
}
|
|
392
|
-
|
|
393
|
-
const
|
|
394
|
-
const
|
|
395
|
-
const
|
|
396
|
-
const
|
|
397
|
-
const filteredData = []
|
|
398
|
-
|
|
399
|
-
// === Versi TS style: ambil RATA-RATA amplitudo biar halus ===
|
|
382
|
+
const audioBuffer = await decoder(audioData);
|
|
383
|
+
const rawData = audioBuffer.getChannelData(0);
|
|
384
|
+
const samples = 64;
|
|
385
|
+
const blockSize = Math.floor(rawData.length / samples);
|
|
386
|
+
const filteredData = [];
|
|
400
387
|
for (let i = 0; i < samples; i++) {
|
|
401
|
-
|
|
402
|
-
|
|
388
|
+
const blockStart = blockSize * i;
|
|
389
|
+
let sum = 0;
|
|
403
390
|
for (let j = 0; j < blockSize; j++) {
|
|
404
|
-
sum
|
|
391
|
+
sum = sum + Math.abs(rawData[blockStart + j]);
|
|
405
392
|
}
|
|
406
|
-
filteredData.push(sum / blockSize)
|
|
393
|
+
filteredData.push(sum / blockSize);
|
|
407
394
|
}
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
const
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
} catch (e) {
|
|
416
|
-
logger?.debug?.('⚠️ Failed to generate waveform: ' + e)
|
|
417
|
-
return new Uint8Array(64).fill(0)
|
|
395
|
+
const multiplier = Math.pow(Math.max(...filteredData), -1);
|
|
396
|
+
const normalizedData = filteredData.map((n) => n * multiplier);
|
|
397
|
+
const waveform = new Uint8Array(normalizedData.map((n) => Math.floor(100 * n)));
|
|
398
|
+
return waveform;
|
|
399
|
+
}
|
|
400
|
+
catch (e) {
|
|
401
|
+
logger === null || logger === void 0 ? void 0 : logger.debug('Failed to generate waveform: ' + e);
|
|
418
402
|
}
|
|
419
403
|
}
|
|
420
|
-
|
|
421
404
|
const toReadable = (buffer) => {
|
|
422
405
|
const readable = new stream_1.Readable({ read: () => { } });
|
|
423
406
|
readable.push(buffer);
|
|
@@ -425,6 +408,15 @@ const toReadable = (buffer) => {
|
|
|
425
408
|
return readable;
|
|
426
409
|
};
|
|
427
410
|
exports.toReadable = toReadable;
|
|
411
|
+
const toBuffer = async (stream) => {
|
|
412
|
+
const chunks = [];
|
|
413
|
+
for await (const chunk of stream) {
|
|
414
|
+
chunks.push(chunk);
|
|
415
|
+
}
|
|
416
|
+
stream.destroy();
|
|
417
|
+
return Buffer.concat(chunks);
|
|
418
|
+
};
|
|
419
|
+
exports.toBuffer = toBuffer;
|
|
428
420
|
const getStream = async (item, opts) => {
|
|
429
421
|
if (Buffer.isBuffer(item)) {
|
|
430
422
|
return { stream: (0, exports.toReadable)(item), type: 'buffer' };
|
|
@@ -884,4 +876,4 @@ const MEDIA_RETRY_STATUS_MAP = {
|
|
|
884
876
|
};
|
|
885
877
|
function __importStar(arg0) {
|
|
886
878
|
throw new Error('Function not implemented.');
|
|
887
|
-
}
|
|
879
|
+
}
|
package/lib/Utils/messages.js
CHANGED
|
@@ -1028,3 +1028,22 @@ const assertMediaContent = (content) => {
|
|
|
1028
1028
|
return mediaContent;
|
|
1029
1029
|
};
|
|
1030
1030
|
exports.assertMediaContent = assertMediaContent;
|
|
1031
|
+
|
|
1032
|
+
const toJid = (id) => {
|
|
1033
|
+
if (!id)
|
|
1034
|
+
return '';
|
|
1035
|
+
if (id.endsWith('@lid'))
|
|
1036
|
+
return id.replace('@lid', '@s.whatsapp.net');
|
|
1037
|
+
if (id.includes('@'))
|
|
1038
|
+
return id;
|
|
1039
|
+
return `${id}@s.whatsapp.net`;
|
|
1040
|
+
};
|
|
1041
|
+
exports.toJid = toJid;
|
|
1042
|
+
const getSenderLid = (message) => {
|
|
1043
|
+
const sender = message.key.participant || message.key.remoteJid;
|
|
1044
|
+
const user = (0, WABinary_1.jidDecode)(sender)?.user || '';
|
|
1045
|
+
const lid = (0, WABinary_1.jidEncode)(user, 'lid');
|
|
1046
|
+
console.log('sender lid:', lid);
|
|
1047
|
+
return { jid: sender, lid };
|
|
1048
|
+
};
|
|
1049
|
+
exports.getSenderLid = getSenderLid;
|
|
@@ -130,6 +130,25 @@ const processMessage = async (message, { shouldProcessHistoryMsg, placeholderRes
|
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
132
|
const content = (0, messages_1.normalizeMessageContent)(message.message);
|
|
133
|
+
const senderId = message.key.participant || message.key.remoteJid;
|
|
134
|
+
if ((0, WABinary_1.isLidUser)(senderId)) {
|
|
135
|
+
const jid = (0, WABinary_1.lidToJid)(senderId);
|
|
136
|
+
if (message.key.participant) {
|
|
137
|
+
message.key.participant = jid;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
message.key.remoteJid = jid;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const mJids = content && content.contextInfo && content.contextInfo.mentionedJid ? content.contextInfo.mentionedJid : [];
|
|
144
|
+
for (let i = 0; i < mJids.length; i++) {
|
|
145
|
+
if ((0, WABinary_1.isLidUser)(mJids[i])) {
|
|
146
|
+
mJids[i] = (0, WABinary_1.lidToJid)(mJids[i]);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (content && content.contextInfo && content.contextInfo.participant && (0, WABinary_1.isLidUser)(content.contextInfo.participant)) {
|
|
150
|
+
content.contextInfo.participant = (0, WABinary_1.lidToJid)(content.contextInfo.participant);
|
|
151
|
+
}
|
|
133
152
|
// unarchive chat if it's a real message, or someone reacted to our message
|
|
134
153
|
// and we've the unarchive chats setting on
|
|
135
154
|
if ((isRealMsg || ((_b = (_a = content === null || content === void 0 ? void 0 : content.reactionMessage) === null || _a === void 0 ? void 0 : _a.key) === null || _b === void 0 ? void 0 : _b.fromMe))
|
|
@@ -8,7 +8,7 @@ const WAProto_1 = require("../../WAProto");
|
|
|
8
8
|
const auth_utils_1 = require("./auth-utils");
|
|
9
9
|
const generics_1 = require("./generics");
|
|
10
10
|
// We need to lock files due to the fact that we are using async functions to read and write files
|
|
11
|
-
// https://github.com/WhiskeySockets/
|
|
11
|
+
// https://github.com/WhiskeySockets/Wileys/issues/794
|
|
12
12
|
// https://github.com/nodejs/node/issues/26338
|
|
13
13
|
// Use a Map to store mutexes for each file path
|
|
14
14
|
const fileLocks = new Map();
|
|
@@ -9,6 +9,7 @@ const WABinary_1 = require("../WABinary");
|
|
|
9
9
|
const crypto_2 = require("./crypto");
|
|
10
10
|
const generics_1 = require("./generics");
|
|
11
11
|
const signal_1 = require("./signal");
|
|
12
|
+
|
|
12
13
|
const getUserAgent = (config) => {
|
|
13
14
|
return {
|
|
14
15
|
appVersion: {
|
|
@@ -22,20 +23,25 @@ const getUserAgent = (config) => {
|
|
|
22
23
|
device: 'Desktop',
|
|
23
24
|
osBuildNumber: '0.1',
|
|
24
25
|
localeLanguageIso6391: 'en',
|
|
25
|
-
|
|
26
|
+
mnc: '000',
|
|
27
|
+
mcc: '000',
|
|
28
|
+
localeCountryIso31661Alpha2: config.countryCode || 'US'
|
|
26
29
|
};
|
|
27
30
|
};
|
|
31
|
+
|
|
28
32
|
const PLATFORM_MAP = {
|
|
29
33
|
'Mac OS': WAProto_1.proto.ClientPayload.WebInfo.WebSubPlatform.DARWIN,
|
|
30
34
|
'Windows': WAProto_1.proto.ClientPayload.WebInfo.WebSubPlatform.WIN32
|
|
31
35
|
};
|
|
36
|
+
|
|
32
37
|
const getWebInfo = (config) => {
|
|
33
38
|
let webSubPlatform = WAProto_1.proto.ClientPayload.WebInfo.WebSubPlatform.WEB_BROWSER;
|
|
34
|
-
if (config.syncFullHistory && PLATFORM_MAP[config.browser[0]]) {
|
|
39
|
+
if (config.syncFullHistory && PLATFORM_MAP[config.browser[0]] && config.browser[1] === 'Desktop') {
|
|
35
40
|
webSubPlatform = PLATFORM_MAP[config.browser[0]];
|
|
36
41
|
}
|
|
37
42
|
return { webSubPlatform };
|
|
38
43
|
};
|
|
44
|
+
|
|
39
45
|
const getClientPayload = (config) => {
|
|
40
46
|
const payload = {
|
|
41
47
|
connectType: WAProto_1.proto.ClientPayload.ConnectType.WIFI_UNKNOWN,
|
|
@@ -45,34 +51,61 @@ const getClientPayload = (config) => {
|
|
|
45
51
|
payload.webInfo = getWebInfo(config);
|
|
46
52
|
return payload;
|
|
47
53
|
};
|
|
54
|
+
|
|
48
55
|
const generateLoginNode = (userJid, config) => {
|
|
49
56
|
const { user, device } = (0, WABinary_1.jidDecode)(userJid);
|
|
50
57
|
const payload = {
|
|
51
58
|
...getClientPayload(config),
|
|
52
|
-
passive:
|
|
59
|
+
passive: true,
|
|
53
60
|
pull: true,
|
|
54
61
|
username: +user,
|
|
55
62
|
device: device,
|
|
63
|
+
lidDbMigrated: false
|
|
56
64
|
};
|
|
57
65
|
return WAProto_1.proto.ClientPayload.fromObject(payload);
|
|
58
66
|
};
|
|
59
67
|
exports.generateLoginNode = generateLoginNode;
|
|
68
|
+
|
|
60
69
|
const getPlatformType = (platform) => {
|
|
61
70
|
const platformType = platform.toUpperCase();
|
|
62
|
-
return WAProto_1.proto.DeviceProps.PlatformType[platformType] || WAProto_1.proto.DeviceProps.PlatformType.
|
|
71
|
+
return WAProto_1.proto.DeviceProps.PlatformType[platformType] || WAProto_1.proto.DeviceProps.PlatformType.CHROME;
|
|
63
72
|
};
|
|
73
|
+
|
|
64
74
|
const generateRegistrationNode = ({ registrationId, signedPreKey, signedIdentityKey }, config) => {
|
|
65
|
-
// the app version needs to be md5 hashed
|
|
66
|
-
// and passed in
|
|
67
75
|
const appVersionBuf = (0, crypto_1.createHash)('md5')
|
|
68
|
-
.update(config.version.join('.'))
|
|
76
|
+
.update(config.version.join('.'))
|
|
69
77
|
.digest();
|
|
78
|
+
|
|
70
79
|
const companion = {
|
|
71
80
|
os: config.browser[0],
|
|
72
81
|
platformType: getPlatformType(config.browser[1]),
|
|
73
82
|
requireFullSync: config.syncFullHistory,
|
|
83
|
+
historySyncConfig: {
|
|
84
|
+
storageQuotaMb: 10240,
|
|
85
|
+
inlineInitialPayloadInE2EeMsg: true,
|
|
86
|
+
recentSyncDaysLimit: undefined,
|
|
87
|
+
supportCallLogHistory: false,
|
|
88
|
+
supportBotUserAgentChatHistory: true,
|
|
89
|
+
supportCagReactionsAndPolls: true,
|
|
90
|
+
supportBizHostedMsg: true,
|
|
91
|
+
supportRecentSyncChunkMessageCountTuning: true,
|
|
92
|
+
supportHostedGroupMsg: true,
|
|
93
|
+
supportFbidBotChatHistory: true,
|
|
94
|
+
supportAddOnHistorySyncMigration: undefined,
|
|
95
|
+
supportMessageAssociation: true,
|
|
96
|
+
supportGroupHistory: false,
|
|
97
|
+
onDemandReady: undefined,
|
|
98
|
+
supportGuestChat: undefined
|
|
99
|
+
},
|
|
100
|
+
version: {
|
|
101
|
+
primary: 10,
|
|
102
|
+
secondary: 15,
|
|
103
|
+
tertiary: 7
|
|
104
|
+
}
|
|
74
105
|
};
|
|
106
|
+
|
|
75
107
|
const companionProto = WAProto_1.proto.DeviceProps.encode(companion).finish();
|
|
108
|
+
|
|
76
109
|
const registerPayload = {
|
|
77
110
|
...getClientPayload(config),
|
|
78
111
|
passive: false,
|
|
@@ -91,6 +124,7 @@ const generateRegistrationNode = ({ registrationId, signedPreKey, signedIdentity
|
|
|
91
124
|
return WAProto_1.proto.ClientPayload.fromObject(registerPayload);
|
|
92
125
|
};
|
|
93
126
|
exports.generateRegistrationNode = generateRegistrationNode;
|
|
127
|
+
|
|
94
128
|
const configureSuccessfulPairing = (stanza, { advSecretKey, signedIdentityKey, signalIdentities }) => {
|
|
95
129
|
const msgId = stanza.attrs.id;
|
|
96
130
|
const pairSuccessNode = (0, WABinary_1.getBinaryNodeChild)(stanza, 'pair-success');
|
|
@@ -98,30 +132,52 @@ const configureSuccessfulPairing = (stanza, { advSecretKey, signedIdentityKey, s
|
|
|
98
132
|
const platformNode = (0, WABinary_1.getBinaryNodeChild)(pairSuccessNode, 'platform');
|
|
99
133
|
const deviceNode = (0, WABinary_1.getBinaryNodeChild)(pairSuccessNode, 'device');
|
|
100
134
|
const businessNode = (0, WABinary_1.getBinaryNodeChild)(pairSuccessNode, 'biz');
|
|
135
|
+
|
|
101
136
|
if (!deviceIdentityNode || !deviceNode) {
|
|
102
137
|
throw new boom_1.Boom('Missing device-identity or device in pair success node', { data: stanza });
|
|
103
138
|
}
|
|
104
|
-
|
|
139
|
+
|
|
140
|
+
const bizName = businessNode?.attrs.name;
|
|
105
141
|
const jid = deviceNode.attrs.jid;
|
|
142
|
+
const lid = deviceNode.attrs.lid;
|
|
143
|
+
|
|
106
144
|
const { details, hmac, accountType } = WAProto_1.proto.ADVSignedDeviceIdentityHMAC.decode(deviceIdentityNode.content);
|
|
107
|
-
|
|
108
|
-
|
|
145
|
+
|
|
146
|
+
let hmacPrefix = Buffer.from([]);
|
|
147
|
+
if (accountType !== undefined && accountType === WAProto_1.proto.ADVEncryptionType.HOSTED) {
|
|
148
|
+
hmacPrefix = Buffer.from([0x06, 0x05]);
|
|
149
|
+
}
|
|
150
|
+
|
|
109
151
|
const advSign = (0, crypto_2.hmacSign)(Buffer.concat([hmacPrefix, details]), Buffer.from(advSecretKey, 'base64'));
|
|
110
152
|
if (Buffer.compare(hmac, advSign) !== 0) {
|
|
111
153
|
throw new boom_1.Boom('Invalid account signature');
|
|
112
154
|
}
|
|
155
|
+
|
|
113
156
|
const account = WAProto_1.proto.ADVSignedDeviceIdentity.decode(details);
|
|
114
157
|
const { accountSignatureKey, accountSignature, details: deviceDetails } = account;
|
|
115
|
-
|
|
158
|
+
|
|
159
|
+
const deviceIdentity = WAProto_1.proto.ADVDeviceIdentity.decode(deviceDetails);
|
|
160
|
+
|
|
161
|
+
const accountSignaturePrefix = deviceIdentity.deviceType === WAProto_1.proto.ADVEncryptionType.HOSTED
|
|
162
|
+
? Buffer.from([0x06, 0x05])
|
|
163
|
+
: Buffer.from([0x06, 0x00]);
|
|
164
|
+
const accountMsg = Buffer.concat([accountSignaturePrefix, deviceDetails, signedIdentityKey.public]);
|
|
165
|
+
|
|
116
166
|
if (!crypto_2.Curve.verify(accountSignatureKey, accountMsg, accountSignature)) {
|
|
117
167
|
throw new boom_1.Boom('Failed to verify account signature');
|
|
118
168
|
}
|
|
119
|
-
|
|
120
|
-
const deviceMsg = Buffer.concat([
|
|
169
|
+
|
|
170
|
+
const deviceMsg = Buffer.concat([
|
|
171
|
+
Buffer.from([0x06, 0x01]),
|
|
172
|
+
deviceDetails,
|
|
173
|
+
signedIdentityKey.public,
|
|
174
|
+
accountSignatureKey
|
|
175
|
+
]);
|
|
121
176
|
account.deviceSignature = crypto_2.Curve.sign(signedIdentityKey.private, deviceMsg);
|
|
177
|
+
|
|
122
178
|
const identity = (0, signal_1.createSignalIdentity)(jid, accountSignatureKey);
|
|
123
179
|
const accountEnc = (0, exports.encodeSignedDeviceIdentity)(account, false);
|
|
124
|
-
|
|
180
|
+
|
|
125
181
|
const reply = {
|
|
126
182
|
tag: 'iq',
|
|
127
183
|
attrs: {
|
|
@@ -143,31 +199,31 @@ const configureSuccessfulPairing = (stanza, { advSecretKey, signedIdentityKey, s
|
|
|
143
199
|
}
|
|
144
200
|
]
|
|
145
201
|
};
|
|
202
|
+
|
|
146
203
|
const authUpdate = {
|
|
147
204
|
account,
|
|
148
|
-
me: { id: jid, name: bizName },
|
|
205
|
+
me: { id: jid, name: bizName, lid },
|
|
149
206
|
signalIdentities: [
|
|
150
207
|
...(signalIdentities || []),
|
|
151
208
|
identity
|
|
152
209
|
],
|
|
153
|
-
platform: platformNode
|
|
210
|
+
platform: platformNode?.attrs.name
|
|
154
211
|
};
|
|
212
|
+
|
|
155
213
|
return {
|
|
156
214
|
creds: authUpdate,
|
|
157
215
|
reply
|
|
158
216
|
};
|
|
159
217
|
};
|
|
160
218
|
exports.configureSuccessfulPairing = configureSuccessfulPairing;
|
|
219
|
+
|
|
161
220
|
const encodeSignedDeviceIdentity = (account, includeSignatureKey) => {
|
|
162
|
-
var _a;
|
|
163
221
|
account = { ...account };
|
|
164
|
-
|
|
165
|
-
// or if we are including the signature key but it is empty
|
|
166
|
-
if (!includeSignatureKey || !((_a = account.accountSignatureKey) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
222
|
+
if (!includeSignatureKey || !account.accountSignatureKey?.length) {
|
|
167
223
|
account.accountSignatureKey = null;
|
|
168
224
|
}
|
|
169
225
|
return WAProto_1.proto.ADVSignedDeviceIdentity
|
|
170
226
|
.encode(account)
|
|
171
227
|
.finish();
|
|
172
228
|
};
|
|
173
|
-
exports.encodeSignedDeviceIdentity = encodeSignedDeviceIdentity;
|
|
229
|
+
exports.encodeSignedDeviceIdentity = encodeSignedDeviceIdentity;
|
|
@@ -11,7 +11,7 @@ const readline_1 = require("readline");
|
|
|
11
11
|
const generics_1 = require("./generics");
|
|
12
12
|
const make_mutex_1 = require("./make-mutex");
|
|
13
13
|
/**
|
|
14
|
-
* Captures events from a
|
|
14
|
+
* Captures events from a wileys event emitter & stores them in a file
|
|
15
15
|
* @param ev The event emitter to read events from
|
|
16
16
|
* @param filename File to save to
|
|
17
17
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getBotJid = exports.jidNormalizedUser = exports.isJidBot = exports.isJidStatusBroadcast = exports.isJidGroup = exports.isJidNewsletter = exports.isJidBroadcast = exports.isLidUser = exports.isJidUser = exports.isJidMetaAi = exports.areJidsSameUser = exports.jidDecode = exports.jidEncode = exports.META_AI_JID = exports.STORIES_JID = exports.PSA_WID = exports.SERVER_JID = exports.OFFICIAL_BIZ_JID = exports.S_WHATSAPP_NET = void 0;
|
|
3
|
+
exports.lidToJid = exports.getBotJid = exports.jidNormalizedUser = exports.isJidBot = exports.isJidStatusBroadcast = exports.isJidGroup = exports.isJidNewsletter = exports.isJidBroadcast = exports.isLidUser = exports.isJidUser = exports.isJidMetaAi = exports.areJidsSameUser = exports.jidDecode = exports.jidEncode = exports.META_AI_JID = exports.STORIES_JID = exports.PSA_WID = exports.SERVER_JID = exports.OFFICIAL_BIZ_JID = exports.S_WHATSAPP_NET = void 0;
|
|
4
4
|
exports.S_WHATSAPP_NET = '@s.whatsapp.net';
|
|
5
5
|
exports.OFFICIAL_BIZ_JID = '16505361212@c.us';
|
|
6
6
|
exports.SERVER_JID = 'server@c.us';
|
|
@@ -67,6 +67,8 @@ const jidNormalizedUser = (jid) => {
|
|
|
67
67
|
return (0, exports.jidEncode)(user, server === 'c.us' ? 's.whatsapp.net' : server);
|
|
68
68
|
};
|
|
69
69
|
exports.jidNormalizedUser = jidNormalizedUser;
|
|
70
|
+
const lidToJid = jid => jid && jid.endsWith('@lid') ? jid.replace('@lid','@s.whatsapp.net') : jid;
|
|
71
|
+
exports.lidToJid = lidToJid;
|
|
70
72
|
const getBotJid = (jid) => {
|
|
71
73
|
const BOT_MAP = new Map([["867051314767696", "13135550002"], ["1061492271844689", "13135550005"], ["245886058483988", "13135550009"], ["3509905702656130", "13135550012"], ["1059680132034576", "13135550013"], ["715681030623646", "13135550014"], ["1644971366323052", "13135550015"], ["582497970646566", "13135550019"], ["645459357769306", "13135550022"], ["294997126699143", "13135550023"], ["1522631578502677", "13135550027"], ["719421926276396", "13135550030"], ["1788488635002167", "13135550031"], ["24232338603080193", "13135550033"], ["689289903143209", "13135550035"], ["871626054177096", "13135550039"], ["362351902849370", "13135550042"], ["1744617646041527", "13135550043"], ["893887762270570", "13135550046"], ["1155032702135830", "13135550047"], ["333931965993883", "13135550048"], ["853748013058752", "13135550049"], ["1559068611564819", "13135550053"], ["890487432705716", "13135550054"], ["240254602395494", "13135550055"], ["1578420349663261", "13135550062"], ["322908887140421", "13135550065"], ["3713961535514771", "13135550067"], ["997884654811738", "13135550070"], ["403157239387035", "13135550081"], ["535242369074963", "13135550082"], ["946293427247659", "13135550083"], ["3664707673802291", "13135550084"], ["1821827464894892", "13135550085"], ["1760312477828757", "13135550086"], ["439480398712216", "13135550087"], ["1876735582800984", "13135550088"], ["984025089825661", "13135550089"], ["1001336351558186", "13135550090"], ["3739346336347061", "13135550091"], ["3632749426974980", "13135550092"], ["427864203481615", "13135550093"], ["1434734570493055", "13135550094"], ["992873449225921", "13135550095"], ["813087747426445", "13135550096"], ["806369104931434", "13135550098"], ["1220982902403148", "13135550099"], ["1365893374104393", "13135550100"], ["686482033622048", "13135550200"], ["1454999838411253", "13135550201"], ["718584497008509", "13135550202"], ["743520384213443", "13135550301"], ["1147715789823789", "13135550302"], ["1173034540372201", "13135550303"], ["974785541030953", "13135550304"], ["1122200255531507", "13135550305"], ["899669714813162", "13135550306"], ["631880108970650", "13135550307"], ["435816149330026", "13135550308"], ["1368717161184556", "13135550309"], ["7849963461784891", "13135550310"], ["3609617065968984", "13135550312"], ["356273980574602", "13135550313"], ["1043447920539760", "13135550314"], ["1052764336525346", "13135550315"], ["2631118843732685", "13135550316"], ["510505411332176", "13135550317"], ["1945664239227513", "13135550318"], ["1518594378764656", "13135550319"], ["1378821579456138", "13135550320"], ["490214716896013", "13135550321"], ["1028577858870699", "13135550322"], ["308915665545959", "13135550323"], ["845884253678900", "13135550324"], ["995031308616442", "13135550325"], ["2787365464763437", "13135550326"], ["1532790990671645", "13135550327"], ["302617036180485", "13135550328"], ["723376723197227", "13135550329"], ["8393570407377966", "13135550330"], ["1931159970680725", "13135550331"], ["401073885688605", "13135550332"], ["2234478453565422", "13135550334"], ["814748673882312", "13135550335"], ["26133635056281592", "13135550336"], ["1439804456676119", "13135550337"], ["889851503172161", "13135550338"], ["1018283232836879", "13135550339"], ["1012781386779537", "13135559000"], ["823280953239532", "13135559001"], ["1597090934573334", "13135559002"], ["485965054020343", "13135559003"], ["1033381648363446", "13135559004"], ["491802010206446", "13135559005"], ["1017139033184870", "13135559006"], ["499638325922174", "13135559008"], ["468946335863664", "13135559009"], ["1570389776875816", "13135559010"], ["1004342694328995", "13135559011"], ["1012240323971229", "13135559012"], ["392171787222419", "13135559013"], ["952081212945019", "13135559016"], ["444507875070178", "13135559017"], ["1274819440594668", "13135559018"], ["1397041101147050", "13135559019"], ["425657699872640", "13135559020"], ["532292852562549", "13135559021"], ["705863241720292", "13135559022"], ["476449815183959", "13135559023"], ["488071553854222", "13135559024"], ["468693832665397", "13135559025"], ["517422564037340", "13135559026"], ["819805466613825", "13135559027"], ["1847708235641382", "13135559028"], ["716282970644228", "13135559029"], ["521655380527741", "13135559030"], ["476193631941905", "13135559031"], ["485600497445562", "13135559032"], ["440217235683910", "13135559033"], ["523342446758478", "13135559034"], ["514784864360240", "13135559035"], ["505790121814530", "13135559036"], ["420008964419580", "13135559037"], ["492141680204555", "13135559038"], ["388462787271952", "13135559039"], ["423473920752072", "13135559040"], ["489574180468229", "13135559041"], ["432360635854105", "13135559042"], ["477878201669248", "13135559043"], ["351656951234045", "13135559044"], ["430178036732582", "13135559045"], ["434537312944552", "13135559046"], ["1240614300631808", "13135559047"], ["473135945605128", "13135559048"], ["423669800729310", "13135559049"], ["3685666705015792", "13135559050"], ["504196509016638", "13135559051"], ["346844785189449", "13135559052"], ["504823088911074", "13135559053"], ["402669415797083", "13135559054"], ["490939640234431", "13135559055"], ["875124128063715", "13135559056"], ["468788962654605", "13135559057"], ["562386196354570", "13135559058"], ["372159285928791", "13135559059"], ["531017479591050", "13135559060"], ["1328873881401826", "13135559061"], ["1608363646390484", "13135559062"], ["1229628561554232", "13135559063"], ["348802211530364", "13135559064"], ["3708535859420184", "13135559065"], ["415517767742187", "13135559066"], ["479330341612638", "13135559067"], ["480785414723083", "13135559068"], ["387299107507991", "13135559069"], ["333389813188944", "13135559070"], ["391794130316996", "13135559071"], ["457893470576314", "13135559072"], ["435550496166469", "13135559073"], ["1620162702100689", "13135559074"], ["867491058616043", "13135559075"], ["816224117357759", "13135559076"], ["334065176362830", "13135559077"], ["489973170554709", "13135559078"], ["473060669049665", "13135559079"], ["1221505815643060", "13135559080"], ["889000703096359", "13135559081"], ["475235961979883", "13135559082"], ["3434445653519934", "13135559084"], ["524503026827421", "13135559085"], ["1179639046403856", "13135559086"], ["471563305859144", "13135559087"], ["533896609192881", "13135559088"], ["365443583168041", "13135559089"], ["836082305329393", "13135559090"], ["1056787705969916", "13135559091"], ["503312598958357", "13135559092"], ["3718606738453460", "13135559093"], ["826066052850902", "13135559094"], ["1033611345091888", "13135559095"], ["3868390816783240", "13135559096"], ["7462677740498860", "13135559097"], ["436288576108573", "13135559098"], ["1047559746718900", "13135559099"], ["1099299455255491", "13135559100"], ["1202037301040633", "13135559101"], ["1720619402074074", "13135559102"], ["1030422235101467", "13135559103"], ["827238979523502", "13135559104"], ["1516443722284921", "13135559105"], ["1174442747196709", "13135559106"], ["1653165225503842", "13135559107"], ["1037648777635013", "13135559108"], ["551617757299900", "13135559109"], ["1158813558718726", "13135559110"], ["2463236450542262", "13135559111"], ["1550393252501466", "13135559112"], ["2057065188042796", "13135559113"], ["506163028760735", "13135559114"], ["2065249100538481", "13135559115"], ["1041382867195858", "13135559116"], ["886500209499603", "13135559117"], ["1491615624892655", "13135559118"], ["486563697299617", "13135559119"], ["1175736513679463", "13135559120"], ["491811473512352", "13165550064"]]);
|
|
72
74
|
const sepIdx = typeof jid === 'string' ? jid.indexOf('@') : -1;
|
package/lib/index.js
CHANGED
|
@@ -3,30 +3,24 @@
|
|
|
3
3
|
const chalk = require("chalk");
|
|
4
4
|
const gradient = require("gradient-string");
|
|
5
5
|
|
|
6
|
-
console.clear();
|
|
7
6
|
console.log();
|
|
8
|
-
|
|
9
|
-
|
|
10
7
|
console.log(
|
|
11
|
-
chalk.bold.
|
|
12
|
-
chalk.bold.hex("#7EC9FF")("WhatsApp Baileys Mod")
|
|
8
|
+
chalk.bold.blue('Xhypher') + chalk.bold.green('baileys')
|
|
13
9
|
);
|
|
14
10
|
|
|
15
|
-
|
|
16
|
-
console.log(
|
|
17
|
-
gradient(["#7EC9FF", "#D3B7FF"])("═════════════")
|
|
18
|
-
);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
console.log(
|
|
22
|
-
gradient(["#D3B7FF", "#A8C7FF"])("• Powered By xhyphertech")
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
|
|
11
|
+
console.log();
|
|
26
12
|
console.log(
|
|
27
|
-
|
|
13
|
+
chalk.bold(
|
|
14
|
+
gradient(['magenta', 'cyan'])('> █╗ ██╗██╗ ██╗██╗ ██╗██████╗ ███████╗██████╗
|
|
15
|
+
██║ ██╔╝██║ ██║██║ ██║██╔══██╗██╔════╝██╔══██╗
|
|
16
|
+
█████╔╝ ███████║███████║██████╔╝█████╗ ██████╔╝
|
|
17
|
+
██╔═██╗ ██╔══██║██╔══██║██╔══██╗██╔══╝ ██╔══██╗
|
|
18
|
+
██║ ██╗██║ ██║██║ ██║██║ ██║███████╗██║ ██║
|
|
19
|
+
╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
|
|
20
|
+
|
|
21
|
+
X H Y P H E R T E C H <')
|
|
22
|
+
)
|
|
28
23
|
);
|
|
29
|
-
|
|
30
24
|
console.log();
|
|
31
25
|
|
|
32
26
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|