Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MR414N-ID
GitHub Repository: MR414N-ID/botku2
Path: blob/master/node_modules/@adiwajshing/baileys/lib/WABinary/decode.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
Object.defineProperty(exports, "__esModule", { value: true });
26
exports.decodeBinaryNode = exports.decodeDecompressedBinaryNode = exports.decompressingIfRequired = void 0;
27
const zlib_1 = require("zlib");
28
const constants = __importStar(require("./constants"));
29
const jid_utils_1 = require("./jid-utils");
30
const decompressingIfRequired = (buffer) => {
31
if (2 & buffer.readUInt8()) {
32
buffer = (0, zlib_1.inflateSync)(buffer.slice(1));
33
}
34
else { // nodes with no compression have a 0x00 prefix, we remove that
35
buffer = buffer.slice(1);
36
}
37
return buffer;
38
};
39
exports.decompressingIfRequired = decompressingIfRequired;
40
const decodeDecompressedBinaryNode = (buffer, opts, indexRef = { index: 0 }) => {
41
const { DOUBLE_BYTE_TOKENS, SINGLE_BYTE_TOKENS, TAGS } = opts;
42
const checkEOS = (length) => {
43
if (indexRef.index + length > buffer.length) {
44
throw new Error('end of stream');
45
}
46
};
47
const next = () => {
48
const value = buffer[indexRef.index];
49
indexRef.index += 1;
50
return value;
51
};
52
const readByte = () => {
53
checkEOS(1);
54
return next();
55
};
56
const readBytes = (n) => {
57
checkEOS(n);
58
const value = buffer.slice(indexRef.index, indexRef.index + n);
59
indexRef.index += n;
60
return value;
61
};
62
const readStringFromChars = (length) => {
63
return readBytes(length).toString('utf-8');
64
};
65
const readInt = (n, littleEndian = false) => {
66
checkEOS(n);
67
let val = 0;
68
for (let i = 0; i < n; i++) {
69
const shift = littleEndian ? i : n - 1 - i;
70
val |= next() << (shift * 8);
71
}
72
return val;
73
};
74
const readInt20 = () => {
75
checkEOS(3);
76
return ((next() & 15) << 16) + (next() << 8) + next();
77
};
78
const unpackHex = (value) => {
79
if (value >= 0 && value < 16) {
80
return value < 10 ? '0'.charCodeAt(0) + value : 'A'.charCodeAt(0) + value - 10;
81
}
82
throw new Error('invalid hex: ' + value);
83
};
84
const unpackNibble = (value) => {
85
if (value >= 0 && value <= 9) {
86
return '0'.charCodeAt(0) + value;
87
}
88
switch (value) {
89
case 10:
90
return '-'.charCodeAt(0);
91
case 11:
92
return '.'.charCodeAt(0);
93
case 15:
94
return '\0'.charCodeAt(0);
95
default:
96
throw new Error('invalid nibble: ' + value);
97
}
98
};
99
const unpackByte = (tag, value) => {
100
if (tag === TAGS.NIBBLE_8) {
101
return unpackNibble(value);
102
}
103
else if (tag === TAGS.HEX_8) {
104
return unpackHex(value);
105
}
106
else {
107
throw new Error('unknown tag: ' + tag);
108
}
109
};
110
const readPacked8 = (tag) => {
111
const startByte = readByte();
112
let value = '';
113
for (let i = 0; i < (startByte & 127); i++) {
114
const curByte = readByte();
115
value += String.fromCharCode(unpackByte(tag, (curByte & 0xf0) >> 4));
116
value += String.fromCharCode(unpackByte(tag, curByte & 0x0f));
117
}
118
if (startByte >> 7 !== 0) {
119
value = value.slice(0, -1);
120
}
121
return value;
122
};
123
const isListTag = (tag) => {
124
return tag === TAGS.LIST_EMPTY || tag === TAGS.LIST_8 || tag === TAGS.LIST_16;
125
};
126
const readListSize = (tag) => {
127
switch (tag) {
128
case TAGS.LIST_EMPTY:
129
return 0;
130
case TAGS.LIST_8:
131
return readByte();
132
case TAGS.LIST_16:
133
return readInt(2);
134
default:
135
throw new Error('invalid tag for list size: ' + tag);
136
}
137
};
138
const readJidPair = () => {
139
const i = readString(readByte());
140
const j = readString(readByte());
141
if (j) {
142
return (i || '') + '@' + j;
143
}
144
throw new Error('invalid jid pair: ' + i + ', ' + j);
145
};
146
const readAdJid = () => {
147
const agent = readByte();
148
const device = readByte();
149
const user = readString(readByte());
150
return (0, jid_utils_1.jidEncode)(user, 's.whatsapp.net', device, agent);
151
};
152
const readString = (tag) => {
153
if (tag >= 1 && tag < SINGLE_BYTE_TOKENS.length) {
154
return SINGLE_BYTE_TOKENS[tag] || '';
155
}
156
switch (tag) {
157
case TAGS.DICTIONARY_0:
158
case TAGS.DICTIONARY_1:
159
case TAGS.DICTIONARY_2:
160
case TAGS.DICTIONARY_3:
161
return getTokenDouble(tag - TAGS.DICTIONARY_0, readByte());
162
case TAGS.LIST_EMPTY:
163
return '';
164
case TAGS.BINARY_8:
165
return readStringFromChars(readByte());
166
case TAGS.BINARY_20:
167
return readStringFromChars(readInt20());
168
case TAGS.BINARY_32:
169
return readStringFromChars(readInt(4));
170
case TAGS.JID_PAIR:
171
return readJidPair();
172
case TAGS.AD_JID:
173
return readAdJid();
174
case TAGS.HEX_8:
175
case TAGS.NIBBLE_8:
176
return readPacked8(tag);
177
default:
178
throw new Error('invalid string with tag: ' + tag);
179
}
180
};
181
const readList = (tag) => {
182
const items = [];
183
const size = readListSize(tag);
184
for (let i = 0; i < size; i++) {
185
items.push((0, exports.decodeDecompressedBinaryNode)(buffer, opts, indexRef));
186
}
187
return items;
188
};
189
const getTokenDouble = (index1, index2) => {
190
const dict = DOUBLE_BYTE_TOKENS[index1];
191
if (!dict) {
192
throw new Error(`Invalid double token dict (${index1})`);
193
}
194
const value = dict[index2];
195
if (typeof value === 'undefined') {
196
throw new Error(`Invalid double token (${index2})`);
197
}
198
return value;
199
};
200
const listSize = readListSize(readByte());
201
const header = readString(readByte());
202
if (!listSize || !header.length) {
203
throw new Error('invalid node');
204
}
205
const attrs = {};
206
let data;
207
if (listSize === 0 || !header) {
208
throw new Error('invalid node');
209
}
210
// read the attributes in
211
const attributesLength = (listSize - 1) >> 1;
212
for (let i = 0; i < attributesLength; i++) {
213
const key = readString(readByte());
214
const value = readString(readByte());
215
attrs[key] = value;
216
}
217
if (listSize % 2 === 0) {
218
const tag = readByte();
219
if (isListTag(tag)) {
220
data = readList(tag);
221
}
222
else {
223
let decoded;
224
switch (tag) {
225
case TAGS.BINARY_8:
226
decoded = readBytes(readByte());
227
break;
228
case TAGS.BINARY_20:
229
decoded = readBytes(readInt20());
230
break;
231
case TAGS.BINARY_32:
232
decoded = readBytes(readInt(4));
233
break;
234
default:
235
decoded = readString(tag);
236
break;
237
}
238
data = decoded;
239
}
240
}
241
return {
242
tag: header,
243
attrs,
244
content: data
245
};
246
};
247
exports.decodeDecompressedBinaryNode = decodeDecompressedBinaryNode;
248
const decodeBinaryNode = (buff) => {
249
const decompBuff = (0, exports.decompressingIfRequired)(buff);
250
return (0, exports.decodeDecompressedBinaryNode)(decompBuff, constants);
251
};
252
exports.decodeBinaryNode = decodeBinaryNode;
253
254