sroosh 1.0.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.
Files changed (250) hide show
  1. package/CryptoFile-BROWSER.d.ts +2 -0
  2. package/CryptoFile-BROWSER.js +23 -0
  3. package/CryptoFile.d.ts +2 -0
  4. package/CryptoFile.js +23 -0
  5. package/Helpers.d.ts +151 -0
  6. package/Helpers.js +480 -0
  7. package/Password.d.ts +15 -0
  8. package/Password.js +271 -0
  9. package/README.md +105 -0
  10. package/Utils.d.ts +228 -0
  11. package/Utils.js +1248 -0
  12. package/Version.d.ts +1 -0
  13. package/Version.js +4 -0
  14. package/client/2fa.d.ts +48 -0
  15. package/client/2fa.js +109 -0
  16. package/client/TelegramClient.d.ts +1042 -0
  17. package/client/TelegramClient.js +1244 -0
  18. package/client/account.d.ts +0 -0
  19. package/client/account.js +1 -0
  20. package/client/auth.d.ts +93 -0
  21. package/client/auth.js +363 -0
  22. package/client/bots.d.ts +6 -0
  23. package/client/bots.js +24 -0
  24. package/client/buttons.d.ts +4 -0
  25. package/client/buttons.js +87 -0
  26. package/client/chats.d.ts +46 -0
  27. package/client/chats.js +350 -0
  28. package/client/dialogs.d.ts +52 -0
  29. package/client/dialogs.js +174 -0
  30. package/client/downloads.d.ts +157 -0
  31. package/client/downloads.js +598 -0
  32. package/client/fs-BROWSER.d.ts +10 -0
  33. package/client/fs-BROWSER.js +13 -0
  34. package/client/fs.d.ts +1 -0
  35. package/client/fs.js +13 -0
  36. package/client/index.d.ts +15 -0
  37. package/client/index.js +50 -0
  38. package/client/messageParse.d.ts +17 -0
  39. package/client/messageParse.js +191 -0
  40. package/client/messages.d.ts +259 -0
  41. package/client/messages.js +804 -0
  42. package/client/os-BROWSER.d.ts +5 -0
  43. package/client/os-BROWSER.js +10 -0
  44. package/client/os.d.ts +2 -0
  45. package/client/os.js +23 -0
  46. package/client/path-BROWSER.d.ts +7 -0
  47. package/client/path-BROWSER.js +8 -0
  48. package/client/path.d.ts +2 -0
  49. package/client/path.js +7 -0
  50. package/client/telegramBaseClient.d.ts +239 -0
  51. package/client/telegramBaseClient.js +369 -0
  52. package/client/updates.d.ts +31 -0
  53. package/client/updates.js +254 -0
  54. package/client/uploads.d.ts +137 -0
  55. package/client/uploads.js +514 -0
  56. package/client/users.d.ts +29 -0
  57. package/client/users.js +491 -0
  58. package/crypto/AuthKey.d.ts +20 -0
  59. package/crypto/AuthKey.js +76 -0
  60. package/crypto/CTR.d.ts +6 -0
  61. package/crypto/CTR.js +35 -0
  62. package/crypto/Factorizator.d.ts +19 -0
  63. package/crypto/Factorizator.js +74 -0
  64. package/crypto/IGE.d.ts +18 -0
  65. package/crypto/IGE.js +34 -0
  66. package/crypto/RSA.d.ts +15 -0
  67. package/crypto/RSA.js +150 -0
  68. package/crypto/converters.d.ts +19 -0
  69. package/crypto/converters.js +52 -0
  70. package/crypto/crypto.d.ts +27 -0
  71. package/crypto/crypto.js +117 -0
  72. package/crypto/words.d.ts +6 -0
  73. package/crypto/words.js +48 -0
  74. package/entityCache.d.ts +7 -0
  75. package/entityCache.js +79 -0
  76. package/errors/Common.d.ts +72 -0
  77. package/errors/Common.js +122 -0
  78. package/errors/RPCBaseErrors.d.ts +84 -0
  79. package/errors/RPCBaseErrors.js +134 -0
  80. package/errors/RPCErrorList.d.ts +37 -0
  81. package/errors/RPCErrorList.js +117 -0
  82. package/errors/index.d.ts +11 -0
  83. package/errors/index.js +29 -0
  84. package/events/Album.d.ts +36 -0
  85. package/events/Album.js +104 -0
  86. package/events/CallbackQuery.d.ts +74 -0
  87. package/events/CallbackQuery.js +193 -0
  88. package/events/DeletedMessage.d.ts +45 -0
  89. package/events/DeletedMessage.js +63 -0
  90. package/events/EditedMessage.d.ts +30 -0
  91. package/events/EditedMessage.js +41 -0
  92. package/events/NewMessage.d.ts +89 -0
  93. package/events/NewMessage.js +182 -0
  94. package/events/Raw.d.ts +29 -0
  95. package/events/Raw.js +43 -0
  96. package/events/common.d.ts +66 -0
  97. package/events/common.js +141 -0
  98. package/events/index.d.ts +2 -0
  99. package/events/index.js +8 -0
  100. package/extensions/AsyncQueue.d.ts +10 -0
  101. package/extensions/AsyncQueue.js +32 -0
  102. package/extensions/BinaryReader.d.ts +100 -0
  103. package/extensions/BinaryReader.js +242 -0
  104. package/extensions/BinaryWriter.d.ts +7 -0
  105. package/extensions/BinaryWriter.js +15 -0
  106. package/extensions/Deferred.d.ts +8 -0
  107. package/extensions/Deferred.js +16 -0
  108. package/extensions/Logger.d.ts +58 -0
  109. package/extensions/Logger.js +127 -0
  110. package/extensions/MessagePacker.d.ts +22 -0
  111. package/extensions/MessagePacker.js +154 -0
  112. package/extensions/PendingState.d.ts +12 -0
  113. package/extensions/PendingState.js +29 -0
  114. package/extensions/PromisedNetSockets-BROWSER.d.ts +8 -0
  115. package/extensions/PromisedNetSockets-BROWSER.js +12 -0
  116. package/extensions/PromisedNetSockets.d.ts +25 -0
  117. package/extensions/PromisedNetSockets.js +178 -0
  118. package/extensions/PromisedWebSockets.d.ts +19 -0
  119. package/extensions/PromisedWebSockets.js +134 -0
  120. package/extensions/html.d.ts +5 -0
  121. package/extensions/html.js +213 -0
  122. package/extensions/index.d.ts +7 -0
  123. package/extensions/index.js +17 -0
  124. package/extensions/markdown.d.ts +5 -0
  125. package/extensions/markdown.js +76 -0
  126. package/extensions/markdownv2.d.ts +5 -0
  127. package/extensions/markdownv2.js +51 -0
  128. package/extensions/net-BROWSER.d.ts +8 -0
  129. package/extensions/net-BROWSER.js +11 -0
  130. package/extensions/net.d.ts +1 -0
  131. package/extensions/net.js +13 -0
  132. package/extensions/socks-BROWSER.d.ts +3 -0
  133. package/extensions/socks-BROWSER.js +6 -0
  134. package/extensions/socks.d.ts +1 -0
  135. package/extensions/socks.js +13 -0
  136. package/index.d.ts +14 -0
  137. package/index.js +48 -0
  138. package/inspect-BROWSER.d.ts +3 -0
  139. package/inspect-BROWSER.js +6 -0
  140. package/inspect.d.ts +1 -0
  141. package/inspect.js +5 -0
  142. package/network/Authenticator.d.ts +12 -0
  143. package/network/Authenticator.js +193 -0
  144. package/network/MTProtoPlainSender.d.ts +19 -0
  145. package/network/MTProtoPlainSender.js +74 -0
  146. package/network/MTProtoSender.d.ts +291 -0
  147. package/network/MTProtoSender.js +854 -0
  148. package/network/MTProtoState.d.ts +103 -0
  149. package/network/MTProtoState.js +267 -0
  150. package/network/RequestState.d.ts +19 -0
  151. package/network/RequestState.js +35 -0
  152. package/network/connection/Connection.d.ts +71 -0
  153. package/network/connection/Connection.js +157 -0
  154. package/network/connection/ConnectionWebSocket.d.ts +19 -0
  155. package/network/connection/ConnectionWebSocket.js +77 -0
  156. package/network/connection/CustomIntermediatePacketCodec.d.ts +8 -0
  157. package/network/connection/CustomIntermediatePacketCodec.js +25 -0
  158. package/network/connection/CustomPromisedWebSockets.d.ts +22 -0
  159. package/network/connection/CustomPromisedWebSockets.js +170 -0
  160. package/network/connection/ObfuscatedIO.d.ts +12 -0
  161. package/network/connection/ObfuscatedIO.js +64 -0
  162. package/network/connection/TCPAbridged.d.ts +20 -0
  163. package/network/connection/TCPAbridged.js +58 -0
  164. package/network/connection/TCPFull.d.ts +17 -0
  165. package/network/connection/TCPFull.js +61 -0
  166. package/network/connection/TCPMTProxy.d.ts +50 -0
  167. package/network/connection/TCPMTProxy.js +121 -0
  168. package/network/connection/TCPObfuscated.d.ts +18 -0
  169. package/network/connection/TCPObfuscated.js +79 -0
  170. package/network/connection/index.d.ts +5 -0
  171. package/network/connection/index.js +13 -0
  172. package/network/index.d.ts +11 -0
  173. package/network/index.js +24 -0
  174. package/package.json +73 -0
  175. package/platform.d.ts +3 -0
  176. package/platform.js +6 -0
  177. package/requestIter.d.ts +24 -0
  178. package/requestIter.js +107 -0
  179. package/sessions/Abstract.d.ts +103 -0
  180. package/sessions/Abstract.js +6 -0
  181. package/sessions/CacheApiSession.d.ts +18 -0
  182. package/sessions/CacheApiSession.js +99 -0
  183. package/sessions/Memory.d.ts +38 -0
  184. package/sessions/Memory.js +272 -0
  185. package/sessions/StoreSession.d.ts +14 -0
  186. package/sessions/StoreSession.js +77 -0
  187. package/sessions/StringSession.d.ts +33 -0
  188. package/sessions/StringSession.js +116 -0
  189. package/sessions/index.d.ts +4 -0
  190. package/sessions/index.js +13 -0
  191. package/sessions/localStorage-BROWSER.d.ts +3 -0
  192. package/sessions/localStorage-BROWSER.js +9 -0
  193. package/sessions/localStorage.d.ts +1 -0
  194. package/sessions/localStorage.js +4 -0
  195. package/tl/AllTLObjects.d.ts +3 -0
  196. package/tl/AllTLObjects.js +17 -0
  197. package/tl/MTProtoRequest.d.ts +19 -0
  198. package/tl/MTProtoRequest.js +38 -0
  199. package/tl/api.d.ts +2 -0
  200. package/tl/api.js +507 -0
  201. package/tl/apiTl.d.ts +2 -0
  202. package/tl/apiTl.js +1638 -0
  203. package/tl/core/GZIPPacked.d.ts +16 -0
  204. package/tl/core/GZIPPacked.js +51 -0
  205. package/tl/core/MessageContainer.d.ts +12 -0
  206. package/tl/core/MessageContainer.js +42 -0
  207. package/tl/core/RPCResult.d.ts +15 -0
  208. package/tl/core/RPCResult.js +32 -0
  209. package/tl/core/TLMessage.d.ts +10 -0
  210. package/tl/core/TLMessage.js +14 -0
  211. package/tl/core/index.d.ts +6 -0
  212. package/tl/core/index.js +16 -0
  213. package/tl/custom/button.d.ts +25 -0
  214. package/tl/custom/button.js +78 -0
  215. package/tl/custom/chatGetter.d.ts +30 -0
  216. package/tl/custom/chatGetter.js +114 -0
  217. package/tl/custom/dialog.d.ts +31 -0
  218. package/tl/custom/dialog.js +40 -0
  219. package/tl/custom/draft.d.ts +22 -0
  220. package/tl/custom/draft.js +48 -0
  221. package/tl/custom/file.d.ts +22 -0
  222. package/tl/custom/file.js +68 -0
  223. package/tl/custom/forward.d.ts +16 -0
  224. package/tl/custom/forward.js +47 -0
  225. package/tl/custom/index.d.ts +1 -0
  226. package/tl/custom/index.js +5 -0
  227. package/tl/custom/inlineResult.d.ts +33 -0
  228. package/tl/custom/inlineResult.js +87 -0
  229. package/tl/custom/inlineResults.d.ts +21 -0
  230. package/tl/custom/inlineResults.js +26 -0
  231. package/tl/custom/message.d.ts +428 -0
  232. package/tl/custom/message.js +702 -0
  233. package/tl/custom/messageButton.d.ts +55 -0
  234. package/tl/custom/messageButton.js +152 -0
  235. package/tl/custom/senderGetter.d.ts +29 -0
  236. package/tl/custom/senderGetter.js +55 -0
  237. package/tl/generateModule.d.ts +1 -0
  238. package/tl/generateModule.js +17 -0
  239. package/tl/generationHelpers.d.ts +12 -0
  240. package/tl/generationHelpers.js +289 -0
  241. package/tl/index.d.ts +3 -0
  242. package/tl/index.js +10 -0
  243. package/tl/patched/index.d.ts +2 -0
  244. package/tl/patched/index.js +77 -0
  245. package/tl/schemaTl.d.ts +2 -0
  246. package/tl/schemaTl.js +64 -0
  247. package/tl/types-generator/generate.d.ts +1 -0
  248. package/tl/types-generator/generate.js +84 -0
  249. package/tl/types-generator/template.d.ts +6 -0
  250. package/tl/types-generator/template.js +257 -0
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConnectionWebSocket = exports.ObfuscatedIO = void 0;
4
+ // src/gramjs/network/ConnectionWebSocket.ts
5
+ const Helpers_1 = require("../../Helpers");
6
+ const Connection_1 = require("./Connection");
7
+ const TCPAbridged_1 = require("./TCPAbridged");
8
+ const CTR_1 = require("../../crypto/CTR");
9
+ const extensions_1 = require("../../extensions");
10
+ class ObfuscatedIO {
11
+ constructor(connection) {
12
+ this.header = undefined;
13
+ this.connection = connection.socket;
14
+ this._packetClass = new TCPAbridged_1.AbridgedPacketCodec(connection);
15
+ }
16
+ async initHeader() {
17
+ const keywords = [
18
+ Buffer.from("50567247", "hex"),
19
+ Buffer.from("474554", "hex"),
20
+ Buffer.from("504f5354", "hex"),
21
+ Buffer.from("eeeeeeee", "hex"),
22
+ ];
23
+ let random;
24
+ while (true) {
25
+ random = (0, Helpers_1.generateRandomBytes)(64);
26
+ if (random[0] !== 0xef &&
27
+ !random.slice(4, 8).equals(Buffer.alloc(4))) {
28
+ let ok = true;
29
+ for (const key of keywords) {
30
+ if (key.equals(random.slice(0, 4))) {
31
+ ok = false;
32
+ break;
33
+ }
34
+ }
35
+ if (ok)
36
+ break;
37
+ }
38
+ }
39
+ random = random.toJSON().data;
40
+ const randomReversed = Buffer.from(random.slice(8, 56)).reverse();
41
+ const encryptKey = Buffer.from(random.slice(8, 40));
42
+ const encryptIv = Buffer.from(random.slice(40, 56));
43
+ const decryptKey = Buffer.from(randomReversed.slice(0, 32));
44
+ const decryptIv = Buffer.from(randomReversed.slice(32, 48));
45
+ const encryptor = new CTR_1.CTR(encryptKey, encryptIv);
46
+ const decryptor = new CTR_1.CTR(decryptKey, decryptIv);
47
+ random = Buffer.concat([
48
+ Buffer.from(random.slice(0, 56)),
49
+ this._packetClass.obfuscateTag,
50
+ Buffer.from(random.slice(60)),
51
+ ]);
52
+ random = Buffer.concat([
53
+ Buffer.from(random.slice(0, 56)),
54
+ Buffer.from(encryptor.encrypt(random).slice(56, 64)),
55
+ Buffer.from(random.slice(64)),
56
+ ]);
57
+ this.header = random;
58
+ this._encrypt = encryptor;
59
+ this._decrypt = decryptor;
60
+ }
61
+ async read(n) {
62
+ const data = await this.connection.readExactly(n);
63
+ return this._decrypt.encrypt(data);
64
+ }
65
+ write(data) {
66
+ this.connection.write(this._encrypt.encrypt(data));
67
+ }
68
+ }
69
+ exports.ObfuscatedIO = ObfuscatedIO;
70
+ class ConnectionWebSocket extends Connection_1.ObfuscatedConnection {
71
+ constructor(props) {
72
+ super(Object.assign(Object.assign({}, props), { socket: extensions_1.PromisedWebSockets }));
73
+ this.ObfuscatedIO = ObfuscatedIO;
74
+ this.PacketCodecClass = TCPAbridged_1.AbridgedPacketCodec;
75
+ }
76
+ }
77
+ exports.ConnectionWebSocket = ConnectionWebSocket;
@@ -0,0 +1,8 @@
1
+ /// <reference types="node" />
2
+ import { PacketCodec } from "./Connection";
3
+ export declare class CustomIntermediatePacketCodec extends PacketCodec {
4
+ tag: Buffer;
5
+ constructor(connection: any);
6
+ encodePacket(data: Buffer): Buffer;
7
+ readPacket(reader: any): Promise<Buffer>;
8
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomIntermediatePacketCodec = void 0;
4
+ const Connection_1 = require("./Connection");
5
+ class CustomIntermediatePacketCodec extends Connection_1.PacketCodec {
6
+ constructor(connection) {
7
+ super(connection);
8
+ // تگ Intermediate: 4 بایت 0xee
9
+ this.tag = Buffer.from([0xee, 0xee, 0xee, 0xee]);
10
+ }
11
+ encodePacket(data) {
12
+ const length = Buffer.alloc(4);
13
+ length.writeUInt32LE(data.length, 0);
14
+ return Buffer.concat([length, data]);
15
+ }
16
+ async readPacket(reader) {
17
+ const lengthBuffer = await reader.readExactly(4);
18
+ const length = lengthBuffer.readUInt32LE(0);
19
+ if (length > 1024 * 1024) {
20
+ throw new Error(`Invalid packet length: ${length}`);
21
+ }
22
+ return await reader.readExactly(length);
23
+ }
24
+ }
25
+ exports.CustomIntermediatePacketCodec = CustomIntermediatePacketCodec;
@@ -0,0 +1,22 @@
1
+ /// <reference types="node" />
2
+ export declare class CustomPromisedWebSockets {
3
+ private closed;
4
+ private timeout;
5
+ private stream;
6
+ private canRead;
7
+ private resolveRead;
8
+ private client?;
9
+ private website?;
10
+ disconnectCallback?: () => void;
11
+ private firstWrite;
12
+ private pendingTag;
13
+ constructor(proxy?: any);
14
+ private getWebSocketLink;
15
+ connect(port: number, ip: string, isTest?: boolean, isPremium?: boolean): Promise<unknown>;
16
+ write(data: Buffer): void;
17
+ close(): void;
18
+ readExactly(length: number): Promise<Buffer>;
19
+ read(length: number): Promise<Buffer>;
20
+ readAll(): Promise<Buffer>;
21
+ private receive;
22
+ }
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomPromisedWebSockets = void 0;
4
+ const websocket_1 = require("websocket");
5
+ const buffer_1 = require("buffer");
6
+ class CustomPromisedWebSockets {
7
+ constructor(proxy) {
8
+ this.closed = true;
9
+ this.timeout = 5000;
10
+ this.stream = buffer_1.Buffer.alloc(0);
11
+ this.firstWrite = true;
12
+ this.pendingTag = null;
13
+ }
14
+ getWebSocketLink(ip, port, isTest, isPremium) {
15
+ const protocol = port === 443 ? "wss" : "ws";
16
+ const testSuffix = isTest ? "_test" : "";
17
+ return `${protocol}://${ip}:${port}/apiws${testSuffix}`;
18
+ }
19
+ async connect(port, ip, isTest = false, isPremium = false) {
20
+ this.stream = buffer_1.Buffer.alloc(0);
21
+ this.canRead = new Promise((resolve) => {
22
+ this.resolveRead = resolve;
23
+ });
24
+ this.closed = false;
25
+ this.website = this.getWebSocketLink(ip, port, isTest, isPremium);
26
+ console.log(`[WS] Connecting to: ${this.website}`);
27
+ this.client = new websocket_1.w3cwebsocket(this.website, "binary", "https://web.splus.ir");
28
+ if (this.client) {
29
+ this.client.binaryType = "arraybuffer";
30
+ }
31
+ return new Promise((resolve, reject) => {
32
+ if (!this.client)
33
+ return;
34
+ let timeoutHandle;
35
+ let settled = false;
36
+ this.client.onopen = () => {
37
+ console.log("[WS] Connection opened!");
38
+ this.receive();
39
+ resolve(this);
40
+ settled = true;
41
+ if (timeoutHandle)
42
+ clearTimeout(timeoutHandle);
43
+ };
44
+ this.client.onerror = (error) => {
45
+ console.error("[WS] Error:", (error === null || error === void 0 ? void 0 : error.message) || error);
46
+ if (!settled) {
47
+ reject(error);
48
+ settled = true;
49
+ if (timeoutHandle)
50
+ clearTimeout(timeoutHandle);
51
+ }
52
+ };
53
+ this.client.onclose = (event) => {
54
+ var _a;
55
+ const code = event === null || event === void 0 ? void 0 : event.code;
56
+ const reason = event === null || event === void 0 ? void 0 : event.reason;
57
+ console.log(`[WS] Closed. Code: ${code}, Reason: ${reason}`);
58
+ (_a = this.resolveRead) === null || _a === void 0 ? void 0 : _a.call(this, false);
59
+ this.closed = true;
60
+ if (this.disconnectCallback)
61
+ this.disconnectCallback();
62
+ if (!settled) {
63
+ reject(new Error(`WebSocket closed with code ${code}`));
64
+ settled = true;
65
+ if (timeoutHandle)
66
+ clearTimeout(timeoutHandle);
67
+ }
68
+ };
69
+ timeoutHandle = setTimeout(() => {
70
+ var _a, _b;
71
+ if (!settled) {
72
+ console.error("[WS] Connection timeout!");
73
+ reject(new Error("WebSocket connection timeout"));
74
+ (_a = this.resolveRead) === null || _a === void 0 ? void 0 : _a.call(this, false);
75
+ this.closed = true;
76
+ if (this.disconnectCallback)
77
+ this.disconnectCallback();
78
+ (_b = this.client) === null || _b === void 0 ? void 0 : _b.close();
79
+ }
80
+ }, this.timeout);
81
+ });
82
+ }
83
+ write(data) {
84
+ var _a, _b;
85
+ if (this.closed)
86
+ throw new Error("Not connected");
87
+ // اگه اولین نوشته، تگ رو قبلش اضافه کن
88
+ if (this.firstWrite && data.length === 4 && data[0] === 0xee) {
89
+ console.log(`[WS] First write - waiting for next packet to combine with tag`);
90
+ this.pendingTag = data;
91
+ this.firstWrite = false;
92
+ return; // هنوز چیزی نفرست
93
+ }
94
+ if (this.pendingTag) {
95
+ const combined = buffer_1.Buffer.concat([this.pendingTag, data]);
96
+ console.log(`[WS RAW SEND COMBINED] ${combined.length} bytes | hex: ${combined.slice(0, 32).toString("hex")}`);
97
+ (_a = this.client) === null || _a === void 0 ? void 0 : _a.send(combined);
98
+ this.pendingTag = null;
99
+ }
100
+ else {
101
+ console.log(`[WS RAW SEND] ${data.length} bytes | hex: ${data
102
+ .slice(0, 32)
103
+ .toString("hex")}`);
104
+ (_b = this.client) === null || _b === void 0 ? void 0 : _b.send(data);
105
+ }
106
+ }
107
+ close() {
108
+ var _a;
109
+ (_a = this.client) === null || _a === void 0 ? void 0 : _a.close();
110
+ this.closed = true;
111
+ }
112
+ async readExactly(length) {
113
+ let result = buffer_1.Buffer.alloc(0);
114
+ while (true) {
115
+ const chunk = await this.read(length);
116
+ result = buffer_1.Buffer.concat([result, chunk]);
117
+ length -= chunk.length;
118
+ if (length === 0)
119
+ return result;
120
+ }
121
+ }
122
+ async read(length) {
123
+ if (this.closed)
124
+ throw new Error("Connection closed");
125
+ await this.canRead;
126
+ if (this.closed)
127
+ throw new Error("Connection closed");
128
+ const chunk = this.stream.slice(0, length);
129
+ this.stream = this.stream.slice(length);
130
+ if (this.stream.length === 0) {
131
+ this.canRead = new Promise((resolve) => {
132
+ this.resolveRead = resolve;
133
+ });
134
+ }
135
+ return chunk;
136
+ }
137
+ async readAll() {
138
+ if (this.closed || !(await this.canRead))
139
+ throw new Error("Connection closed");
140
+ const result = this.stream;
141
+ this.stream = buffer_1.Buffer.alloc(0);
142
+ this.canRead = new Promise((resolve) => {
143
+ this.resolveRead = resolve;
144
+ });
145
+ return result;
146
+ }
147
+ receive() {
148
+ if (this.client) {
149
+ this.client.onmessage = async (message) => {
150
+ var _a;
151
+ let data;
152
+ if (message.data instanceof ArrayBuffer) {
153
+ data = buffer_1.Buffer.from(message.data);
154
+ }
155
+ else if (buffer_1.Buffer.isBuffer(message.data)) {
156
+ data = message.data;
157
+ }
158
+ else {
159
+ data = buffer_1.Buffer.from(message.data);
160
+ }
161
+ console.log(`[WS RAW RECV] ${data.length} bytes | hex: ${data
162
+ .slice(0, Math.min(32, data.length))
163
+ .toString("hex")}`);
164
+ this.stream = buffer_1.Buffer.concat([this.stream, data]);
165
+ (_a = this.resolveRead) === null || _a === void 0 ? void 0 : _a.call(this, true);
166
+ };
167
+ }
168
+ }
169
+ }
170
+ exports.CustomPromisedWebSockets = CustomPromisedWebSockets;
@@ -0,0 +1,12 @@
1
+ /// <reference types="node" />
2
+ import { Connection } from "./Connection";
3
+ export declare class ObfuscatedIO {
4
+ header: Buffer;
5
+ private _encrypt;
6
+ private _decrypt;
7
+ private _connection;
8
+ constructor(connection: Connection);
9
+ private initHeader;
10
+ encrypt(data: Buffer): Buffer;
11
+ decrypt(data: Buffer): Buffer;
12
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ObfuscatedIO = void 0;
4
+ const AES_CTR_1 = require("../extensions/AES_CTR");
5
+ class ObfuscatedIO {
6
+ constructor(connection) {
7
+ this._connection = connection;
8
+ const { random, encryptor, decryptor } = this.initHeader(connection.PacketCodecClass);
9
+ this.header = random;
10
+ this._encrypt = encryptor;
11
+ this._decrypt = decryptor;
12
+ }
13
+ initHeader(CodecClass) {
14
+ // تولید هدر ۶۴ بایتی
15
+ let random;
16
+ while (true) {
17
+ random = Buffer.alloc(64);
18
+ // پر کردن با اعداد رندوم
19
+ for (let i = 0; i < 64; i++) {
20
+ random[i] = Math.floor(Math.random() * 256);
21
+ }
22
+ // چک کردن اینکه شبیه پروتکل‌های وب نباشه
23
+ const first4 = random.slice(0, 4).toString("hex");
24
+ if (random[0] !== 0xef &&
25
+ first4 !== "50567247" && // PVrG
26
+ first4 !== "47455420" && // GET
27
+ first4 !== "504f5354" && // POST
28
+ first4 !== "48454144" && // HEAD
29
+ first4 !== "eeeeeeee") {
30
+ break;
31
+ }
32
+ }
33
+ // استخراج کلید و IV
34
+ const reversed = Buffer.from(random.slice(8, 56)).reverse();
35
+ const keyEncrypt = reversed.slice(0, 32);
36
+ const ivEncrypt = reversed.slice(32, 48);
37
+ const keyDecrypt = random.slice(8, 40);
38
+ const ivDecrypt = random.slice(40, 56);
39
+ // ساخت AES-CTR
40
+ const encryptor = new AES_CTR_1.AES_CTR(keyEncrypt, ivEncrypt);
41
+ const decryptor = new AES_CTR_1.AES_CTR(keyDecrypt, ivDecrypt);
42
+ // تزریق تگ پروتکل
43
+ const obfuscateTag = CodecClass.obfuscateTag || Buffer.from("efefefef", "hex");
44
+ random = Buffer.concat([
45
+ random.slice(0, 56),
46
+ obfuscateTag,
47
+ random.slice(60)
48
+ ]);
49
+ // رمزنگاری بخش آخر هدر
50
+ const encrypted = encryptor.encrypt(random);
51
+ random = Buffer.concat([
52
+ random.slice(0, 56),
53
+ encrypted.slice(56, 64)
54
+ ]);
55
+ return { random, encryptor, decryptor };
56
+ }
57
+ encrypt(data) {
58
+ return this._encrypt.encrypt(data);
59
+ }
60
+ decrypt(data) {
61
+ return this._decrypt.decrypt(data);
62
+ }
63
+ }
64
+ exports.ObfuscatedIO = ObfuscatedIO;
@@ -0,0 +1,20 @@
1
+ /// <reference types="node" />
2
+ import { Connection, PacketCodec } from "./Connection";
3
+ import type { PromisedNetSockets, PromisedWebSockets } from "../../extensions";
4
+ export declare class AbridgedPacketCodec extends PacketCodec {
5
+ static tag: Buffer;
6
+ static obfuscateTag: Buffer;
7
+ private tag;
8
+ obfuscateTag: Buffer;
9
+ constructor(props: any);
10
+ encodePacket(data: Buffer): Buffer;
11
+ readPacket(reader: PromisedNetSockets | PromisedWebSockets): Promise<Buffer>;
12
+ }
13
+ /**
14
+ * This is the mode with the lowest overhead, as it will
15
+ * only require 1 byte if the packet length is less than
16
+ * 508 bytes (127 << 2, which is very common).
17
+ */
18
+ export declare class ConnectionTCPAbridged extends Connection {
19
+ PacketCodecClass: typeof AbridgedPacketCodec;
20
+ }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ConnectionTCPAbridged = exports.AbridgedPacketCodec = void 0;
7
+ const Helpers_1 = require("../../Helpers");
8
+ const Connection_1 = require("./Connection");
9
+ const big_integer_1 = __importDefault(require("big-integer"));
10
+ class AbridgedPacketCodec extends Connection_1.PacketCodec {
11
+ constructor(props) {
12
+ super(props);
13
+ this.tag = AbridgedPacketCodec.tag;
14
+ this.obfuscateTag = AbridgedPacketCodec.obfuscateTag;
15
+ }
16
+ encodePacket(data) {
17
+ let length = data.length >> 2;
18
+ let temp;
19
+ if (length < 127) {
20
+ const b = Buffer.alloc(1);
21
+ b.writeUInt8(length, 0);
22
+ temp = b;
23
+ }
24
+ else {
25
+ temp = Buffer.concat([
26
+ Buffer.from("7f", "hex"),
27
+ (0, Helpers_1.readBufferFromBigInt)((0, big_integer_1.default)(length), 3),
28
+ ]);
29
+ }
30
+ return Buffer.concat([temp, data]);
31
+ }
32
+ async readPacket(reader) {
33
+ const readData = await reader.read(1);
34
+ let length = readData[0];
35
+ if (length >= 127) {
36
+ length = Buffer.concat([
37
+ await reader.read(3),
38
+ Buffer.alloc(1),
39
+ ]).readInt32LE(0);
40
+ }
41
+ return reader.read(length << 2);
42
+ }
43
+ }
44
+ exports.AbridgedPacketCodec = AbridgedPacketCodec;
45
+ AbridgedPacketCodec.tag = Buffer.from("ef", "hex");
46
+ AbridgedPacketCodec.obfuscateTag = Buffer.from("efefefef", "hex");
47
+ /**
48
+ * This is the mode with the lowest overhead, as it will
49
+ * only require 1 byte if the packet length is less than
50
+ * 508 bytes (127 << 2, which is very common).
51
+ */
52
+ class ConnectionTCPAbridged extends Connection_1.Connection {
53
+ constructor() {
54
+ super(...arguments);
55
+ this.PacketCodecClass = AbridgedPacketCodec;
56
+ }
57
+ }
58
+ exports.ConnectionTCPAbridged = ConnectionTCPAbridged;
@@ -0,0 +1,17 @@
1
+ /// <reference types="node" />
2
+ import { Connection, PacketCodec } from "./Connection";
3
+ import type { PromisedNetSockets, PromisedWebSockets } from "../../extensions";
4
+ export declare class FullPacketCodec extends PacketCodec {
5
+ private _sendCounter;
6
+ constructor(connection: any);
7
+ encodePacket(data: Buffer): Buffer;
8
+ /**
9
+ *
10
+ * @param reader {PromisedWebSockets}
11
+ * @returns {Promise<*>}
12
+ */
13
+ readPacket(reader: PromisedNetSockets | PromisedWebSockets): Promise<Buffer>;
14
+ }
15
+ export declare class ConnectionTCPFull extends Connection {
16
+ PacketCodecClass: typeof FullPacketCodec;
17
+ }
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConnectionTCPFull = exports.FullPacketCodec = void 0;
4
+ const Connection_1 = require("./Connection");
5
+ const Helpers_1 = require("../../Helpers");
6
+ const errors_1 = require("../../errors");
7
+ class FullPacketCodec extends Connection_1.PacketCodec {
8
+ constructor(connection) {
9
+ super(connection);
10
+ this._sendCounter = 0; // Telegram will ignore us otherwise
11
+ }
12
+ encodePacket(data) {
13
+ // https://core.telegram.org/mtproto#tcp-transport
14
+ // total length, sequence number, packet and checksum (CRC32)
15
+ const length = data.length + 12;
16
+ const e = Buffer.alloc(8);
17
+ e.writeInt32LE(length, 0);
18
+ e.writeInt32LE(this._sendCounter, 4);
19
+ data = Buffer.concat([e, data]);
20
+ const crc = Buffer.alloc(4);
21
+ crc.writeUInt32LE((0, Helpers_1.crc32)(data), 0);
22
+ this._sendCounter += 1;
23
+ return Buffer.concat([data, crc]);
24
+ }
25
+ /**
26
+ *
27
+ * @param reader {PromisedWebSockets}
28
+ * @returns {Promise<*>}
29
+ */
30
+ async readPacket(reader) {
31
+ const packetLenSeq = await reader.readExactly(8); // 4 and 4
32
+ if (packetLenSeq === undefined) {
33
+ // Return empty buffer in case of issue
34
+ return Buffer.alloc(0);
35
+ }
36
+ const packetLen = packetLenSeq.readInt32LE(0);
37
+ if (packetLen < 0) {
38
+ // # It has been observed that the length and seq can be -429,
39
+ // # followed by the body of 4 bytes also being -429.
40
+ // # See https://github.com/LonamiWebs/Telethon/issues/4042.
41
+ const body = await reader.readExactly(4);
42
+ throw new errors_1.InvalidBufferError(body);
43
+ }
44
+ let body = await reader.readExactly(packetLen - 8);
45
+ const checksum = body.slice(-4).readUInt32LE(0);
46
+ body = body.slice(0, -4);
47
+ const validChecksum = (0, Helpers_1.crc32)(Buffer.concat([packetLenSeq, body]));
48
+ if (!(validChecksum === checksum)) {
49
+ throw new errors_1.InvalidChecksumError(checksum, validChecksum);
50
+ }
51
+ return body;
52
+ }
53
+ }
54
+ exports.FullPacketCodec = FullPacketCodec;
55
+ class ConnectionTCPFull extends Connection_1.Connection {
56
+ constructor() {
57
+ super(...arguments);
58
+ this.PacketCodecClass = FullPacketCodec;
59
+ }
60
+ }
61
+ exports.ConnectionTCPFull = ConnectionTCPFull;
@@ -0,0 +1,50 @@
1
+ /// <reference types="node" />
2
+ import { ObfuscatedConnection } from "./Connection";
3
+ import { AbridgedPacketCodec } from "./TCPAbridged";
4
+ import { Logger, PromisedNetSockets, PromisedWebSockets } from "../../extensions";
5
+ interface BasicProxyInterface {
6
+ ip: string;
7
+ port: number;
8
+ timeout?: number;
9
+ username?: string;
10
+ password?: string;
11
+ }
12
+ export declare type MTProxyType = BasicProxyInterface & {
13
+ secret: string;
14
+ MTProxy: true;
15
+ };
16
+ export declare type SocksProxyType = BasicProxyInterface & {
17
+ socksType: 4 | 5;
18
+ };
19
+ export declare type ProxyInterface = MTProxyType | SocksProxyType;
20
+ declare class MTProxyIO {
21
+ header?: Buffer;
22
+ private connection;
23
+ private _encrypt?;
24
+ private _decrypt?;
25
+ private _packetClass;
26
+ private _secret;
27
+ private _dcId;
28
+ constructor(connection: TCPMTProxy);
29
+ initHeader(): Promise<void>;
30
+ read(n: number): Promise<Buffer>;
31
+ write(data: Buffer): void;
32
+ }
33
+ interface TCPMTProxyInterfaceParams {
34
+ ip: string;
35
+ port: number;
36
+ dcId: number;
37
+ loggers: Logger;
38
+ proxy: ProxyInterface;
39
+ socket: typeof PromisedNetSockets | typeof PromisedWebSockets;
40
+ testServers: boolean;
41
+ }
42
+ export declare class TCPMTProxy extends ObfuscatedConnection {
43
+ ObfuscatedIO: typeof MTProxyIO;
44
+ _secret: Buffer;
45
+ constructor({ ip, port, dcId, loggers, proxy, socket, testServers, }: TCPMTProxyInterfaceParams);
46
+ }
47
+ export declare class ConnectionTCPMTProxyAbridged extends TCPMTProxy {
48
+ PacketCodecClass: typeof AbridgedPacketCodec;
49
+ }
50
+ export {};