@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,10 +1,17 @@
1
1
  import type { TelegramProxy, CheckResult } from '../types/index.js';
2
+ export interface PingOptions {
3
+ readonly count?: number;
4
+ readonly interval: number;
5
+ readonly timeout: number;
6
+ readonly dcs: readonly number[];
7
+ readonly ipv6: boolean;
8
+ readonly verbose: boolean;
9
+ }
2
10
  /**
3
- * Ping proxies continuously.
11
+ * Ping all proxies in rounds, like `ping`. Returns every non-aborted result per proxy.
12
+ *
13
+ * On a TTY with enough rows the lines of a round are updated in place;
14
+ * otherwise (pipes, files, many proxies) each result is printed when it arrives.
4
15
  */
5
- export declare const pingProxy: (proxies: readonly TelegramProxy[], options: {
6
- count?: number;
7
- interval?: number;
8
- timeout?: number;
9
- }, signal?: AbortSignal) => Promise<readonly CheckResult[][]>;
16
+ export declare const pingProxies: (proxies: readonly TelegramProxy[], options: PingOptions, signal: AbortSignal) => Promise<readonly CheckResult[][]>;
10
17
  //# sourceMappingURL=ping.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ping.d.ts","sourceRoot":"","sources":["../../src/lib/ping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIpE;;GAEG;AACH,eAAO,MAAM,SAAS,GAClB,SAAS,SAAS,aAAa,EAAE,EACjC,SAAS;IACL,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB,EACD,SAAS,WAAW,KACrB,OAAO,CAAC,SAAS,WAAW,EAAE,EAAE,CAmElC,CAAC"}
1
+ {"version":3,"file":"ping.d.ts","sourceRoot":"","sources":["../../src/lib/ping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIpE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAiBD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GACtB,SAAS,SAAS,aAAa,EAAE,EACjC,SAAS,WAAW,EACpB,QAAQ,WAAW,KAClB,OAAO,CAAC,SAAS,WAAW,EAAE,EAAE,CA2ClC,CAAC"}
package/dist/lib/ping.js CHANGED
@@ -1,56 +1,56 @@
1
1
  import { checkProxy } from './checker.js';
2
- import { printPingResult, printPingStatistics } from '../utils/format.js';
3
- /**
4
- * Ping proxies continuously.
5
- */
6
- export const pingProxy = async (proxies, options, signal) => {
7
- const { count, interval = 1000, timeout = 10000 } = options;
8
- let shouldStop = false;
9
- // Handle abort signal
10
- if (signal) {
11
- signal.addEventListener('abort', () => {
12
- shouldStop = true;
13
- });
2
+ import { formatPingLine, printPingStatistics } from '../utils/format.js';
3
+ const sleep = (ms, signal) => new Promise((resolve) => {
4
+ if (signal.aborted) {
5
+ resolve();
6
+ return;
14
7
  }
15
- const sleep = (ms) => {
16
- return new Promise((resolve) => setTimeout(resolve, ms));
8
+ const done = () => {
9
+ clearTimeout(timer);
10
+ signal.removeEventListener('abort', done);
11
+ resolve();
17
12
  };
18
- // Initialize results array for each proxy
13
+ const timer = setTimeout(done, ms);
14
+ signal.addEventListener('abort', done, { once: true });
15
+ });
16
+ /**
17
+ * Ping all proxies in rounds, like `ping`. Returns every non-aborted result per proxy.
18
+ *
19
+ * On a TTY with enough rows the lines of a round are updated in place;
20
+ * otherwise (pipes, files, many proxies) each result is printed when it arrives.
21
+ */
22
+ export const pingProxies = async (proxies, options, signal) => {
23
+ const out = process.stdout;
24
+ const live = Boolean(out.isTTY) && proxies.length < (out.rows ?? 24) - 2;
19
25
  const allResults = proxies.map(() => []);
20
- let sequence = 1;
21
- // Main ping loop - all proxies tested together
22
- while (!shouldStop) {
23
- // Check if we've reached the count limit
24
- if (count !== undefined && sequence > count) {
26
+ for (let sequence = 1; options.count === undefined || sequence <= options.count; sequence++) {
27
+ if (signal.aborted) {
25
28
  break;
26
29
  }
27
- // Show testing status for all proxies
28
- for (let i = 0; i < proxies.length; i++) {
29
- printPingResult(i, proxies, sequence, 'testing');
30
- process.stdout.write('\n');
30
+ if (live) {
31
+ proxies.forEach((_, i) => out.write(`${formatPingLine(i, proxies, sequence, undefined, options.verbose)}\n`));
31
32
  }
32
- // Ping all proxies in parallel with real-time updates
33
33
  await Promise.all(proxies.map(async (proxy, i) => {
34
- const result = await checkProxy(proxy, timeout);
35
- allResults[i].push(result);
36
- // Move cursor to the correct line and update
37
- const lineOffset = proxies.length - i;
38
- process.stdout.write(`\x1b[${lineOffset}A`); // Move up
39
- printPingResult(i, proxies, sequence, 'done', result);
40
- process.stdout.write(`\x1b[${lineOffset}B`); // Move back down
41
- }));
42
- // Move to position after all lines
43
- process.stdout.write('\n');
44
- sequence++;
45
- // Check if aborted or should stop
46
- if (shouldStop) {
47
- break;
48
- }
49
- // Wait for interval before next ping (unless it's the last one)
50
- if (count === undefined || sequence <= count) {
51
- if (!shouldStop) {
52
- await sleep(interval);
34
+ const result = await checkProxy(proxy, {
35
+ timeout: options.timeout,
36
+ dcs: options.dcs,
37
+ ipv6: options.ipv6,
38
+ signal,
39
+ });
40
+ if (!result.aborted) {
41
+ allResults[i].push(result);
42
+ }
43
+ const line = formatPingLine(i, proxies, sequence, result, options.verbose);
44
+ if (live) {
45
+ const up = proxies.length - i;
46
+ out.write(`\x1b[${up}A\r\x1b[2K${line}\x1b[${up}B\r`);
53
47
  }
48
+ else if (!result.aborted) {
49
+ out.write(`${line}\n`);
50
+ }
51
+ }));
52
+ if (options.count === undefined || sequence < options.count) {
53
+ await sleep(options.interval, signal);
54
54
  }
55
55
  }
56
56
  printPingStatistics(proxies, allResults);
@@ -1 +1 @@
1
- {"version":3,"file":"ping.js","sourceRoot":"","sources":["../../src/lib/ping.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE1E;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC1B,OAAiC,EACjC,OAIC,EACD,MAAoB,EACa,EAAE;IACnC,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAC5D,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,sBAAsB;IACtB,IAAI,MAAM,EAAE,CAAC;QACT,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YAClC,UAAU,GAAG,IAAI,CAAC;QACtB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE;QACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,0CAA0C;IAC1C,MAAM,UAAU,GAAoB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1D,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,+CAA+C;IAC/C,OAAO,CAAC,UAAU,EAAE,CAAC;QACjB,yCAAyC;QACzC,IAAI,KAAK,KAAK,SAAS,IAAI,QAAQ,GAAG,KAAK,EAAE,CAAC;YAC1C,MAAM;QACV,CAAC;QAED,sCAAsC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QAED,sDAAsD;QACtD,MAAM,OAAO,CAAC,GAAG,CACb,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAChD,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE3B,6CAA6C;YAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,UAAU,GAAG,CAAC,CAAC,CAAC,UAAU;YACvD,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,UAAU,GAAG,CAAC,CAAC,CAAC,iBAAiB;QAClE,CAAC,CAAC,CACL,CAAC;QAEF,mCAAmC;QACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE3B,QAAQ,EAAE,CAAC;QAEX,kCAAkC;QAClC,IAAI,UAAU,EAAE,CAAC;YACb,MAAM;QACV,CAAC;QAED,gEAAgE;QAChE,IAAI,KAAK,KAAK,SAAS,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;gBACd,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;IACL,CAAC;IAED,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAEzC,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC"}
1
+ {"version":3,"file":"ping.js","sourceRoot":"","sources":["../../src/lib/ping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Pipe } from '../net/stream.js';
2
+ import { type TransportMode } from './transport.js';
3
+ export declare class InvalidResponseError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ /**
7
+ * Send req_pq_multi and wait for a resPQ with our nonce.
8
+ */
9
+ export declare const exchangeReqPq: (pipe: Pipe, mode: TransportMode) => Promise<void>;
10
+ //# sourceMappingURL=exchange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exchange.d.ts","sourceRoot":"","sources":["../../src/mtproto/exchange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAA0B,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG5E,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,GAAU,MAAM,IAAI,EAAE,MAAM,aAAa,KAAG,OAAO,CAAC,IAAI,CAOjF,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { encodeFrame, readFrame } from './transport.js';
2
+ import { buildReqPqMulti, parseResPQ } from './messages.js';
3
+ export class InvalidResponseError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = 'InvalidResponseError';
7
+ }
8
+ }
9
+ /**
10
+ * Send req_pq_multi and wait for a resPQ with our nonce.
11
+ */
12
+ export const exchangeReqPq = async (pipe, mode) => {
13
+ const { message, nonce } = buildReqPqMulti();
14
+ pipe.write(encodeFrame(mode, message));
15
+ const reply = parseResPQ(await readFrame(mode, pipe));
16
+ if (!reply || !reply.nonce.equals(nonce)) {
17
+ throw new InvalidResponseError('Invalid reply from Telegram (not a resPQ with our nonce)');
18
+ }
19
+ };
20
+ //# sourceMappingURL=exchange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exchange.js","sourceRoot":"","sources":["../../src/mtproto/exchange.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAsB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,IAAU,EAAE,IAAmB,EAAiB,EAAE;IACpF,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;IAC7C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,oBAAoB,CAAC,0DAA0D,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC,CAAC"}
@@ -1,56 +1,48 @@
1
+ import type { Pipe, SocketStream } from '../net/stream.js';
1
2
  /**
2
- * FakeTLS layer for MTProto proxies (secret with "ee" prefix).
3
+ * Fake TLS layer for MTProto proxies (secret with "ee" prefix), implemented
4
+ * like Telegram Desktop (mtproto_tls_socket.cpp) and Android (tgnet).
3
5
  */
4
- /**
5
- * Parse MTProto proxy secret and extract components.
6
- */
7
- export interface ParsedSecret {
8
- secret: Buffer;
9
- domain?: string;
10
- isFakeTLS: boolean;
6
+ export declare class FakeTlsError extends Error {
7
+ constructor(message: string);
8
+ }
9
+ /** Offset of the 32-byte random field inside the ClientHello / ServerHello packet. */
10
+ export declare const RANDOM_OFFSET = 11;
11
+ /** Official clients split outgoing data into records of at most this size. */
12
+ export declare const MAX_CLIENT_RECORD = 2878;
13
+ export interface ClientHello {
14
+ readonly packet: Buffer;
15
+ readonly clientRandom: Buffer;
11
16
  }
12
17
  /**
13
- * Parse MTProto proxy secret (dd or ee prefix).
14
- *
15
- * @param secretHex - Hex-encoded secret (with or without dd/ee prefix)
16
- */
17
- export declare function parseSecret(secretHex: string): ParsedSecret;
18
- /**
19
- * TLS record content types.
20
- */
21
- export declare const TLS_RECORD: {
22
- readonly CHANGE_CIPHER_SPEC: 20;
23
- readonly ALERT: 21;
24
- readonly HANDSHAKE: 22;
25
- readonly APPLICATION_DATA: 23;
26
- };
27
- /**
28
- * Generate a FakeTLS ClientHello with a valid HMAC digest in the client random,
29
- * exactly as official Telegram clients do. The proxy verifies this digest.
30
- *
31
- * @param domain - SNI domain from the ee secret
32
- * @param secret - 16-byte proxy secret
18
+ * Build the ClientHello exactly like the official clients: Chrome-like cipher
19
+ * suites and extensions (shuffled), GREASE, a valid x25519 key share, padding
20
+ * to 517 bytes, and the client random set to HMAC-SHA256(secret, packet) with
21
+ * the last 4 bytes XORed with the current UNIX time.
33
22
  */
34
- export declare function generateFakeTLSClientHello(domain: string, secret: Buffer): Buffer;
23
+ export declare const buildClientHello: (domain: string, key: Buffer, nowMs?: number) => ClientHello;
35
24
  /**
36
- * Wrap data into TLS Application Data record(s).
25
+ * Check the proxy's ServerHello: HMAC-SHA256(secret, clientRandom || response
26
+ * with the random field zeroed) must equal the random field.
37
27
  */
38
- export declare function wrapInTLSRecords(data: Buffer): Buffer;
28
+ export declare const verifyServerHello: (response: Buffer, clientRandom: Buffer, key: Buffer) => boolean;
39
29
  /**
40
- * Extract complete TLS record payloads from a stream buffer.
41
- *
42
- * @returns Concatenated payload of complete records and the remaining (incomplete) buffer
30
+ * TLS record wrapper used after the handshake.
31
+ * Outgoing: one ChangeCipherSpec prefix, then Application Data records of at most 2878 bytes.
32
+ * Incoming: only Application Data records are accepted.
43
33
  */
44
- export declare function extractTlsRecords(buffer: Buffer): {
45
- payload: Buffer;
46
- rest: Buffer;
47
- };
34
+ export declare class FakeTlsPipe implements Pipe {
35
+ private readonly inner;
36
+ private prefixSent;
37
+ private incoming;
38
+ constructor(inner: Pipe);
39
+ write(data: Buffer): void;
40
+ read(length: number): Promise<Buffer>;
41
+ }
48
42
  /**
49
- * Try to read and verify the proxy's ServerHello response.
50
- * The proxy answers with exactly 3 records: ServerHello + ChangeCipherSpec + noise AppData,
51
- * placing HMAC(secret, clientRandom || records-with-zeroed-digest) at RANDOM_OFFSET.
52
- *
53
- * @returns 'incomplete' while waiting for more bytes, 'valid' or 'invalid' when decided
43
+ * Perform the fake TLS handshake. Like the official clients, the response must
44
+ * be exactly: ServerHello record, ChangeCipherSpec (1 byte), one Application
45
+ * Data record; anything else is rejected.
54
46
  */
55
- export declare function tryVerifyFakeTLSServerHello(buffer: Buffer, clientRandom: Buffer, secret: Buffer): 'incomplete' | 'valid' | 'invalid';
47
+ export declare const fakeTlsHandshake: (stream: SocketStream, key: Buffer, domain: string) => Promise<FakeTlsPipe>;
56
48
  //# sourceMappingURL=fake-tls.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fake-tls.d.ts","sourceRoot":"","sources":["../../src/mtproto/fake-tls.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CA0B3D;AAED;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;CAKb,CAAC;AA+BX;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAkDjF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAarD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAUnF;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,GACb,YAAY,GAAG,OAAO,GAAG,SAAS,CAmBpC"}
1
+ {"version":3,"file":"fake-tls.d.ts","sourceRoot":"","sources":["../../src/mtproto/fake-tls.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE3D;;;GAGG;AAEH,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAED,sFAAsF;AACtF,eAAO,MAAM,aAAa,KAAK,CAAC;AAIhC,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAgDtC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,EAAE,KAAK,MAAM,EAAE,QAAO,MAAmB,KAAG,WA0D1F,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,EAAE,cAAc,MAAM,EAAE,KAAK,MAAM,KAAG,OAQvF,CAAC;AAEF;;;;GAIG;AACH,qBAAa,WAAY,YAAW,IAAI;IAI1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHlC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAA2B;gBAEd,KAAK,EAAE,IAAI;IAExC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAanB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAiB5C;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAU,QAAQ,YAAY,EAAE,KAAK,MAAM,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,WAAW,CA2B7G,CAAC"}