@erfan_bahramali/tping 1.0.0 → 1.1.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 (98) hide show
  1. package/README.md +76 -55
  2. package/dist/crypto/x25519.d.ts +10 -0
  3. package/dist/crypto/x25519.d.ts.map +1 -0
  4. package/dist/crypto/x25519.js +51 -0
  5. package/dist/crypto/x25519.js.map +1 -0
  6. package/dist/index.js +82 -39
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib/attempt.d.ts +31 -0
  9. package/dist/lib/attempt.d.ts.map +1 -0
  10. package/dist/lib/attempt.js +94 -0
  11. package/dist/lib/attempt.js.map +1 -0
  12. package/dist/lib/checker.d.ts +21 -3
  13. package/dist/lib/checker.d.ts.map +1 -1
  14. package/dist/lib/checker.js +133 -49
  15. package/dist/lib/checker.js.map +1 -1
  16. package/dist/lib/datacenters.d.ts +15 -0
  17. package/dist/lib/datacenters.d.ts.map +1 -0
  18. package/dist/lib/datacenters.js +20 -0
  19. package/dist/lib/datacenters.js.map +1 -0
  20. package/dist/lib/parser.d.ts +18 -3
  21. package/dist/lib/parser.d.ts.map +1 -1
  22. package/dist/lib/parser.js +174 -78
  23. package/dist/lib/parser.js.map +1 -1
  24. package/dist/lib/ping.d.ts +13 -6
  25. package/dist/lib/ping.d.ts.map +1 -1
  26. package/dist/lib/ping.js +44 -44
  27. package/dist/lib/ping.js.map +1 -1
  28. package/dist/mtproto/exchange.d.ts +10 -0
  29. package/dist/mtproto/exchange.d.ts.map +1 -0
  30. package/dist/mtproto/exchange.js +20 -0
  31. package/dist/mtproto/exchange.js.map +1 -0
  32. package/dist/mtproto/fake-tls.d.ts +36 -44
  33. package/dist/mtproto/fake-tls.d.ts.map +1 -1
  34. package/dist/mtproto/fake-tls.js +174 -148
  35. package/dist/mtproto/fake-tls.js.map +1 -1
  36. package/dist/mtproto/messages.d.ts +23 -36
  37. package/dist/mtproto/messages.d.ts.map +1 -1
  38. package/dist/mtproto/messages.js +64 -90
  39. package/dist/mtproto/messages.js.map +1 -1
  40. package/dist/mtproto/obfuscation.d.ts +23 -20
  41. package/dist/mtproto/obfuscation.d.ts.map +1 -1
  42. package/dist/mtproto/obfuscation.js +64 -64
  43. package/dist/mtproto/obfuscation.js.map +1 -1
  44. package/dist/mtproto/secret.d.ts +28 -0
  45. package/dist/mtproto/secret.d.ts.map +1 -0
  46. package/dist/mtproto/secret.js +68 -0
  47. package/dist/mtproto/secret.js.map +1 -0
  48. package/dist/mtproto/transport.d.ts +28 -0
  49. package/dist/mtproto/transport.d.ts.map +1 -0
  50. package/dist/mtproto/transport.js +78 -0
  51. package/dist/mtproto/transport.js.map +1 -0
  52. package/dist/net/http-client.d.ts +37 -0
  53. package/dist/net/http-client.d.ts.map +1 -0
  54. package/dist/net/http-client.js +93 -0
  55. package/dist/net/http-client.js.map +1 -0
  56. package/dist/net/http-proxy.d.ts +26 -0
  57. package/dist/net/http-proxy.d.ts.map +1 -0
  58. package/dist/net/http-proxy.js +71 -0
  59. package/dist/net/http-proxy.js.map +1 -0
  60. package/dist/net/socks5.d.ts +15 -0
  61. package/dist/net/socks5.d.ts.map +1 -0
  62. package/dist/net/socks5.js +112 -0
  63. package/dist/net/socks5.js.map +1 -0
  64. package/dist/net/stream.d.ts +54 -0
  65. package/dist/net/stream.d.ts.map +1 -0
  66. package/dist/net/stream.js +142 -0
  67. package/dist/net/stream.js.map +1 -0
  68. package/dist/net/websocket.d.ts +19 -0
  69. package/dist/net/websocket.d.ts.map +1 -0
  70. package/dist/net/websocket.js +123 -0
  71. package/dist/net/websocket.js.map +1 -0
  72. package/dist/types/index.d.ts +40 -17
  73. package/dist/types/index.d.ts.map +1 -1
  74. package/dist/utils/format.d.ts +7 -14
  75. package/dist/utils/format.d.ts.map +1 -1
  76. package/dist/utils/format.js +101 -87
  77. package/dist/utils/format.js.map +1 -1
  78. package/dist/webproxy/check.d.ts +15 -0
  79. package/dist/webproxy/check.d.ts.map +1 -0
  80. package/dist/webproxy/check.js +423 -0
  81. package/dist/webproxy/check.js.map +1 -0
  82. package/dist/webproxy/frames.d.ts +30 -0
  83. package/dist/webproxy/frames.d.ts.map +1 -0
  84. package/dist/webproxy/frames.js +59 -0
  85. package/dist/webproxy/frames.js.map +1 -0
  86. package/dist/webproxy/link.d.ts +27 -0
  87. package/dist/webproxy/link.d.ts.map +1 -0
  88. package/dist/webproxy/link.js +107 -0
  89. package/dist/webproxy/link.js.map +1 -0
  90. package/package.json +16 -11
  91. package/dist/mtproto/connection.d.ts +0 -59
  92. package/dist/mtproto/connection.d.ts.map +0 -1
  93. package/dist/mtproto/connection.js +0 -198
  94. package/dist/mtproto/connection.js.map +0 -1
  95. package/dist/mtproto/socks5.d.ts +0 -36
  96. package/dist/mtproto/socks5.d.ts.map +0 -1
  97. package/dist/mtproto/socks5.js +0 -148
  98. package/dist/mtproto/socks5.js.map +0 -1
@@ -1,175 +1,201 @@
1
- import { createHmac, randomBytes } from 'crypto';
1
+ import { createHmac, randomBytes, randomInt } from 'crypto';
2
+ import { generateX25519PublicKey } from '../crypto/x25519.js';
2
3
  /**
3
- * Parse MTProto proxy secret (dd or ee prefix).
4
- *
5
- * @param secretHex - Hex-encoded secret (with or without dd/ee prefix)
4
+ * Fake TLS layer for MTProto proxies (secret with "ee" prefix), implemented
5
+ * like Telegram Desktop (mtproto_tls_socket.cpp) and Android (tgnet).
6
6
  */
7
- export function parseSecret(secretHex) {
8
- const hex = secretHex.toLowerCase().replace(/[^0-9a-f]/g, '');
9
- if (hex.startsWith('dd')) {
10
- const secret = Buffer.from(hex.slice(2), 'hex');
11
- if (secret.length !== 16) {
12
- throw new Error('dd secret must be 16 bytes');
13
- }
14
- return { secret, isFakeTLS: false };
15
- }
16
- if (hex.startsWith('ee')) {
17
- const rest = hex.slice(2);
18
- if (rest.length < 32) {
19
- throw new Error('ee secret must have at least 16 bytes');
20
- }
21
- const secret = Buffer.from(rest.slice(0, 32), 'hex');
22
- const domain = rest.length > 32 ? Buffer.from(rest.slice(32), 'hex').toString('ascii') : undefined;
23
- return { secret, domain, isFakeTLS: true };
24
- }
25
- const secret = Buffer.from(hex, 'hex');
26
- if (secret.length !== 16) {
27
- throw new Error('Secret must be 16 bytes');
7
+ export class FakeTlsError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = 'FakeTlsError';
28
11
  }
29
- return { secret, isFakeTLS: false };
30
12
  }
31
- /**
32
- * TLS record content types.
33
- */
34
- export const TLS_RECORD = {
35
- CHANGE_CIPHER_SPEC: 0x14,
36
- ALERT: 0x15,
37
- HANDSHAKE: 0x16,
38
- APPLICATION_DATA: 0x17,
39
- };
40
- /** Random field offset inside the ClientHello record:
41
- * record header (5) + handshake type (1) + handshake length (3) + client version (2). */
42
- const RANDOM_OFFSET = 11;
43
- const RANDOM_LEN = 32;
44
- const u16 = (n) => {
45
- const b = Buffer.alloc(2);
46
- b.writeUInt16BE(n, 0);
47
- return b;
13
+ /** Offset of the 32-byte random field inside the ClientHello / ServerHello packet. */
14
+ export const RANDOM_OFFSET = 11;
15
+ const RANDOM_LENGTH = 32;
16
+ /** Official clients pad the ClientHello to 517 bytes, like Chrome. */
17
+ const PADDING_TARGET = 513;
18
+ /** Official clients split outgoing data into records of at most this size. */
19
+ export const MAX_CLIENT_RECORD = 2878;
20
+ const MAX_SERVER_RECORD = 16384 + 256;
21
+ const SERVER_HELLO_HEADER = Buffer.from('160303', 'hex');
22
+ const SERVER_HELLO_MIDDLE = Buffer.from('140303000101170303', 'hex');
23
+ const CLIENT_PREFIX = Buffer.from('140303000101', 'hex');
24
+ const APP_DATA_HEADER = Buffer.from('170303', 'hex');
25
+ const TLS_ALERT = 0x15;
26
+ const hex = (value) => Buffer.from(value.replace(/\s+/g, ''), 'hex');
27
+ const u16 = (value) => {
28
+ const out = Buffer.alloc(2);
29
+ out.writeUInt16BE(value, 0);
30
+ return out;
48
31
  };
49
- const u24 = (n) => {
50
- const b = Buffer.alloc(3);
51
- b.writeUIntBE(n, 0, 3);
52
- return b;
32
+ const u24 = (value) => {
33
+ const out = Buffer.alloc(3);
34
+ out.writeUIntBE(value, 0, 3);
35
+ return out;
53
36
  };
54
- const extension = (type, data) => Buffer.concat([u16(type), u16(data.length), data]);
55
37
  /**
56
- * Build the SNI (server_name) extension.
38
+ * Seven GREASE values (RFC 8701), consecutive pairs forced to differ.
57
39
  */
58
- const sniExtension = (domain) => {
59
- const host = Buffer.from(domain, 'ascii');
60
- const list = Buffer.concat([Buffer.from([0x00]), u16(host.length), host]);
61
- return extension(0x0000, Buffer.concat([u16(list.length), list]));
40
+ const generateGrease = () => {
41
+ const grease = randomBytes(7);
42
+ for (let i = 0; i < grease.length; i++) {
43
+ grease[i] = (grease[i] & 0xf0) + 0x0a;
44
+ }
45
+ for (let i = 1; i < grease.length; i += 2) {
46
+ if (grease[i] === grease[i - 1]) {
47
+ grease[i] ^= 0x10;
48
+ }
49
+ }
50
+ return grease;
51
+ };
52
+ const shuffle = (items) => {
53
+ const result = [...items];
54
+ for (let i = result.length - 1; i > 0; i--) {
55
+ const j = randomInt(i + 1);
56
+ [result[i], result[j]] = [result[j], result[i]];
57
+ }
58
+ return result;
62
59
  };
63
60
  /**
64
- * Generate a FakeTLS ClientHello with a valid HMAC digest in the client random,
65
- * exactly as official Telegram clients do. The proxy verifies this digest.
66
- *
67
- * @param domain - SNI domain from the ee secret
68
- * @param secret - 16-byte proxy secret
61
+ * Build the ClientHello exactly like the official clients: Chrome-like cipher
62
+ * suites and extensions (shuffled), GREASE, a valid x25519 key share, padding
63
+ * to 517 bytes, and the client random set to HMAC-SHA256(secret, packet) with
64
+ * the last 4 bytes XORed with the current UNIX time.
69
65
  */
70
- export function generateFakeTLSClientHello(domain, secret) {
71
- const sessionId = randomBytes(32);
72
- const keyShare = randomBytes(32);
73
- // Include a trailing GREASE value like real browsers do.
74
- const cipherSuites = [
75
- 0x1301, 0x1302, 0x1303, 0x1305, 0xc02b, 0xc02f, 0xc02c, 0xc030, 0xcca9,
76
- 0xcca8, 0xc013, 0xc014, 0x009c, 0x009d, 0x002f, 0x0035, 0x000a, 0x0a0a,
77
- ];
78
- const csBuf = Buffer.alloc(cipherSuites.length * 2);
79
- cipherSuites.forEach((c, i) => csBuf.writeUInt16BE(c, i * 2));
80
- const alpn = Buffer.concat([
81
- u16(2 + 1 + 2 + 1 + 8), // protocol name list length
82
- Buffer.from([2]), Buffer.from('h2', 'ascii'),
83
- Buffer.from([8]), Buffer.from('http/1.1', 'ascii'),
66
+ export const buildClientHello = (domain, key, nowMs = Date.now()) => {
67
+ const g = generateGrease();
68
+ const grease = (index) => Buffer.from([g[index], g[index]]);
69
+ const host = Buffer.from(domain, 'utf8');
70
+ const extensions = shuffle([
71
+ Buffer.concat([hex('0000'), u16(host.length + 5), u16(host.length + 3), hex('00'), u16(host.length), host]),
72
+ hex('0005 0005 01 0000 0000'),
73
+ Buffer.concat([hex('000a 000a 0008'), grease(4), hex('001d 0017 0018')]),
74
+ hex('000b 0002 01 00'),
75
+ hex('000d 0012 0010 0403 0804 0401 0503 0805 0501 0806 0601'),
76
+ hex('0010 000e 000c 02 6832 08 687474702f312e31'),
77
+ hex('0012 0000'),
78
+ hex('0017 0000'),
79
+ hex('001b 0003 02 0002'),
80
+ hex('0023 0000'),
81
+ Buffer.concat([hex('002b 0007 06'), grease(6), hex('0304 0303')]),
82
+ hex('002d 0002 01 01'),
83
+ Buffer.concat([hex('0033 002b 0029'), grease(4), hex('0001 00 001d 0020'), generateX25519PublicKey()]),
84
+ hex('4469 0005 0003 02 6832'),
85
+ hex('ff01 0001 00'),
84
86
  ]);
85
- const extensions = Buffer.concat([
86
- sniExtension(domain),
87
- extension(0x0010, alpn), // ALPN
88
- extension(0x000a, Buffer.concat([u16(4), u16(0x001d), u16(0x0017)])), // supported_groups: x25519, secp256r1
89
- extension(0x000b, Buffer.concat([u16(2), Buffer.from([0x01, 0x00])])), // ec_point_formats: uncompressed
90
- extension(0x000d, Buffer.concat([u16(4), u16(0x0804), u16(0x0401)])), // signature_algorithms
91
- extension(0x002b, Buffer.concat([u16(4), Buffer.from([0x03, 0x04, 0x03, 0x03])])), // supported_versions: TLS1.3, TLS1.2
92
- extension(0x0033, Buffer.concat([u16(2 + 2 + keyShare.length), u16(0x001d), u16(keyShare.length), keyShare])), // key_share x25519
93
- extension(0x0016, Buffer.alloc(0)), // encrypt_then_mac
94
- extension(0x0017, Buffer.alloc(0)), // extended_master_secret
87
+ let extensionBlock = Buffer.concat([grease(2), hex('0000'), ...extensions, grease(3), hex('0001 00')]);
88
+ const cipherSuites = Buffer.concat([
89
+ grease(0),
90
+ hex('1301 1302 1303 c02b c02f c02c c030 cca9 cca8 c013 c014 009c 009d 002f 0035'),
95
91
  ]);
92
+ // record header + handshake header + version + random + session id + suites + compression + ext length
93
+ const fixedLength = 5 + 4 + 2 + RANDOM_LENGTH + 1 + 32 + 2 + cipherSuites.length + 2 + 2;
94
+ const unpadded = fixedLength + extensionBlock.length;
95
+ if (unpadded < PADDING_TARGET) {
96
+ const size = PADDING_TARGET - unpadded;
97
+ extensionBlock = Buffer.concat([extensionBlock, hex('0015'), u16(size), Buffer.alloc(size)]);
98
+ }
96
99
  const body = Buffer.concat([
97
- Buffer.from([0x03, 0x03]), // client version TLS 1.2
98
- Buffer.alloc(RANDOM_LEN), // placeholder: random filled below
99
- Buffer.from([sessionId.length]), sessionId,
100
- u16(csBuf.length), csBuf,
101
- Buffer.from([0x01, 0x00]), // compression methods: null
102
- u16(extensions.length), extensions,
103
- ]);
104
- const handshake = Buffer.concat([Buffer.from([0x01]), u24(body.length), body]); // ClientHello
105
- const packet = Buffer.concat([
106
- Buffer.from([TLS_RECORD.HANDSHAKE, 0x03, 0x01]), u16(handshake.length), handshake,
100
+ hex('0303'),
101
+ Buffer.alloc(RANDOM_LENGTH),
102
+ hex('20'),
103
+ randomBytes(32),
104
+ u16(cipherSuites.length),
105
+ cipherSuites,
106
+ hex('0100'),
107
+ u16(extensionBlock.length),
108
+ extensionBlock,
107
109
  ]);
108
- // Client random = HMAC(secret, handshake with zeroed random); last 4 bytes = UNIX timestamp (LE).
109
- const digest = createHmac('sha256', secret).update(packet).digest();
110
- digest.writeUInt32LE(Math.floor(Date.now() / 1000) >>> 0, RANDOM_LEN - 4);
110
+ const handshake = Buffer.concat([hex('01'), u24(body.length), body]);
111
+ const packet = Buffer.concat([hex('160301'), u16(handshake.length), handshake]);
112
+ const digest = createHmac('sha256', key).update(packet).digest();
113
+ const timestamp = Math.floor(nowMs / 1000) >>> 0;
114
+ digest.writeUInt32LE((digest.readUInt32LE(28) ^ timestamp) >>> 0, 28);
111
115
  digest.copy(packet, RANDOM_OFFSET);
112
- return packet;
113
- }
116
+ return { packet, clientRandom: Buffer.from(digest) };
117
+ };
114
118
  /**
115
- * Wrap data into TLS Application Data record(s).
119
+ * Check the proxy's ServerHello: HMAC-SHA256(secret, clientRandom || response
120
+ * with the random field zeroed) must equal the random field.
116
121
  */
117
- export function wrapInTLSRecords(data) {
118
- const MAX_CHUNK_SIZE = 16384;
119
- const chunks = [];
120
- for (let i = 0; i < data.length; i += MAX_CHUNK_SIZE) {
121
- const chunk = data.subarray(i, Math.min(i + MAX_CHUNK_SIZE, data.length));
122
- const record = Buffer.alloc(5 + chunk.length);
123
- record.writeUInt8(TLS_RECORD.APPLICATION_DATA, 0);
124
- record.writeUInt16BE(0x0303, 1);
125
- record.writeUInt16BE(chunk.length, 3);
126
- chunk.copy(record, 5);
127
- chunks.push(record);
122
+ export const verifyServerHello = (response, clientRandom, key) => {
123
+ if (response.length < RANDOM_OFFSET + RANDOM_LENGTH) {
124
+ return false;
128
125
  }
129
- return Buffer.concat(chunks);
130
- }
126
+ const zeroed = Buffer.from(response);
127
+ zeroed.fill(0, RANDOM_OFFSET, RANDOM_OFFSET + RANDOM_LENGTH);
128
+ const expected = createHmac('sha256', key).update(clientRandom).update(zeroed).digest();
129
+ return expected.equals(response.subarray(RANDOM_OFFSET, RANDOM_OFFSET + RANDOM_LENGTH));
130
+ };
131
131
  /**
132
- * Extract complete TLS record payloads from a stream buffer.
133
- *
134
- * @returns Concatenated payload of complete records and the remaining (incomplete) buffer
132
+ * TLS record wrapper used after the handshake.
133
+ * Outgoing: one ChangeCipherSpec prefix, then Application Data records of at most 2878 bytes.
134
+ * Incoming: only Application Data records are accepted.
135
135
  */
136
- export function extractTlsRecords(buffer) {
137
- let offset = 0;
138
- let payload = Buffer.alloc(0);
139
- while (buffer.length - offset >= 5) {
140
- const len = buffer.readUInt16BE(offset + 3);
141
- if (buffer.length - offset < 5 + len)
142
- break;
143
- payload = Buffer.concat([payload, buffer.subarray(offset + 5, offset + 5 + len)]);
144
- offset += 5 + len;
136
+ export class FakeTlsPipe {
137
+ inner;
138
+ prefixSent = false;
139
+ incoming = Buffer.alloc(0);
140
+ constructor(inner) {
141
+ this.inner = inner;
142
+ }
143
+ write(data) {
144
+ const parts = [];
145
+ if (!this.prefixSent) {
146
+ parts.push(CLIENT_PREFIX);
147
+ this.prefixSent = true;
148
+ }
149
+ for (let offset = 0; offset < data.length; offset += MAX_CLIENT_RECORD) {
150
+ const chunk = data.subarray(offset, Math.min(offset + MAX_CLIENT_RECORD, data.length));
151
+ parts.push(APP_DATA_HEADER, u16(chunk.length), chunk);
152
+ }
153
+ this.inner.write(Buffer.concat(parts));
154
+ }
155
+ async read(length) {
156
+ while (this.incoming.length < length) {
157
+ const header = await this.inner.read(5);
158
+ if (!header.subarray(0, 3).equals(APP_DATA_HEADER)) {
159
+ throw new FakeTlsError(`Unexpected TLS record type 0x${header[0].toString(16)} from proxy`);
160
+ }
161
+ const size = header.readUInt16BE(3);
162
+ if (size > MAX_SERVER_RECORD) {
163
+ throw new FakeTlsError('TLS record from proxy is too large');
164
+ }
165
+ const body = await this.inner.read(size);
166
+ this.incoming = Buffer.concat([this.incoming, body]);
167
+ }
168
+ const out = this.incoming.subarray(0, length);
169
+ this.incoming = this.incoming.subarray(length);
170
+ return out;
145
171
  }
146
- return { payload, rest: buffer.subarray(offset) };
147
172
  }
148
173
  /**
149
- * Try to read and verify the proxy's ServerHello response.
150
- * The proxy answers with exactly 3 records: ServerHello + ChangeCipherSpec + noise AppData,
151
- * placing HMAC(secret, clientRandom || records-with-zeroed-digest) at RANDOM_OFFSET.
152
- *
153
- * @returns 'incomplete' while waiting for more bytes, 'valid' or 'invalid' when decided
174
+ * Perform the fake TLS handshake. Like the official clients, the response must
175
+ * be exactly: ServerHello record, ChangeCipherSpec (1 byte), one Application
176
+ * Data record; anything else is rejected.
154
177
  */
155
- export function tryVerifyFakeTLSServerHello(buffer, clientRandom, secret) {
156
- let offset = 0;
157
- for (let i = 0; i < 3; i++) {
158
- if (buffer.length - offset < 5)
159
- return 'incomplete';
160
- offset += 5 + buffer.readUInt16BE(offset + 3);
178
+ export const fakeTlsHandshake = async (stream, key, domain) => {
179
+ const hello = buildClientHello(domain, key);
180
+ stream.write(hello.packet);
181
+ const first = await stream.read(5);
182
+ if (first[0] === TLS_ALERT) {
183
+ throw new FakeTlsError('Proxy answered with a TLS alert (ClientHello rejected)');
161
184
  }
162
- if (buffer.length < offset)
163
- return 'incomplete';
164
- const packet = buffer.subarray(0, offset);
165
- if (packet[0] !== TLS_RECORD.HANDSHAKE)
166
- return 'invalid';
167
- const mac = createHmac('sha256', secret)
168
- .update(clientRandom)
169
- .update(packet.subarray(0, RANDOM_OFFSET))
170
- .update(Buffer.alloc(RANDOM_LEN))
171
- .update(packet.subarray(RANDOM_OFFSET + RANDOM_LEN))
172
- .digest();
173
- return mac.equals(packet.subarray(RANDOM_OFFSET, RANDOM_OFFSET + RANDOM_LEN)) ? 'valid' : 'invalid';
174
- }
185
+ if (!first.subarray(0, 3).equals(SERVER_HELLO_HEADER)) {
186
+ throw new FakeTlsError('Not a fake-TLS proxy (response is not a TLS ServerHello)');
187
+ }
188
+ const helloBody = await stream.read(first.readUInt16BE(3));
189
+ const middle = await stream.read(SERVER_HELLO_MIDDLE.length);
190
+ if (!middle.equals(SERVER_HELLO_MIDDLE)) {
191
+ throw new FakeTlsError('Unexpected fake-TLS ServerHello layout (looks like a real TLS server, not the proxy)');
192
+ }
193
+ const appLength = await stream.read(2);
194
+ const appBody = await stream.read(appLength.readUInt16BE(0));
195
+ const response = Buffer.concat([first, helloBody, middle, appLength, appBody]);
196
+ if (!verifyServerHello(response, hello.clientRandom, key)) {
197
+ throw new FakeTlsError('Fake-TLS verification failed: wrong secret, or the real site answered instead of the proxy (check system clock too)');
198
+ }
199
+ return new FakeTlsPipe(stream);
200
+ };
175
201
  //# sourceMappingURL=fake-tls.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fake-tls.js","sourceRoot":"","sources":["../../src/mtproto/fake-tls.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fake-tls.js","sourceRoot":"","sources":["../../src/mtproto/fake-tls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAG9D;;;GAGG;AAEH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,sFAAsF;AACtF,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAChC,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,sEAAsE;AACtE,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,iBAAiB,GAAG,KAAK,GAAG,GAAG,CAAC;AAEtC,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACzD,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;AACrE,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AACzD,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACrD,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB,MAAM,GAAG,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAErF,MAAM,GAAG,GAAG,CAAC,KAAa,EAAU,EAAE;IACpC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,GAAG,GAAG,CAAC,KAAa,EAAU,EAAE;IACpC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,cAAc,GAAG,GAAW,EAAE;IAClC,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACxC,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAI,KAAmB,EAAO,EAAE;IAC9C,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAOF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,GAAW,EAAE,QAAgB,IAAI,CAAC,GAAG,EAAE,EAAe,EAAE;IACvG,MAAM,CAAC,GAAG,cAAc,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEzC,MAAM,UAAU,GAAG,OAAO,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3G,GAAG,CAAC,wBAAwB,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACxE,GAAG,CAAC,iBAAiB,CAAC;QACtB,GAAG,CAAC,wDAAwD,CAAC;QAC7D,GAAG,CAAC,4CAA4C,CAAC;QACjD,GAAG,CAAC,WAAW,CAAC;QAChB,GAAG,CAAC,WAAW,CAAC;QAChB,GAAG,CAAC,mBAAmB,CAAC;QACxB,GAAG,CAAC,WAAW,CAAC;QAChB,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;QACjE,GAAG,CAAC,iBAAiB,CAAC;QACtB,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,mBAAmB,CAAC,EAAE,uBAAuB,EAAE,CAAC,CAAC;QACtG,GAAG,CAAC,wBAAwB,CAAC;QAC7B,GAAG,CAAC,cAAc,CAAC;KACpB,CAAC,CAAC;IAEH,IAAI,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAEvG,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;QACjC,MAAM,CAAC,CAAC,CAAC;QACT,GAAG,CAAC,4EAA4E,CAAC;KAClF,CAAC,CAAC;IAEH,uGAAuG;IACvG,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;IACzF,MAAM,QAAQ,GAAG,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC;IACrD,IAAI,QAAQ,GAAG,cAAc,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,cAAc,GAAG,QAAQ,CAAC;QACvC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;QACzB,GAAG,CAAC,MAAM,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC;QACT,WAAW,CAAC,EAAE,CAAC;QACf,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC;QACxB,YAAY;QACZ,GAAG,CAAC,MAAM,CAAC;QACX,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC;QAC1B,cAAc;KACf,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAEhF,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAEnC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACvD,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,YAAoB,EAAE,GAAW,EAAW,EAAE;IAChG,IAAI,QAAQ,CAAC,MAAM,GAAG,aAAa,GAAG,aAAa,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,GAAG,aAAa,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;IACxF,OAAO,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC;AAC1F,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,OAAO,WAAW;IAIO;IAHrB,UAAU,GAAG,KAAK,CAAC;IACnB,QAAQ,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3C,YAA6B,KAAW;QAAX,UAAK,GAAL,KAAK,CAAM;IAAG,CAAC;IAE5C,KAAK,CAAC,IAAY;QAChB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,iBAAiB,EAAE,CAAC;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACvF,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnD,MAAM,IAAI,YAAY,CAAC,gCAAgC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;YAC9F,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,IAAI,GAAG,iBAAiB,EAAE,CAAC;gBAC7B,MAAM,IAAI,YAAY,CAAC,oCAAoC,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,MAAoB,EAAE,GAAW,EAAE,MAAc,EAAwB,EAAE;IAChH,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAE3B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,YAAY,CAAC,wDAAwD,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,YAAY,CAAC,0DAA0D,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,YAAY,CAAC,sFAAsF,CAAC,CAAC;IACjH,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/E,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,YAAY,CACpB,qHAAqH,CACtH,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC,CAAC"}
@@ -1,48 +1,35 @@
1
1
  /**
2
- * Generate MTProto message_id.
3
- * Format: time.time() * 2^32, must be divisible by 4
4
- * Client message IDs must be divisible by 4
2
+ * Client message_id: unixtime * 2^32, divisible by 4.
5
3
  */
6
- export declare function generateMessageId(): bigint;
4
+ export declare const generateMessageId: (nowMs?: number) => bigint;
7
5
  /**
8
- * Build req_pq_multi message.
9
- * TL Schema: req_pq_multi#be7e8ef1 nonce:int128 = ResPQ;
10
- *
11
- * @param nonce - 16-byte random nonce
12
- * @returns TL-serialized message
6
+ * Unencrypted message: auth_key_id (0) + message_id + length + body.
13
7
  */
14
- export declare function buildReqPqMulti(nonce: Buffer): Buffer;
8
+ export declare const buildUnencryptedMessage: (body: Buffer, messageId?: bigint) => Buffer;
15
9
  /**
16
- * Build unencrypted MTProto message wrapper.
17
- *
18
- * Format:
19
- * - auth_key_id: 8 bytes (all zeros for unencrypted)
20
- * - message_id: 8 bytes
21
- * - message_length: 4 bytes
22
- * - message: N bytes
23
- *
24
- * @param tlMessage - TL-serialized message
25
- * @param messageId - Message ID
26
- * @returns Unencrypted message
10
+ * req_pq_multi#be7e8ef1 nonce:int128 = ResPQ;
27
11
  */
28
- export declare function buildUnencryptedMessage(tlMessage: Buffer, messageId: bigint): Buffer;
12
+ export declare const buildReqPqMulti: (nonce?: Buffer) => {
13
+ readonly message: Buffer;
14
+ readonly nonce: Buffer;
15
+ };
16
+ export interface ResPQ {
17
+ readonly nonce: Buffer;
18
+ readonly serverNonce: Buffer;
19
+ }
29
20
  /**
30
- * Add Intermediate protocol length prefix.
21
+ * Parse an unencrypted resPQ message (transport framing already removed;
22
+ * trailing transport padding is allowed).
31
23
  *
32
- * @param payload - Message payload
33
- * @returns Payload with length prefix
24
+ * resPQ#05162463 nonce:int128 server_nonce:int128 pq:string server_public_key_fingerprints:Vector<long> = ResPQ;
34
25
  */
35
- export declare function addLengthPrefix(payload: Buffer): Buffer;
26
+ export declare const parseResPQ: (data: Buffer) => ResPQ | null;
36
27
  /**
37
- * Parse ResPQ response.
38
- * TL Schema: resPQ#05162463 nonce:int128 server_nonce:int128 pq:string server_public_key_fingerprints:Vector<long> = ResPQ;
39
- *
40
- * @param data - Decrypted response data
41
- * @returns Parsed response or null if invalid
28
+ * Parse a req_pq_multi message (used by tests and mock servers).
29
+ */
30
+ export declare const parseReqPqMulti: (data: Buffer) => Buffer | null;
31
+ /**
32
+ * Build a resPQ reply for the given nonce (used by tests and mock servers).
42
33
  */
43
- export declare function parseResPQ(data: Buffer): {
44
- nonce: Buffer;
45
- serverNonce: Buffer;
46
- constructor: number;
47
- } | null;
34
+ export declare const buildResPQ: (nonce: Buffer) => Buffer;
48
35
  //# sourceMappingURL=messages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/mtproto/messages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAW1C;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,MAAM,CAUR;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAyCpE"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/mtproto/messages.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAO,MAAmB,KAAG,MAI9D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAAI,MAAM,MAAM,EAAE,YAAW,MAA4B,KAAG,MAK/F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,QAAO,MAAwB,KAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAKnH,CAAC;AAEF,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,KAAK,GAAG,IAkBjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,IAKvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,MAU1C,CAAC"}