@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
@@ -0,0 +1,123 @@
1
+ import { createHash, randomBytes } from 'crypto';
2
+ import { readResponseHead } from './http-proxy.js';
3
+ const GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
4
+ const MAX_MESSAGE = 4 * 1024 * 1024;
5
+ const OPCODE = { CONTINUATION: 0x0, TEXT: 0x1, BINARY: 0x2, CLOSE: 0x8, PING: 0x9, PONG: 0xa };
6
+ export class WebSocketError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = 'WebSocketError';
10
+ }
11
+ }
12
+ /**
13
+ * Minimal RFC 6455 client: binary messages only, answers pings.
14
+ */
15
+ export class WebSocketConnection {
16
+ stream;
17
+ constructor(stream) {
18
+ this.stream = stream;
19
+ }
20
+ /**
21
+ * Upgrade an HTTP/1.1 connection. The server must echo `protocol` exactly.
22
+ */
23
+ static async open(http, path, protocol, origin) {
24
+ const key = randomBytes(16).toString('base64');
25
+ http.writeRequest('GET', path, {
26
+ Upgrade: 'websocket',
27
+ Connection: 'Upgrade',
28
+ 'Sec-WebSocket-Key': key,
29
+ 'Sec-WebSocket-Version': '13',
30
+ 'Sec-WebSocket-Protocol': protocol,
31
+ Origin: origin,
32
+ });
33
+ const head = await readResponseHead(http.stream);
34
+ if (head.status !== 101) {
35
+ throw new WebSocketError(`WebSocket upgrade refused (HTTP ${head.status})`);
36
+ }
37
+ const accept = createHash('sha1').update(key + GUID).digest('base64');
38
+ if (head.headers.get('sec-websocket-accept') !== accept) {
39
+ throw new WebSocketError('Invalid WebSocket handshake (bad Sec-WebSocket-Accept)');
40
+ }
41
+ if (head.headers.get('sec-websocket-protocol') !== protocol) {
42
+ throw new WebSocketError('WebSocket subprotocol was not accepted');
43
+ }
44
+ return new WebSocketConnection(http.stream);
45
+ }
46
+ send(data, opcode = OPCODE.BINARY) {
47
+ const mask = randomBytes(4);
48
+ let header;
49
+ if (data.length < 126) {
50
+ header = Buffer.from([0x80 | opcode, 0x80 | data.length]);
51
+ }
52
+ else if (data.length < 0x10000) {
53
+ header = Buffer.alloc(4);
54
+ header[0] = 0x80 | opcode;
55
+ header[1] = 0x80 | 126;
56
+ header.writeUInt16BE(data.length, 2);
57
+ }
58
+ else {
59
+ header = Buffer.alloc(10);
60
+ header[0] = 0x80 | opcode;
61
+ header[1] = 0x80 | 127;
62
+ header.writeBigUInt64BE(BigInt(data.length), 2);
63
+ }
64
+ const masked = Buffer.alloc(data.length);
65
+ for (let i = 0; i < data.length; i++) {
66
+ masked[i] = data[i] ^ mask[i & 3];
67
+ }
68
+ this.stream.write(Buffer.concat([header, mask, masked]));
69
+ }
70
+ /** Next complete binary message. */
71
+ async receive() {
72
+ const parts = [];
73
+ let total = 0;
74
+ for (;;) {
75
+ const head = await this.stream.read(2);
76
+ const fin = (head[0] & 0x80) !== 0;
77
+ const opcode = head[0] & 0x0f;
78
+ let length = head[1] & 0x7f;
79
+ if (length === 126) {
80
+ length = (await this.stream.read(2)).readUInt16BE(0);
81
+ }
82
+ else if (length === 127) {
83
+ const big = (await this.stream.read(8)).readBigUInt64BE(0);
84
+ if (big > BigInt(MAX_MESSAGE)) {
85
+ throw new WebSocketError('WebSocket message too large');
86
+ }
87
+ length = Number(big);
88
+ }
89
+ const mask = head[1] & 0x80 ? await this.stream.read(4) : undefined;
90
+ const payload = await this.stream.read(length);
91
+ if (mask) {
92
+ for (let i = 0; i < payload.length; i++) {
93
+ payload[i] ^= mask[i & 3];
94
+ }
95
+ }
96
+ switch (opcode) {
97
+ case OPCODE.PING:
98
+ this.send(payload, OPCODE.PONG);
99
+ continue;
100
+ case OPCODE.PONG:
101
+ continue;
102
+ case OPCODE.CLOSE: {
103
+ const code = payload.length >= 2 ? payload.readUInt16BE(0) : undefined;
104
+ const reason = payload.subarray(2).toString('utf8');
105
+ throw new WebSocketError(`Relay closed the WebSocket${code ? ` (${code}${reason ? ` ${reason}` : ''})` : ''}`);
106
+ }
107
+ case OPCODE.TEXT:
108
+ throw new WebSocketError('Unexpected text message from relay');
109
+ default:
110
+ break;
111
+ }
112
+ total += payload.length;
113
+ if (total > MAX_MESSAGE) {
114
+ throw new WebSocketError('WebSocket message too large');
115
+ }
116
+ parts.push(payload);
117
+ if (fin) {
118
+ return Buffer.concat(parts);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/net/websocket.ts"],"names":[],"mappings":"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"}
@@ -1,49 +1,72 @@
1
1
  /**
2
- * Type of Telegram proxy.
3
- */
4
- export type ProxyType = 'mtproto' | 'socks5' | 'http';
5
- /**
6
- * Base proxy interface.
2
+ * Proxy types supported by the official Telegram clients.
3
+ * `http` is Telegram Desktop only; `web` is the WEB proxy (telegramdesktop/tproxy-server).
7
4
  */
5
+ export type ProxyType = 'mtproto' | 'socks5' | 'http' | 'web';
8
6
  export interface BaseProxy {
9
7
  readonly type: ProxyType;
10
8
  readonly server: string;
11
9
  readonly port: number;
12
10
  }
13
- /**
14
- * MTProto proxy configuration.
15
- */
16
11
  export interface MTProtoProxy extends BaseProxy {
17
12
  readonly type: 'mtproto';
18
13
  readonly secret: string;
19
14
  }
20
- /**
21
- * SOCKS5 proxy configuration.
22
- */
23
15
  export interface SOCKS5Proxy extends BaseProxy {
24
16
  readonly type: 'socks5';
25
17
  readonly username?: string;
26
18
  readonly password?: string;
27
19
  }
28
- /**
29
- * HTTP proxy configuration.
30
- */
31
20
  export interface HTTPProxy extends BaseProxy {
32
21
  readonly type: 'http';
33
22
  readonly username?: string;
34
23
  readonly password?: string;
35
24
  }
25
+ export interface WebProxy extends BaseProxy {
26
+ readonly type: 'web';
27
+ /** Lowercase ASCII hostname (port is always 443). */
28
+ readonly server: string;
29
+ /** Base path without slashes; empty for a root deployment. */
30
+ readonly basePath: string;
31
+ /** MTProxy secret in hex: 16 bytes, or 17 starting with dd (path marker already removed). */
32
+ readonly secret: string;
33
+ }
34
+ /** How a WEB proxy relay carries the streams (chosen by the relay). */
35
+ export type CarrierMode = 'https' | 'https-lanes' | 'websocket' | 'websocket-lanes';
36
+ export type TelegramProxy = MTProtoProxy | SOCKS5Proxy | HTTPProxy | WebProxy;
36
37
  /**
37
- * Union type for all proxy types.
38
+ * Time spent in each phase of one check, in milliseconds.
38
39
  */
39
- export type TelegramProxy = MTProtoProxy | SOCKS5Proxy | HTTPProxy;
40
+ export interface Timings {
41
+ /** TCP connect to the proxy. */
42
+ readonly connect: number;
43
+ /** Fake TLS / SOCKS5 / HTTP CONNECT negotiation (0 when there is none). */
44
+ readonly handshake: number;
45
+ /** req_pq_multi -> resPQ round trip through the proxy to the Telegram DC. */
46
+ readonly rtt: number;
47
+ }
40
48
  /**
41
- * Result of a proxy check operation.
49
+ * Result of checking one proxy against one DC.
42
50
  */
51
+ export interface DcResult {
52
+ readonly dc: number;
53
+ readonly success: boolean;
54
+ /** Total time, from TCP connect to resPQ (what the official clients show as ping). */
55
+ readonly latency?: number;
56
+ readonly timings?: Timings;
57
+ /** HTTP transport fallback (HTTP proxies) or the carrier mode (WEB proxies). */
58
+ readonly via?: 'http-transport' | CarrierMode;
59
+ readonly error?: string;
60
+ }
43
61
  export interface CheckResult {
44
62
  readonly proxy: TelegramProxy;
63
+ /** True only when every requested DC answered. */
45
64
  readonly success: boolean;
65
+ /** Slowest DC latency when successful. */
46
66
  readonly latency?: number;
67
+ readonly dcs: readonly DcResult[];
47
68
  readonly error?: string;
69
+ /** The check was interrupted (Ctrl+C) and must not count in statistics. */
70
+ readonly aborted?: boolean;
48
71
  }
49
72
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC3C,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC1C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,SAAU,SAAQ,SAAS;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CAC3B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAE9D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,SAAU,SAAQ,SAAS;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,QAAS,SAAQ,SAAS;IACzC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,6FAA6F;IAC7F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,uEAAuE;AACvE,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,aAAa,GAAG,WAAW,GAAG,iBAAiB,CAAC;AAEpF,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,gCAAgC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,6EAA6E;IAC7E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,sFAAsF;IACtF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,GAAG,CAAC,EAAE,gBAAgB,GAAG,WAAW,CAAC;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,kDAAkD;IAClD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,SAAS,QAAQ,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B"}
@@ -1,22 +1,15 @@
1
- import type { TelegramProxy, CheckResult } from '../types/index.js';
2
- /**
3
- * Format latency with color.
4
- */
1
+ import type { CheckResult, TelegramProxy } from '../types/index.js';
2
+ /** padEnd that ignores ANSI color codes. */
3
+ export declare const padVisible: (text: string, width: number) => string;
5
4
  export declare const formatLatency: (latency: number) => string;
6
- /**
7
- * Format proxy type with color.
8
- */
9
- export declare const formatProxyType: (type: string) => string;
10
- /**
11
- * Format proxy address.
12
- */
5
+ export declare const formatProxyType: (proxy: TelegramProxy) => string;
13
6
  export declare const formatProxyAddress: (proxy: TelegramProxy) => string;
14
7
  /**
15
- * Print live result with in-place update.
8
+ * One result line. `result` is undefined while the check is running.
16
9
  */
17
- export declare const printPingResult: (proxyIndex: number, proxies: readonly TelegramProxy[], sequence: number, status: "testing" | "done", result?: CheckResult) => void;
10
+ export declare const formatPingLine: (index: number, proxies: readonly TelegramProxy[], sequence: number, result: CheckResult | undefined, verbose: boolean) => string;
18
11
  /**
19
- * Print statistics table for all proxies.
12
+ * Print the statistics table (like `ping`'s summary) for all proxies.
20
13
  */
21
14
  export declare const printPingStatistics: (proxies: readonly TelegramProxy[], allResults: readonly (readonly CheckResult[])[]) => void;
22
15
  //# sourceMappingURL=format.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,KAAG,MAQ/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,KAAG,MAW9C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,aAAa,KAAG,MAGzD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,YAAY,MAAM,EAAE,SAAS,SAAS,aAAa,EAAE,EAAE,UAAU,MAAM,EAAE,QAAQ,SAAS,GAAG,MAAM,EAAE,SAAS,WAAW,KAAG,IA0B3J,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,SAAS,aAAa,EAAE,EAAE,YAAY,SAAS,CAAC,SAAS,WAAW,EAAE,CAAC,EAAE,KAAG,IAgExH,CAAC"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAY,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAO9E,4CAA4C;AAC5C,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,KAAG,MACI,CAAC;AAE9D,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,KAAG,MAQ/C,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,OAAO,aAAa,KAAG,MAkBtD,CAAC;AAIF,eAAO,MAAM,kBAAkB,GAAI,OAAO,aAAa,KAAG,MAMzD,CAAC;AAsCF;;GAEG;AACH,eAAO,MAAM,cAAc,GACzB,OAAO,MAAM,EACb,SAAS,SAAS,aAAa,EAAE,EACjC,UAAU,MAAM,EAChB,QAAQ,WAAW,GAAG,SAAS,EAC/B,SAAS,OAAO,KACf,MAgBF,CAAC;AAIF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAC9B,SAAS,SAAS,aAAa,EAAE,EACjC,YAAY,SAAS,CAAC,SAAS,WAAW,EAAE,CAAC,EAAE,KAC9C,IAiDF,CAAC"}
@@ -1,128 +1,142 @@
1
1
  import chalk from 'chalk';
2
2
  import Table from 'cli-table3';
3
- import readline from 'readline';
4
- /**
5
- * Format latency with color.
6
- */
3
+ import { describeSecretKind, parseSecret } from '../mtproto/secret.js';
4
+ const ANSI_PATTERN = /\x1b\[[0-9;]*m/g;
5
+ const visibleLength = (text) => text.replace(ANSI_PATTERN, '').length;
6
+ /** padEnd that ignores ANSI color codes. */
7
+ export const padVisible = (text, width) => text + ' '.repeat(Math.max(0, width - visibleLength(text)));
7
8
  export const formatLatency = (latency) => {
8
9
  if (latency < 100) {
9
10
  return chalk.green(`${latency}ms`);
10
11
  }
11
- else if (latency < 300) {
12
+ if (latency < 300) {
12
13
  return chalk.yellow(`${latency}ms`);
13
14
  }
14
- else {
15
- return chalk.red(`${latency}ms`);
16
- }
15
+ return chalk.red(`${latency}ms`);
17
16
  };
18
- /**
19
- * Format proxy type with color.
20
- */
21
- export const formatProxyType = (type) => {
22
- switch (type) {
23
- case 'mtproto':
24
- return chalk.cyan('MTProto');
17
+ export const formatProxyType = (proxy) => {
18
+ switch (proxy.type) {
19
+ case 'mtproto': {
20
+ let variant = '';
21
+ try {
22
+ variant = ` · ${describeSecretKind(parseSecret(proxy.secret).kind)}`;
23
+ }
24
+ catch {
25
+ variant = ' · invalid secret';
26
+ }
27
+ return chalk.cyan(`MTProto${variant}`);
28
+ }
25
29
  case 'socks5':
26
30
  return chalk.magenta('SOCKS5');
27
31
  case 'http':
28
32
  return chalk.blue('HTTP');
29
33
  default:
30
- return chalk.dim(type);
34
+ return chalk.yellow(`WEB · ${proxy.secret.length === 34 ? 'dd' : 'simple'}`);
31
35
  }
32
36
  };
33
- /**
34
- * Format proxy address.
35
- */
37
+ const shorten = (text) => (text.length > 30 ? `${text.substring(0, 27)}...` : text);
36
38
  export const formatProxyAddress = (proxy) => {
37
- const server = proxy.server.length > 30 ? proxy.server.substring(0, 27) + '...' : proxy.server;
38
- return `${server}:${proxy.port}`;
39
+ if (proxy.type === 'web') {
40
+ return shorten(proxy.basePath ? `${proxy.server}/${proxy.basePath}` : proxy.server);
41
+ }
42
+ const server = shorten(proxy.server);
43
+ return `${server.includes(':') ? `[${server}]` : server}:${proxy.port}`;
44
+ };
45
+ const formatTimings = (dc) => {
46
+ if (!dc.timings) {
47
+ return '';
48
+ }
49
+ const { connect, handshake, rtt } = dc.timings;
50
+ const parts = [`tcp ${connect}`];
51
+ if (handshake > 0) {
52
+ parts.push(`handshake ${handshake}`);
53
+ }
54
+ parts.push(`rtt ${rtt}`);
55
+ return chalk.gray(` (${parts.join(' · ')}ms)`);
56
+ };
57
+ const formatSuccess = (result, verbose) => {
58
+ const carrier = result.dcs.find((dc) => dc.via)?.via;
59
+ const via = carrier ? chalk.gray(` via ${carrier === 'http-transport' ? 'HTTP transport' : carrier}`) : '';
60
+ if (result.dcs.length <= 1) {
61
+ const dc = result.dcs[0];
62
+ return `${formatLatency(result.latency ?? 0)}${verbose && dc ? formatTimings(dc) : ''}${via}`;
63
+ }
64
+ const perDc = result.dcs
65
+ .map((dc) => `DC${dc.dc} ${dc.latency}ms${verbose ? formatTimings(dc) : ''}`)
66
+ .join(chalk.gray(' · '));
67
+ return `${formatLatency(result.latency ?? 0)} ${chalk.gray('[')}${perDc}${chalk.gray(']')}${via}`;
68
+ };
69
+ const formatFailure = (result) => {
70
+ const errors = new Set(result.dcs.map((dc) => dc.error));
71
+ if (result.dcs.length <= 1 || (errors.size === 1 && result.dcs.every((dc) => !dc.success))) {
72
+ return chalk.red(result.error ?? 'Failed');
73
+ }
74
+ return result.dcs
75
+ .map((dc) => (dc.success ? chalk.green(`DC${dc.dc} ${dc.latency}ms`) : chalk.red(`DC${dc.dc}: ${dc.error}`)))
76
+ .join(chalk.gray(' · '));
39
77
  };
40
78
  /**
41
- * Print live result with in-place update.
79
+ * One result line. `result` is undefined while the check is running.
42
80
  */
43
- export const printPingResult = (proxyIndex, proxies, sequence, status, result) => {
44
- const proxy = result?.proxy || proxies[proxyIndex];
45
- const proxyLabel = proxies.length > 1 ? `[${proxyIndex + 1}] ${formatProxyAddress(proxy)}` : formatProxyAddress(proxy);
46
- const typeStr = formatProxyType(proxy.type);
47
- const seqStr = chalk.gray(`#${sequence.toString()}`);
48
- let line = '';
49
- if (status === 'testing') {
50
- const icon = chalk.cyan('⏳');
51
- line = `${icon} ${seqStr} ${chalk.gray('│')} ${chalk.white(proxyLabel.padEnd(35))} ${chalk.gray('│')} ${typeStr.padEnd(17)} ${chalk.gray('│')} ${chalk.cyan('testing...')}`;
81
+ export const formatPingLine = (index, proxies, sequence, result, verbose) => {
82
+ const proxy = proxies[index];
83
+ const label = proxies.length > 1 ? `[${index + 1}] ${formatProxyAddress(proxy)}` : formatProxyAddress(proxy);
84
+ const separator = chalk.gray('│');
85
+ const head = `${chalk.gray(`#${sequence}`)} ${separator} ${padVisible(chalk.white(label), 36)} ${separator} ${padVisible(formatProxyType(proxy), 20)} ${separator}`;
86
+ if (!result) {
87
+ return `${chalk.cyan('⏳')} ${head} ${chalk.cyan('testing...')}`;
52
88
  }
53
- else if (result) {
54
- if (result.success && result.latency !== undefined) {
55
- const icon = chalk.green.bold('✅');
56
- const latencyStr = formatLatency(result.latency);
57
- line = `${icon} ${seqStr} ${chalk.gray('│')} ${chalk.white(proxyLabel.padEnd(35))} ${chalk.gray('│')} ${typeStr.padEnd(17)} ${chalk.gray('│')} ${latencyStr}`;
58
- }
59
- else {
60
- const icon = chalk.red.bold('❌');
61
- const errorStr = result.error || 'timeout';
62
- line = `${icon} ${seqStr} ${chalk.gray('│')} ${chalk.white(proxyLabel.padEnd(35))} ${chalk.gray('│')} ${typeStr.padEnd(17)} ${chalk.gray('│')} ${chalk.red(errorStr)}`;
63
- }
89
+ if (result.aborted) {
90
+ return `${chalk.yellow('⏹')} ${head} ${chalk.yellow('aborted')}`;
91
+ }
92
+ if (result.success) {
93
+ return `${chalk.green('✅')} ${head} ${formatSuccess(result, verbose)}`;
64
94
  }
65
- // Move cursor to start, clear line, and write new content
66
- readline.clearLine(process.stdout, 0);
67
- readline.cursorTo(process.stdout, 0);
68
- process.stdout.write(line);
95
+ return `${chalk.red('❌')} ${head} ${formatFailure(result)}`;
69
96
  };
97
+ const truncate = (text, max) => (text.length > max ? `${text.slice(0, max - 1)}…` : text);
70
98
  /**
71
- * Print statistics table for all proxies.
99
+ * Print the statistics table (like `ping`'s summary) for all proxies.
72
100
  */
73
101
  export const printPingStatistics = (proxies, allResults) => {
74
- console.log();
75
- console.log(chalk.gray('━'.repeat(50)));
76
102
  console.log();
77
103
  console.log(chalk.bold.cyan('📊 Statistics'));
78
104
  console.log();
79
105
  const table = new Table({
80
- head: [
81
- chalk.bold('Proxy'),
82
- chalk.bold('Type'),
83
- chalk.bold('Sent'),
84
- chalk.bold('Recv'),
85
- chalk.bold('Loss'),
86
- chalk.bold('Min'),
87
- chalk.bold('Avg'),
88
- chalk.bold('Max')
89
- ],
90
- style: {
91
- head: ['cyan'],
92
- border: ['gray']
93
- }
106
+ head: ['Proxy', 'Type', 'Sent', 'Recv', 'Loss', 'Min', 'Avg', 'Max', 'Mdev', 'Last error'].map((h) => chalk.bold(h)),
107
+ style: chalk.level > 0 ? { head: ['cyan'], border: ['gray'] } : { head: [], border: [] },
94
108
  });
95
109
  proxies.forEach((proxy, index) => {
96
110
  const results = allResults[index];
97
- const proxyStr = formatProxyAddress(proxy);
98
- const typeStr = formatProxyType(proxy.type);
99
- const transmitted = results.length;
100
- const received = results.filter((r) => r.success).length;
101
- const loss = transmitted > 0 ? Math.round(((transmitted - received) / transmitted) * 100) : 0;
102
- let minStr = '-';
103
- let avgStr = '-';
104
- let maxStr = '-';
111
+ const sent = results.length;
112
+ const latencies = results.filter((r) => r.success && r.latency !== undefined).map((r) => r.latency);
113
+ const received = latencies.length;
114
+ const loss = sent > 0 ? Math.round(((sent - received) / sent) * 100) : 0;
115
+ let min = '-';
116
+ let avg = '-';
117
+ let max = '-';
118
+ let mdev = '-';
105
119
  if (received > 0) {
106
- const latencies = results.filter((r) => r.success && r.latency !== undefined).map((r) => r.latency);
107
- if (latencies.length > 0) {
108
- const min = Math.min(...latencies);
109
- const max = Math.max(...latencies);
110
- const avg = Math.round(latencies.reduce((a, b) => a + b, 0) / latencies.length);
111
- minStr = formatLatency(min);
112
- avgStr = formatLatency(avg);
113
- maxStr = formatLatency(max);
114
- }
120
+ const mean = latencies.reduce((a, b) => a + b, 0) / received;
121
+ const deviation = Math.sqrt(latencies.reduce((a, b) => a + (b - mean) ** 2, 0) / received);
122
+ min = formatLatency(Math.min(...latencies));
123
+ avg = formatLatency(Math.round(mean));
124
+ max = formatLatency(Math.max(...latencies));
125
+ mdev = chalk.gray(`${Math.round(deviation)}ms`);
115
126
  }
116
- const lossColor = loss === 0 ? chalk.green : chalk.red;
127
+ const lastError = [...results].reverse().find((r) => !r.success)?.error;
128
+ const lossColor = sent === 0 ? chalk.gray : loss === 0 ? chalk.green : chalk.red;
117
129
  table.push([
118
- proxyStr,
119
- typeStr,
120
- chalk.white(transmitted),
130
+ formatProxyAddress(proxy),
131
+ formatProxyType(proxy),
132
+ chalk.white(sent),
121
133
  chalk.green(received),
122
134
  lossColor(`${loss}%`),
123
- minStr,
124
- avgStr,
125
- maxStr
135
+ min,
136
+ avg,
137
+ max,
138
+ mdev,
139
+ lastError ? chalk.red(truncate(lastError, 40)) : chalk.gray('-'),
126
140
  ]);
127
141
  });
128
142
  console.log(table.toString());
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { CheckOptions } from '../lib/checker.js';
2
+ import type { DcResult, WebProxy } from '../types/index.js';
3
+ export declare class WebProxyError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ /**
7
+ * Wait for background session deletes (each bounded to 2s), so a short run does not
8
+ * exit before the relay has freed its session slots.
9
+ */
10
+ export declare const waitForWebProxyCleanup: () => Promise<void>;
11
+ /**
12
+ * Check a WEB proxy through one relay session, with one stream per DC.
13
+ */
14
+ export declare const checkWebProxy: (proxy: WebProxy, dcs: readonly number[], options: CheckOptions) => Promise<DcResult[]>;
15
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/webproxy/check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAe,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA6BzE,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAySD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,QAAa,OAAO,CAAC,IAAI,CAE3D,CAAC;AAcF;;GAEG;AACH,eAAO,MAAM,aAAa,GAAU,OAAO,QAAQ,EAAE,KAAK,SAAS,MAAM,EAAE,EAAE,SAAS,YAAY,KAAG,OAAO,CAAC,QAAQ,EAAE,CA2HtH,CAAC"}