teleproto 1.214.0
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/CryptoFile.d.ts +2 -0
- package/CryptoFile.js +37 -0
- package/Helpers.d.ts +150 -0
- package/Helpers.js +477 -0
- package/LICENSE +23 -0
- package/Password.d.ts +14 -0
- package/Password.js +270 -0
- package/README.md +98 -0
- package/Utils.d.ts +227 -0
- package/Utils.js +1247 -0
- package/Version.d.ts +1 -0
- package/Version.js +4 -0
- package/client/2fa.d.ts +48 -0
- package/client/2fa.js +108 -0
- package/client/TelegramClient.d.ts +1043 -0
- package/client/TelegramClient.js +1181 -0
- package/client/account.d.ts +0 -0
- package/client/account.js +1 -0
- package/client/auth.d.ts +92 -0
- package/client/auth.js +388 -0
- package/client/bots.d.ts +6 -0
- package/client/bots.js +23 -0
- package/client/buttons.d.ts +4 -0
- package/client/buttons.js +86 -0
- package/client/chats.d.ts +45 -0
- package/client/chats.js +350 -0
- package/client/dialogs.d.ts +52 -0
- package/client/dialogs.js +174 -0
- package/client/downloads.d.ts +156 -0
- package/client/downloads.js +614 -0
- package/client/fs.d.ts +1 -0
- package/client/fs.js +17 -0
- package/client/index.d.ts +15 -0
- package/client/index.js +64 -0
- package/client/messageParse.d.ts +17 -0
- package/client/messageParse.js +191 -0
- package/client/messages.d.ts +263 -0
- package/client/messages.js +813 -0
- package/client/os.d.ts +2 -0
- package/client/os.js +37 -0
- package/client/path.d.ts +2 -0
- package/client/path.js +7 -0
- package/client/telegramBaseClient.d.ts +237 -0
- package/client/telegramBaseClient.js +368 -0
- package/client/updates.d.ts +33 -0
- package/client/updates.js +260 -0
- package/client/uploads.d.ts +136 -0
- package/client/uploads.js +514 -0
- package/client/users.d.ts +29 -0
- package/client/users.js +490 -0
- package/crypto/AuthKey.d.ts +19 -0
- package/crypto/AuthKey.js +76 -0
- package/crypto/CTR.d.ts +5 -0
- package/crypto/CTR.js +16 -0
- package/crypto/Factorizator.d.ts +19 -0
- package/crypto/Factorizator.js +74 -0
- package/crypto/IGE.d.ts +11 -0
- package/crypto/IGE.js +115 -0
- package/crypto/RSA.d.ts +14 -0
- package/crypto/RSA.js +70 -0
- package/crypto/converters.d.ts +19 -0
- package/crypto/converters.js +52 -0
- package/crypto/crypto.d.ts +19 -0
- package/crypto/crypto.js +58 -0
- package/crypto/words.d.ts +6 -0
- package/crypto/words.js +47 -0
- package/define.d.ts +77 -0
- package/entityCache.d.ts +7 -0
- package/entityCache.js +79 -0
- package/errors/Common.d.ts +71 -0
- package/errors/Common.js +122 -0
- package/errors/RPCBaseErrors.d.ts +84 -0
- package/errors/RPCBaseErrors.js +134 -0
- package/errors/RPCErrorList.d.ts +37 -0
- package/errors/RPCErrorList.js +117 -0
- package/errors/index.d.ts +11 -0
- package/errors/index.js +32 -0
- package/events/Album.d.ts +36 -0
- package/events/Album.js +104 -0
- package/events/CallbackQuery.d.ts +73 -0
- package/events/CallbackQuery.js +193 -0
- package/events/DeletedMessage.d.ts +45 -0
- package/events/DeletedMessage.js +63 -0
- package/events/EditedMessage.d.ts +30 -0
- package/events/EditedMessage.js +41 -0
- package/events/NewMessage.d.ts +89 -0
- package/events/NewMessage.js +182 -0
- package/events/Raw.d.ts +29 -0
- package/events/Raw.js +43 -0
- package/events/common.d.ts +66 -0
- package/events/common.js +141 -0
- package/events/index.d.ts +2 -0
- package/events/index.js +8 -0
- package/extensions/AsyncQueue.d.ts +10 -0
- package/extensions/AsyncQueue.js +32 -0
- package/extensions/BinaryReader.d.ts +99 -0
- package/extensions/BinaryReader.js +242 -0
- package/extensions/BinaryWriter.d.ts +6 -0
- package/extensions/BinaryWriter.js +15 -0
- package/extensions/Deferred.d.ts +8 -0
- package/extensions/Deferred.js +16 -0
- package/extensions/Logger.d.ts +54 -0
- package/extensions/Logger.js +128 -0
- package/extensions/MessagePacker.d.ts +21 -0
- package/extensions/MessagePacker.js +154 -0
- package/extensions/PendingState.d.ts +12 -0
- package/extensions/PendingState.js +29 -0
- package/extensions/PromisedNetSockets.d.ts +24 -0
- package/extensions/PromisedNetSockets.js +192 -0
- package/extensions/PromisedWebSockets.d.ts +18 -0
- package/extensions/PromisedWebSockets.js +124 -0
- package/extensions/html.d.ts +5 -0
- package/extensions/html.js +228 -0
- package/extensions/index.d.ts +7 -0
- package/extensions/index.js +17 -0
- package/extensions/markdown.d.ts +5 -0
- package/extensions/markdown.js +76 -0
- package/extensions/markdownv2.d.ts +5 -0
- package/extensions/markdownv2.js +51 -0
- package/extensions/net.d.ts +1 -0
- package/extensions/net.js +17 -0
- package/extensions/socks.d.ts +1 -0
- package/extensions/socks.js +17 -0
- package/index.d.ts +14 -0
- package/index.js +62 -0
- package/inspect.d.ts +1 -0
- package/inspect.js +5 -0
- package/network/Authenticator.d.ts +12 -0
- package/network/Authenticator.js +192 -0
- package/network/MTProtoPlainSender.d.ts +19 -0
- package/network/MTProtoPlainSender.js +74 -0
- package/network/MTProtoSender.d.ts +290 -0
- package/network/MTProtoSender.js +873 -0
- package/network/MTProtoState.d.ts +102 -0
- package/network/MTProtoState.js +267 -0
- package/network/RequestState.d.ts +18 -0
- package/network/RequestState.js +35 -0
- package/network/connection/Connection.d.ts +69 -0
- package/network/connection/Connection.js +162 -0
- package/network/connection/TCPAbridged.d.ts +19 -0
- package/network/connection/TCPAbridged.js +58 -0
- package/network/connection/TCPFull.d.ts +16 -0
- package/network/connection/TCPFull.js +61 -0
- package/network/connection/TCPMTProxy.d.ts +49 -0
- package/network/connection/TCPMTProxy.js +121 -0
- package/network/connection/TCPObfuscated.d.ts +18 -0
- package/network/connection/TCPObfuscated.js +78 -0
- package/network/connection/index.d.ts +4 -0
- package/network/connection/index.js +11 -0
- package/network/index.d.ts +11 -0
- package/network/index.js +23 -0
- package/package.json +50 -0
- package/requestIter.d.ts +24 -0
- package/requestIter.js +109 -0
- package/sessions/Abstract.d.ts +103 -0
- package/sessions/Abstract.js +6 -0
- package/sessions/Memory.d.ts +38 -0
- package/sessions/Memory.js +272 -0
- package/sessions/StoreSession.d.ts +14 -0
- package/sessions/StoreSession.js +77 -0
- package/sessions/StringSession.d.ts +32 -0
- package/sessions/StringSession.js +116 -0
- package/sessions/index.d.ts +4 -0
- package/sessions/index.js +11 -0
- package/sessions/localStorage.d.ts +1 -0
- package/sessions/localStorage.js +4 -0
- package/tl/AllTLObjects.d.ts +3 -0
- package/tl/AllTLObjects.js +17 -0
- package/tl/MTProtoRequest.d.ts +18 -0
- package/tl/MTProtoRequest.js +38 -0
- package/tl/api.d.ts +32488 -0
- package/tl/api.js +507 -0
- package/tl/apiTl.d.ts +2 -0
- package/tl/apiTl.js +2209 -0
- package/tl/core/GZIPPacked.d.ts +15 -0
- package/tl/core/GZIPPacked.js +51 -0
- package/tl/core/MessageContainer.d.ts +12 -0
- package/tl/core/MessageContainer.js +42 -0
- package/tl/core/RPCResult.d.ts +14 -0
- package/tl/core/RPCResult.js +32 -0
- package/tl/core/TLMessage.d.ts +10 -0
- package/tl/core/TLMessage.js +14 -0
- package/tl/core/index.d.ts +6 -0
- package/tl/core/index.js +16 -0
- package/tl/custom/button.d.ts +24 -0
- package/tl/custom/button.js +78 -0
- package/tl/custom/chatGetter.d.ts +29 -0
- package/tl/custom/chatGetter.js +116 -0
- package/tl/custom/dialog.d.ts +30 -0
- package/tl/custom/dialog.js +40 -0
- package/tl/custom/draft.d.ts +21 -0
- package/tl/custom/draft.js +48 -0
- package/tl/custom/file.d.ts +21 -0
- package/tl/custom/file.js +68 -0
- package/tl/custom/forward.d.ts +15 -0
- package/tl/custom/forward.js +47 -0
- package/tl/custom/index.d.ts +1 -0
- package/tl/custom/index.js +5 -0
- package/tl/custom/inlineResult.d.ts +32 -0
- package/tl/custom/inlineResult.js +87 -0
- package/tl/custom/inlineResults.d.ts +20 -0
- package/tl/custom/inlineResults.js +26 -0
- package/tl/custom/message.d.ts +427 -0
- package/tl/custom/message.js +716 -0
- package/tl/custom/messageButton.d.ts +54 -0
- package/tl/custom/messageButton.js +152 -0
- package/tl/custom/senderGetter.d.ts +28 -0
- package/tl/custom/senderGetter.js +55 -0
- package/tl/generateModule.d.ts +1 -0
- package/tl/generateModule.js +17 -0
- package/tl/generationHelpers.d.ts +11 -0
- package/tl/generationHelpers.js +289 -0
- package/tl/index.d.ts +3 -0
- package/tl/index.js +10 -0
- package/tl/patched/index.d.ts +2 -0
- package/tl/patched/index.js +76 -0
- package/tl/schemaTl.d.ts +2 -0
- package/tl/schemaTl.js +64 -0
- package/tl/types-generator/generate.d.ts +1 -0
- package/tl/types-generator/generate.js +84 -0
- package/tl/types-generator/template.d.ts +6 -0
- package/tl/types-generator/template.js +257 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BinaryReader = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
const core_1 = require("../tl/core");
|
|
6
|
+
const AllTLObjects_1 = require("../tl/AllTLObjects");
|
|
7
|
+
const Helpers_1 = require("../Helpers");
|
|
8
|
+
class BinaryReader {
|
|
9
|
+
/**
|
|
10
|
+
* Small utility class to read binary data.
|
|
11
|
+
* @param data {Buffer}
|
|
12
|
+
*/
|
|
13
|
+
constructor(data) {
|
|
14
|
+
this.stream = data;
|
|
15
|
+
this._last = undefined;
|
|
16
|
+
this.offset = 0;
|
|
17
|
+
}
|
|
18
|
+
// region Reading
|
|
19
|
+
// "All numbers are written as little endian."
|
|
20
|
+
// https://core.telegram.org/mtproto
|
|
21
|
+
/**
|
|
22
|
+
* Reads a single byte value.
|
|
23
|
+
*/
|
|
24
|
+
readByte() {
|
|
25
|
+
return this.read(1)[0];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Reads an integer (4 bytes or 32 bits) value.
|
|
29
|
+
* @param signed {Boolean}
|
|
30
|
+
*/
|
|
31
|
+
readInt(signed = true) {
|
|
32
|
+
let res;
|
|
33
|
+
if (signed) {
|
|
34
|
+
res = this.stream.readInt32LE(this.offset);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
res = this.stream.readUInt32LE(this.offset);
|
|
38
|
+
}
|
|
39
|
+
this.offset += 4;
|
|
40
|
+
return res;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Reads a long integer (8 bytes or 64 bits) value.
|
|
44
|
+
* @param signed
|
|
45
|
+
* @returns {BigInteger}
|
|
46
|
+
*/
|
|
47
|
+
readLong(signed = true) {
|
|
48
|
+
return this.readLargeInt(64, signed);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Reads a real floating point (4 bytes) value.
|
|
52
|
+
* @returns {number}
|
|
53
|
+
*/
|
|
54
|
+
readFloat() {
|
|
55
|
+
return this.read(4).readFloatLE(0);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Reads a real floating point (8 bytes) value.
|
|
59
|
+
* @returns {BigInteger}
|
|
60
|
+
*/
|
|
61
|
+
readDouble() {
|
|
62
|
+
// was this a bug ? it should have been <d
|
|
63
|
+
return this.read(8).readDoubleLE(0);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Reads a n-bits long integer value.
|
|
67
|
+
* @param bits
|
|
68
|
+
* @param signed {Boolean}
|
|
69
|
+
*/
|
|
70
|
+
readLargeInt(bits, signed = true) {
|
|
71
|
+
const buffer = this.read(Math.floor(bits / 8));
|
|
72
|
+
return (0, Helpers_1.readBigIntFromBuffer)(buffer, true, signed);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Read the given amount of bytes, or -1 to read all remaining.
|
|
76
|
+
* @param length {number}
|
|
77
|
+
* @param checkLength {boolean} whether to check if the length overflows or not.
|
|
78
|
+
*/
|
|
79
|
+
read(length = -1, checkLength = true) {
|
|
80
|
+
if (length === -1) {
|
|
81
|
+
length = this.stream.length - this.offset;
|
|
82
|
+
}
|
|
83
|
+
const result = this.stream.slice(this.offset, this.offset + length);
|
|
84
|
+
this.offset += length;
|
|
85
|
+
if (checkLength && result.length !== length) {
|
|
86
|
+
throw Error(`No more data left to read (need ${length}, got ${result.length}: ${result}); last read ${this._last}`);
|
|
87
|
+
}
|
|
88
|
+
this._last = result;
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Gets the byte array representing the current buffer as a whole.
|
|
93
|
+
* @returns {Buffer}
|
|
94
|
+
*/
|
|
95
|
+
getBuffer() {
|
|
96
|
+
return this.stream;
|
|
97
|
+
}
|
|
98
|
+
// endregion
|
|
99
|
+
// region Telegram custom reading
|
|
100
|
+
/**
|
|
101
|
+
* Reads a Telegram-encoded byte array, without the need of
|
|
102
|
+
* specifying its length.
|
|
103
|
+
* @returns {Buffer}
|
|
104
|
+
*/
|
|
105
|
+
tgReadBytes() {
|
|
106
|
+
const firstByte = this.readByte();
|
|
107
|
+
let padding;
|
|
108
|
+
let length;
|
|
109
|
+
if (firstByte === 254) {
|
|
110
|
+
length =
|
|
111
|
+
this.readByte() |
|
|
112
|
+
(this.readByte() << 8) |
|
|
113
|
+
(this.readByte() << 16);
|
|
114
|
+
padding = length % 4;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
length = firstByte;
|
|
118
|
+
padding = (length + 1) % 4;
|
|
119
|
+
}
|
|
120
|
+
const data = this.read(length);
|
|
121
|
+
if (padding > 0) {
|
|
122
|
+
padding = 4 - padding;
|
|
123
|
+
this.read(padding);
|
|
124
|
+
}
|
|
125
|
+
return data;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Reads a Telegram-encoded string.
|
|
129
|
+
* @returns {string}
|
|
130
|
+
*/
|
|
131
|
+
tgReadString() {
|
|
132
|
+
return this.tgReadBytes().toString("utf-8");
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Reads a Telegram boolean value.
|
|
136
|
+
* @returns {boolean}
|
|
137
|
+
*/
|
|
138
|
+
tgReadBool() {
|
|
139
|
+
const value = this.readInt(false);
|
|
140
|
+
if (value === 0x997275b5) {
|
|
141
|
+
// boolTrue
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
else if (value === 0xbc799737) {
|
|
145
|
+
// boolFalse
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
throw new Error(`Invalid boolean code ${value.toString(16)}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Reads and converts Unix time (used by Telegram)
|
|
154
|
+
* into a Javascript {Date} object.
|
|
155
|
+
* @returns {Date}
|
|
156
|
+
*/
|
|
157
|
+
tgReadDate() {
|
|
158
|
+
const value = this.readInt();
|
|
159
|
+
return new Date(value * 1000);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Reads a Telegram object.
|
|
163
|
+
*/
|
|
164
|
+
tgReadObject() {
|
|
165
|
+
const constructorId = this.readInt(false);
|
|
166
|
+
let clazz = AllTLObjects_1.tlobjects[constructorId];
|
|
167
|
+
if (clazz === undefined) {
|
|
168
|
+
/**
|
|
169
|
+
* The class was undefined, but there's still a
|
|
170
|
+
* chance of it being a manually parsed value like bool!
|
|
171
|
+
*/
|
|
172
|
+
const value = constructorId;
|
|
173
|
+
if (value === 0x997275b5) {
|
|
174
|
+
// boolTrue
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
else if (value === 0xbc799737) {
|
|
178
|
+
// boolFalse
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
else if (value === 0x1cb5c415) {
|
|
182
|
+
// Vector
|
|
183
|
+
const temp = [];
|
|
184
|
+
const length = this.readInt();
|
|
185
|
+
for (let i = 0; i < length; i++) {
|
|
186
|
+
temp.push(this.tgReadObject());
|
|
187
|
+
}
|
|
188
|
+
return temp;
|
|
189
|
+
}
|
|
190
|
+
clazz = core_1.coreObjects.get(constructorId);
|
|
191
|
+
if (clazz === undefined) {
|
|
192
|
+
// If there was still no luck, give up
|
|
193
|
+
this.seek(-4); // Go back
|
|
194
|
+
const pos = this.tellPosition();
|
|
195
|
+
const error = new errors_1.TypeNotFoundError(constructorId, this.read());
|
|
196
|
+
this.setPosition(pos);
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return clazz.fromReader(this);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Reads a vector (a list) of Telegram objects.
|
|
204
|
+
* @returns {[Buffer]}
|
|
205
|
+
*/
|
|
206
|
+
tgReadVector() {
|
|
207
|
+
if (this.readInt(false) !== 0x1cb5c415) {
|
|
208
|
+
throw new Error("Invalid constructor code, vector was expected");
|
|
209
|
+
}
|
|
210
|
+
const count = this.readInt();
|
|
211
|
+
const temp = [];
|
|
212
|
+
for (let i = 0; i < count; i++) {
|
|
213
|
+
temp.push(this.tgReadObject());
|
|
214
|
+
}
|
|
215
|
+
return temp;
|
|
216
|
+
}
|
|
217
|
+
// endregion
|
|
218
|
+
// region Position related
|
|
219
|
+
/**
|
|
220
|
+
* Tells the current position on the stream.
|
|
221
|
+
* @returns {number}
|
|
222
|
+
*/
|
|
223
|
+
tellPosition() {
|
|
224
|
+
return this.offset;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Sets the current position on the stream.
|
|
228
|
+
* @param position
|
|
229
|
+
*/
|
|
230
|
+
setPosition(position) {
|
|
231
|
+
this.offset = position;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Seeks the stream position given an offset from the current position.
|
|
235
|
+
* The offset may be negative.
|
|
236
|
+
* @param offset
|
|
237
|
+
*/
|
|
238
|
+
seek(offset) {
|
|
239
|
+
this.offset += offset;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
exports.BinaryReader = BinaryReader;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BinaryWriter = void 0;
|
|
4
|
+
class BinaryWriter {
|
|
5
|
+
constructor(stream) {
|
|
6
|
+
this._buffers = [stream];
|
|
7
|
+
}
|
|
8
|
+
write(buffer) {
|
|
9
|
+
this._buffers.push(buffer);
|
|
10
|
+
}
|
|
11
|
+
getValue() {
|
|
12
|
+
return Buffer.concat(this._buffers);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.BinaryWriter = BinaryWriter;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class Deferred {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.promise = new Promise((resolve, reject) => {
|
|
6
|
+
this.reject = reject;
|
|
7
|
+
this.resolve = resolve;
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
static resolved(value) {
|
|
11
|
+
const deferred = new Deferred();
|
|
12
|
+
deferred.resolve(value);
|
|
13
|
+
return deferred;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.default = Deferred;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export declare enum LogLevel {
|
|
2
|
+
NONE = "none",
|
|
3
|
+
ERROR = "error",
|
|
4
|
+
WARN = "warn",
|
|
5
|
+
INFO = "info",
|
|
6
|
+
DEBUG = "debug"
|
|
7
|
+
}
|
|
8
|
+
export declare class Logger {
|
|
9
|
+
private levels;
|
|
10
|
+
private nodeColors;
|
|
11
|
+
messageFormat: string;
|
|
12
|
+
private _logLevel;
|
|
13
|
+
tzOffset: number;
|
|
14
|
+
constructor(level?: LogLevel);
|
|
15
|
+
/**
|
|
16
|
+
*
|
|
17
|
+
* @param level {string}
|
|
18
|
+
* @returns {boolean}
|
|
19
|
+
*/
|
|
20
|
+
canSend(level: LogLevel): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* @param message {string}
|
|
23
|
+
*/
|
|
24
|
+
warn(message: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* @param message {string}
|
|
27
|
+
*/
|
|
28
|
+
info(message: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* @param message {string}
|
|
31
|
+
*/
|
|
32
|
+
debug(message: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* @param message {string}
|
|
35
|
+
*/
|
|
36
|
+
error(message: string): void;
|
|
37
|
+
format(message: string, level: string): string;
|
|
38
|
+
get logLevel(): LogLevel;
|
|
39
|
+
setLevel(level: LogLevel): void;
|
|
40
|
+
static setLevel(level: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* @param level {string}
|
|
43
|
+
* @param message {string}
|
|
44
|
+
*/
|
|
45
|
+
_log(level: LogLevel, message: string): void;
|
|
46
|
+
/**
|
|
47
|
+
* Override this function for custom Logger. <br />
|
|
48
|
+
*
|
|
49
|
+
* @param level {string}
|
|
50
|
+
* @param message {string}
|
|
51
|
+
*/
|
|
52
|
+
log(level: LogLevel, message: string): void;
|
|
53
|
+
getDateTime(): string;
|
|
54
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// let _level: string | undefined = undefined;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Logger = exports.LogLevel = void 0;
|
|
5
|
+
var LogLevel;
|
|
6
|
+
(function (LogLevel) {
|
|
7
|
+
LogLevel["NONE"] = "none";
|
|
8
|
+
LogLevel["ERROR"] = "error";
|
|
9
|
+
LogLevel["WARN"] = "warn";
|
|
10
|
+
LogLevel["INFO"] = "info";
|
|
11
|
+
LogLevel["DEBUG"] = "debug";
|
|
12
|
+
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
13
|
+
const NodeColors = {
|
|
14
|
+
reset: "\x1b[0m",
|
|
15
|
+
red: "\x1b[31m",
|
|
16
|
+
green: "\x1b[32m",
|
|
17
|
+
yellow: "\x1b[33m",
|
|
18
|
+
blue: "\x1b[34m",
|
|
19
|
+
magenta: "\x1b[35m",
|
|
20
|
+
cyan: "\x1b[36m",
|
|
21
|
+
white: "\x1b[37m",
|
|
22
|
+
bold: "\x1b[1m",
|
|
23
|
+
dim: "\x1b[2m",
|
|
24
|
+
underline: "\x1b[4m",
|
|
25
|
+
};
|
|
26
|
+
class Logger {
|
|
27
|
+
constructor(level) {
|
|
28
|
+
this.levels = ["error", "warn", "info", "debug"];
|
|
29
|
+
this._logLevel = level || LogLevel.INFO;
|
|
30
|
+
this.nodeColors = {
|
|
31
|
+
warn: NodeColors.magenta,
|
|
32
|
+
info: NodeColors.yellow,
|
|
33
|
+
debug: NodeColors.cyan,
|
|
34
|
+
error: NodeColors.red,
|
|
35
|
+
reset: NodeColors.reset
|
|
36
|
+
};
|
|
37
|
+
this.messageFormat = "[%t] [%l] - [%m]";
|
|
38
|
+
this.tzOffset = new Date().getTimezoneOffset() * 60000;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
*
|
|
42
|
+
* @param level {string}
|
|
43
|
+
* @returns {boolean}
|
|
44
|
+
*/
|
|
45
|
+
canSend(level) {
|
|
46
|
+
return this._logLevel
|
|
47
|
+
? this.levels.indexOf(this._logLevel) >= this.levels.indexOf(level)
|
|
48
|
+
: false;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* @param message {string}
|
|
52
|
+
*/
|
|
53
|
+
warn(message) {
|
|
54
|
+
this._log(LogLevel.WARN, message);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* @param message {string}
|
|
58
|
+
*/
|
|
59
|
+
info(message) {
|
|
60
|
+
this._log(LogLevel.INFO, message);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* @param message {string}
|
|
64
|
+
*/
|
|
65
|
+
debug(message) {
|
|
66
|
+
this._log(LogLevel.DEBUG, message);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* @param message {string}
|
|
70
|
+
*/
|
|
71
|
+
error(message) {
|
|
72
|
+
this._log(LogLevel.ERROR, message);
|
|
73
|
+
}
|
|
74
|
+
format(message, level) {
|
|
75
|
+
return this.messageFormat
|
|
76
|
+
.replace("%t", this.getDateTime())
|
|
77
|
+
.replace("%l", level.toUpperCase())
|
|
78
|
+
.replace("%m", message);
|
|
79
|
+
}
|
|
80
|
+
get logLevel() {
|
|
81
|
+
return this._logLevel;
|
|
82
|
+
}
|
|
83
|
+
setLevel(level) {
|
|
84
|
+
this._logLevel = level;
|
|
85
|
+
}
|
|
86
|
+
static setLevel(level) {
|
|
87
|
+
console.log("Logger.setLevel is deprecated, it will has no effect. Please, use client.setLogLevel instead.");
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* @param level {string}
|
|
91
|
+
* @param message {string}
|
|
92
|
+
*/
|
|
93
|
+
_log(level, message) {
|
|
94
|
+
if (this.canSend(level)) {
|
|
95
|
+
this.log(level, message);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Override this function for custom Logger. <br />
|
|
100
|
+
*
|
|
101
|
+
* @param level {string}
|
|
102
|
+
* @param message {string}
|
|
103
|
+
*/
|
|
104
|
+
log(level, message) {
|
|
105
|
+
let nodeColor;
|
|
106
|
+
switch (level) {
|
|
107
|
+
case LogLevel.ERROR:
|
|
108
|
+
nodeColor = this.nodeColors.error;
|
|
109
|
+
break;
|
|
110
|
+
case LogLevel.WARN:
|
|
111
|
+
nodeColor = this.nodeColors.warn;
|
|
112
|
+
break;
|
|
113
|
+
case LogLevel.INFO:
|
|
114
|
+
nodeColor = this.nodeColors.info;
|
|
115
|
+
break;
|
|
116
|
+
case LogLevel.DEBUG:
|
|
117
|
+
nodeColor = this.nodeColors.debug;
|
|
118
|
+
break;
|
|
119
|
+
default:
|
|
120
|
+
nodeColor = "";
|
|
121
|
+
}
|
|
122
|
+
console.log(nodeColor + this.format(message, level) + this.nodeColors.reset);
|
|
123
|
+
}
|
|
124
|
+
getDateTime() {
|
|
125
|
+
return new Date(Date.now() - this.tzOffset).toISOString().slice(0, -1);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.Logger = Logger;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { MTProtoState } from "../network/MTProtoState";
|
|
2
|
+
import type { RequestState } from "../network/RequestState";
|
|
3
|
+
export declare class MessagePacker {
|
|
4
|
+
private _state;
|
|
5
|
+
_pendingStates: RequestState[];
|
|
6
|
+
private _queue;
|
|
7
|
+
private _ready;
|
|
8
|
+
private setReady;
|
|
9
|
+
private _log;
|
|
10
|
+
constructor(state: MTProtoState, logger: any);
|
|
11
|
+
values(): any[];
|
|
12
|
+
append(state?: RequestState, setReady?: boolean, atStart?: boolean): void;
|
|
13
|
+
prepend(states: RequestState[]): void;
|
|
14
|
+
extend(states: RequestState[]): void;
|
|
15
|
+
clear(): void;
|
|
16
|
+
wait(): Promise<void>;
|
|
17
|
+
get(): Promise<{
|
|
18
|
+
batch: any[];
|
|
19
|
+
data: Buffer<ArrayBufferLike>;
|
|
20
|
+
} | null | undefined>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MessagePacker = void 0;
|
|
4
|
+
const core_1 = require("../tl/core");
|
|
5
|
+
const core_2 = require("../tl/core");
|
|
6
|
+
const BinaryWriter_1 = require("./BinaryWriter");
|
|
7
|
+
const USE_INVOKE_AFTER_WITH = new Set([
|
|
8
|
+
"messages.SendMessage",
|
|
9
|
+
"messages.SendMedia",
|
|
10
|
+
"messages.SendMultiMedia",
|
|
11
|
+
"messages.ForwardMessages",
|
|
12
|
+
"messages.SendInlineBotResult",
|
|
13
|
+
]);
|
|
14
|
+
class MessagePacker {
|
|
15
|
+
constructor(state, logger) {
|
|
16
|
+
this._state = state;
|
|
17
|
+
this._queue = [];
|
|
18
|
+
this._pendingStates = [];
|
|
19
|
+
this._ready = new Promise((resolve) => {
|
|
20
|
+
this.setReady = resolve;
|
|
21
|
+
});
|
|
22
|
+
this._log = logger;
|
|
23
|
+
}
|
|
24
|
+
values() {
|
|
25
|
+
return this._queue;
|
|
26
|
+
}
|
|
27
|
+
append(state, setReady = true, atStart = false) {
|
|
28
|
+
var _a, _b;
|
|
29
|
+
// We need to check if there is already a `USE_INVOKE_AFTER_WITH` request
|
|
30
|
+
if (state && USE_INVOKE_AFTER_WITH.has(state.request.className)) {
|
|
31
|
+
if (atStart) {
|
|
32
|
+
// Assign `after` for the previously first `USE_INVOKE_AFTER_WITH` request
|
|
33
|
+
for (let i = 0; i < this._queue.length; i++) {
|
|
34
|
+
if (USE_INVOKE_AFTER_WITH.has((_a = this._queue[i]) === null || _a === void 0 ? void 0 : _a.request.className)) {
|
|
35
|
+
this._queue[i].after = state;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// Assign after for the previous `USE_INVOKE_AFTER_WITH` request
|
|
42
|
+
for (let i = this._queue.length - 1; i >= 0; i--) {
|
|
43
|
+
if (USE_INVOKE_AFTER_WITH.has((_b = this._queue[i]) === null || _b === void 0 ? void 0 : _b.request.className)) {
|
|
44
|
+
state.after = this._queue[i];
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (atStart) {
|
|
51
|
+
this._queue.unshift(state);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
this._queue.push(state);
|
|
55
|
+
}
|
|
56
|
+
if (setReady && this.setReady) {
|
|
57
|
+
this.setReady(true);
|
|
58
|
+
}
|
|
59
|
+
// 1658238041=MsgsAck, we don't care about MsgsAck here because they never resolve anyway.
|
|
60
|
+
if (state && state.request.CONSTRUCTOR_ID !== 1658238041) {
|
|
61
|
+
this._pendingStates.push(state);
|
|
62
|
+
state
|
|
63
|
+
.promise // Using finally causes triggering `unhandledrejection` event
|
|
64
|
+
.catch((err) => { })
|
|
65
|
+
.finally(() => {
|
|
66
|
+
this._pendingStates = this._pendingStates.filter((s) => s !== state);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
prepend(states) {
|
|
71
|
+
states.reverse().forEach((state) => {
|
|
72
|
+
this.append(state, false, true);
|
|
73
|
+
});
|
|
74
|
+
if (this.setReady) {
|
|
75
|
+
this.setReady(true);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
extend(states) {
|
|
79
|
+
states.forEach((state) => {
|
|
80
|
+
this.append(state, false);
|
|
81
|
+
});
|
|
82
|
+
if (this.setReady) {
|
|
83
|
+
this.setReady(true);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
clear() {
|
|
87
|
+
this._queue = [];
|
|
88
|
+
this.append(undefined);
|
|
89
|
+
}
|
|
90
|
+
async wait() {
|
|
91
|
+
if (!this._queue.length) {
|
|
92
|
+
this._ready = new Promise((resolve) => {
|
|
93
|
+
this.setReady = resolve;
|
|
94
|
+
});
|
|
95
|
+
await this._ready;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async get() {
|
|
99
|
+
if (!this._queue[this._queue.length - 1]) {
|
|
100
|
+
this._queue = this._queue.filter(Boolean);
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
let data;
|
|
104
|
+
let buffer = new BinaryWriter_1.BinaryWriter(Buffer.alloc(0));
|
|
105
|
+
const batch = [];
|
|
106
|
+
let size = 0;
|
|
107
|
+
while (this._queue.length &&
|
|
108
|
+
batch.length <= core_1.MessageContainer.MAXIMUM_LENGTH) {
|
|
109
|
+
const state = this._queue.shift();
|
|
110
|
+
if (!state) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
size += state.data.length + core_2.TLMessage.SIZE_OVERHEAD;
|
|
114
|
+
if (size <= core_1.MessageContainer.MAXIMUM_SIZE) {
|
|
115
|
+
let afterId;
|
|
116
|
+
if (state.after) {
|
|
117
|
+
afterId = state.after.msgId;
|
|
118
|
+
}
|
|
119
|
+
if (state.after) {
|
|
120
|
+
afterId = state.after.msgId;
|
|
121
|
+
}
|
|
122
|
+
state.msgId = await this._state.writeDataAsMessage(buffer, state.data, state.request.classType === "request", afterId);
|
|
123
|
+
this._log.debug(`Assigned msgId = ${state.msgId} to ${state.request.className ||
|
|
124
|
+
state.request.constructor.name}`);
|
|
125
|
+
batch.push(state);
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (batch.length) {
|
|
129
|
+
this._queue.unshift(state);
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
this._log.warn(`Message payload for ${state.request.className || state.request.constructor.name} is too long ${state.data.length} and cannot be sent`);
|
|
133
|
+
state.promise.reject("Request Payload is too big");
|
|
134
|
+
size = 0;
|
|
135
|
+
}
|
|
136
|
+
if (!batch.length) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
if (batch.length > 1) {
|
|
140
|
+
const b = Buffer.alloc(8);
|
|
141
|
+
b.writeUInt32LE(core_1.MessageContainer.CONSTRUCTOR_ID, 0);
|
|
142
|
+
b.writeInt32LE(batch.length, 4);
|
|
143
|
+
data = Buffer.concat([b, buffer.getValue()]);
|
|
144
|
+
buffer = new BinaryWriter_1.BinaryWriter(Buffer.alloc(0));
|
|
145
|
+
const containerId = await this._state.writeDataAsMessage(buffer, data, false);
|
|
146
|
+
for (const s of batch) {
|
|
147
|
+
s.containerId = containerId;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
data = buffer.getValue();
|
|
151
|
+
return { batch, data };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
exports.MessagePacker = MessagePacker;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { RequestState } from "../network/RequestState";
|
|
2
|
+
import bigInt from "big-integer";
|
|
3
|
+
export declare class PendingState {
|
|
4
|
+
_pending: Map<string, RequestState>;
|
|
5
|
+
constructor();
|
|
6
|
+
set(msgId: bigInt.BigInteger, state: RequestState): void;
|
|
7
|
+
get(msgId: bigInt.BigInteger): RequestState | undefined;
|
|
8
|
+
getAndDelete(msgId: bigInt.BigInteger): RequestState | undefined;
|
|
9
|
+
values(): RequestState[];
|
|
10
|
+
delete(msgId: bigInt.BigInteger): void;
|
|
11
|
+
clear(): void;
|
|
12
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PendingState = void 0;
|
|
4
|
+
class PendingState {
|
|
5
|
+
constructor() {
|
|
6
|
+
this._pending = new Map();
|
|
7
|
+
}
|
|
8
|
+
set(msgId, state) {
|
|
9
|
+
this._pending.set(msgId.toString(), state);
|
|
10
|
+
}
|
|
11
|
+
get(msgId) {
|
|
12
|
+
return this._pending.get(msgId.toString());
|
|
13
|
+
}
|
|
14
|
+
getAndDelete(msgId) {
|
|
15
|
+
const state = this.get(msgId);
|
|
16
|
+
this.delete(msgId);
|
|
17
|
+
return state;
|
|
18
|
+
}
|
|
19
|
+
values() {
|
|
20
|
+
return Array.from(this._pending.values());
|
|
21
|
+
}
|
|
22
|
+
delete(msgId) {
|
|
23
|
+
this._pending.delete(msgId.toString());
|
|
24
|
+
}
|
|
25
|
+
clear() {
|
|
26
|
+
this._pending.clear();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.PendingState = PendingState;
|