@erfan_bahramali/tping 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.
- package/LICENSE +21 -0
- package/README.md +118 -0
- package/dist/crypto/aes-ctr.d.ts +18 -0
- package/dist/crypto/aes-ctr.d.ts.map +1 -0
- package/dist/crypto/aes-ctr.js +30 -0
- package/dist/crypto/aes-ctr.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/checker.d.ts +6 -0
- package/dist/lib/checker.d.ts.map +1 -0
- package/dist/lib/checker.js +72 -0
- package/dist/lib/checker.js.map +1 -0
- package/dist/lib/parser.d.ts +7 -0
- package/dist/lib/parser.d.ts.map +1 -0
- package/dist/lib/parser.js +96 -0
- package/dist/lib/parser.js.map +1 -0
- package/dist/lib/ping.d.ts +10 -0
- package/dist/lib/ping.d.ts.map +1 -0
- package/dist/lib/ping.js +59 -0
- package/dist/lib/ping.js.map +1 -0
- package/dist/mtproto/connection.d.ts +59 -0
- package/dist/mtproto/connection.d.ts.map +1 -0
- package/dist/mtproto/connection.js +198 -0
- package/dist/mtproto/connection.js.map +1 -0
- package/dist/mtproto/fake-tls.d.ts +56 -0
- package/dist/mtproto/fake-tls.d.ts.map +1 -0
- package/dist/mtproto/fake-tls.js +175 -0
- package/dist/mtproto/fake-tls.js.map +1 -0
- package/dist/mtproto/messages.d.ts +48 -0
- package/dist/mtproto/messages.d.ts.map +1 -0
- package/dist/mtproto/messages.js +104 -0
- package/dist/mtproto/messages.js.map +1 -0
- package/dist/mtproto/obfuscation.d.ts +26 -0
- package/dist/mtproto/obfuscation.d.ts.map +1 -0
- package/dist/mtproto/obfuscation.js +78 -0
- package/dist/mtproto/obfuscation.js.map +1 -0
- package/dist/mtproto/socks5.d.ts +36 -0
- package/dist/mtproto/socks5.d.ts.map +1 -0
- package/dist/mtproto/socks5.js +148 -0
- package/dist/mtproto/socks5.js.map +1 -0
- package/dist/types/index.d.ts +49 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/format.d.ts +22 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +131 -0
- package/dist/utils/format.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { randomBytes, createHash } from 'crypto';
|
|
2
|
+
import { AESCTR } from '../crypto/aes-ctr.js';
|
|
3
|
+
/**
|
|
4
|
+
* Protocol tags for MTProto transports.
|
|
5
|
+
*/
|
|
6
|
+
export const PROTO_TAG = {
|
|
7
|
+
ABRIDGED: Buffer.from([0xef, 0xef, 0xef, 0xef]),
|
|
8
|
+
INTERMEDIATE: Buffer.from([0xee, 0xee, 0xee, 0xee]),
|
|
9
|
+
SECURE: Buffer.from([0xdd, 0xdd, 0xdd, 0xdd]),
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Reserved byte sequences that must be avoided in random nonce.
|
|
13
|
+
*/
|
|
14
|
+
const RESERVED_KEYWORDS = [
|
|
15
|
+
Buffer.from([0x50, 0x56, 0x72, 0x47]), // PVrG
|
|
16
|
+
Buffer.from([0x47, 0x45, 0x54, 0x20]), // GET
|
|
17
|
+
Buffer.from([0x50, 0x4f, 0x53, 0x54]), // POST
|
|
18
|
+
Buffer.from([0xee, 0xee, 0xee, 0xee]), // eeee
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* Initialize MTProto obfuscation layer.
|
|
22
|
+
* Generates random 64-byte header and derives encryption keys.
|
|
23
|
+
*
|
|
24
|
+
* @param secret - 16-byte secret from proxy
|
|
25
|
+
* @param dcId - Telegram datacenter ID
|
|
26
|
+
* @param protocolTag - Transport protocol tag (default: INTERMEDIATE)
|
|
27
|
+
* @returns Header buffer and encryptor/decryptor ciphers
|
|
28
|
+
*/
|
|
29
|
+
export function initObfuscation(secret, dcId, protocolTag = PROTO_TAG.INTERMEDIATE) {
|
|
30
|
+
if (secret.length !== 16) {
|
|
31
|
+
throw new Error('Secret must be 16 bytes');
|
|
32
|
+
}
|
|
33
|
+
// Generate 64 random bytes, avoiding reserved patterns
|
|
34
|
+
let random;
|
|
35
|
+
while (true) {
|
|
36
|
+
random = randomBytes(64);
|
|
37
|
+
// Check if first byte is not 0xef
|
|
38
|
+
if (random[0] === 0xef)
|
|
39
|
+
continue;
|
|
40
|
+
// Check if bytes 4-8 are not all zeros
|
|
41
|
+
if (random.slice(4, 8).equals(Buffer.alloc(4)))
|
|
42
|
+
continue;
|
|
43
|
+
// Check if first 4 bytes don't match reserved keywords
|
|
44
|
+
const isReserved = RESERVED_KEYWORDS.some((keyword) => keyword.equals(random.slice(0, 4)));
|
|
45
|
+
if (isReserved)
|
|
46
|
+
continue;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
// Convert to mutable buffer
|
|
50
|
+
const header = Buffer.from(random);
|
|
51
|
+
// Reverse bytes 8-56 for decryption key derivation
|
|
52
|
+
const reversed = Buffer.from(header.slice(8, 56)).reverse();
|
|
53
|
+
// Derive encryption key and IV
|
|
54
|
+
const encryptKey = createHash('sha256')
|
|
55
|
+
.update(Buffer.concat([header.slice(8, 40), secret]))
|
|
56
|
+
.digest(); // 32 bytes
|
|
57
|
+
const encryptIv = header.slice(40, 56); // 16 bytes
|
|
58
|
+
// Derive decryption key and IV
|
|
59
|
+
const decryptKey = createHash('sha256')
|
|
60
|
+
.update(Buffer.concat([reversed.slice(0, 32), secret]))
|
|
61
|
+
.digest();
|
|
62
|
+
const decryptIv = reversed.slice(32, 48);
|
|
63
|
+
// Create AES-256-CTR ciphers
|
|
64
|
+
const encryptor = new AESCTR(encryptKey, encryptIv);
|
|
65
|
+
const decryptor = new AESCTR(decryptKey, decryptIv);
|
|
66
|
+
// Encode protocol tag and DC ID at positions 56-62
|
|
67
|
+
protocolTag.copy(header, 56);
|
|
68
|
+
// DC ID as signed 16-bit little-endian
|
|
69
|
+
header.writeInt16LE(dcId, 60);
|
|
70
|
+
// Encrypt the tail (tag + dc ID) in place. The cipher stream position must
|
|
71
|
+
// be 56 here: the proxy decrypts the whole 64-byte frame from position 0 and
|
|
72
|
+
// expects the tag to appear at bytes 56-60. Encrypting the whole header and
|
|
73
|
+
// taking the tail (as official clients do) yields exactly that.
|
|
74
|
+
const encryptedTail = encryptor.encrypt(header).subarray(56);
|
|
75
|
+
encryptedTail.copy(header, 56);
|
|
76
|
+
return { header, encryptor, decryptor };
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=obfuscation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obfuscation.js","sourceRoot":"","sources":["../../src/mtproto/obfuscation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface SOCKS5Options {
|
|
2
|
+
host: string;
|
|
3
|
+
port: number;
|
|
4
|
+
username?: string;
|
|
5
|
+
password?: string;
|
|
6
|
+
timeout?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Simple SOCKS5 client for testing proxy connectivity.
|
|
10
|
+
* Connects to Telegram servers through SOCKS5 proxy.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SOCKS5Client {
|
|
13
|
+
private options;
|
|
14
|
+
private socket;
|
|
15
|
+
private connected;
|
|
16
|
+
constructor(options: SOCKS5Options);
|
|
17
|
+
/**
|
|
18
|
+
* Connect to SOCKS5 proxy and authenticate.
|
|
19
|
+
*/
|
|
20
|
+
connect(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Authenticate with username/password.
|
|
23
|
+
*/
|
|
24
|
+
private authenticate;
|
|
25
|
+
/**
|
|
26
|
+
* Test connection by connecting to Telegram server through SOCKS5.
|
|
27
|
+
*
|
|
28
|
+
* @returns True if connection successful
|
|
29
|
+
*/
|
|
30
|
+
testConnection(): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Close the connection.
|
|
33
|
+
*/
|
|
34
|
+
close(): void;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=socks5.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socks5.d.ts","sourceRoot":"","sources":["../../src/mtproto/socks5.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,YAAY;IAIX,OAAO,CAAC,OAAO;IAH3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAkB;gBAEf,OAAO,EAAE,aAAa;IAI1C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4D9B;;OAEG;YACW,YAAY;IA2B1B;;;;OAIG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IA0CxC;;OAEG;IACH,KAAK,IAAI,IAAI;CAMd"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { Socket } from 'net';
|
|
2
|
+
/**
|
|
3
|
+
* Simple SOCKS5 client for testing proxy connectivity.
|
|
4
|
+
* Connects to Telegram servers through SOCKS5 proxy.
|
|
5
|
+
*/
|
|
6
|
+
export class SOCKS5Client {
|
|
7
|
+
options;
|
|
8
|
+
socket;
|
|
9
|
+
connected = false;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.options = options;
|
|
12
|
+
this.socket = new Socket();
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Connect to SOCKS5 proxy and authenticate.
|
|
16
|
+
*/
|
|
17
|
+
async connect() {
|
|
18
|
+
const { host, port, username, password, timeout = 10000 } = this.options;
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
const timer = setTimeout(() => {
|
|
21
|
+
this.socket.destroy();
|
|
22
|
+
reject(new Error('Connection timeout'));
|
|
23
|
+
}, timeout);
|
|
24
|
+
this.socket.on('error', (err) => {
|
|
25
|
+
clearTimeout(timer);
|
|
26
|
+
reject(err);
|
|
27
|
+
});
|
|
28
|
+
this.socket.connect(port, host, () => {
|
|
29
|
+
clearTimeout(timer);
|
|
30
|
+
// SOCKS5 handshake
|
|
31
|
+
const authMethods = username && password ? [0x00, 0x02] : [0x00]; // No auth or Username/Password
|
|
32
|
+
const handshake = Buffer.from([
|
|
33
|
+
0x05, // SOCKS version 5
|
|
34
|
+
authMethods.length, // Number of methods
|
|
35
|
+
...authMethods,
|
|
36
|
+
]);
|
|
37
|
+
this.socket.write(handshake);
|
|
38
|
+
this.socket.once('data', async (data) => {
|
|
39
|
+
try {
|
|
40
|
+
// Check SOCKS5 response
|
|
41
|
+
if (data[0] !== 0x05) {
|
|
42
|
+
throw new Error('Invalid SOCKS5 response');
|
|
43
|
+
}
|
|
44
|
+
const authMethod = data[1];
|
|
45
|
+
// If username/password auth required
|
|
46
|
+
if (authMethod === 0x02) {
|
|
47
|
+
if (!username || !password) {
|
|
48
|
+
throw new Error('Authentication required but not provided');
|
|
49
|
+
}
|
|
50
|
+
await this.authenticate(username, password);
|
|
51
|
+
}
|
|
52
|
+
else if (authMethod === 0x00) {
|
|
53
|
+
// No authentication required
|
|
54
|
+
this.connected = true;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
throw new Error('Unsupported authentication method');
|
|
58
|
+
}
|
|
59
|
+
resolve();
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
this.socket.destroy();
|
|
63
|
+
reject(err);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Authenticate with username/password.
|
|
71
|
+
*/
|
|
72
|
+
async authenticate(username, password) {
|
|
73
|
+
return new Promise((resolve, reject) => {
|
|
74
|
+
const userBuf = Buffer.from(username, 'utf8');
|
|
75
|
+
const passBuf = Buffer.from(password, 'utf8');
|
|
76
|
+
const authPacket = Buffer.concat([
|
|
77
|
+
Buffer.from([0x01]), // Auth version
|
|
78
|
+
Buffer.from([userBuf.length]),
|
|
79
|
+
userBuf,
|
|
80
|
+
Buffer.from([passBuf.length]),
|
|
81
|
+
passBuf,
|
|
82
|
+
]);
|
|
83
|
+
this.socket.write(authPacket);
|
|
84
|
+
this.socket.once('data', (data) => {
|
|
85
|
+
if (data[0] === 0x01 && data[1] === 0x00) {
|
|
86
|
+
this.connected = true;
|
|
87
|
+
resolve();
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this.socket.destroy();
|
|
91
|
+
reject(new Error('Authentication failed'));
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Test connection by connecting to Telegram server through SOCKS5.
|
|
98
|
+
*
|
|
99
|
+
* @returns True if connection successful
|
|
100
|
+
*/
|
|
101
|
+
async testConnection() {
|
|
102
|
+
if (!this.connected) {
|
|
103
|
+
throw new Error('Not connected to SOCKS5 proxy');
|
|
104
|
+
}
|
|
105
|
+
return new Promise((resolve) => {
|
|
106
|
+
// Connect to Telegram server
|
|
107
|
+
const telegramHost = '149.154.167.50'; // DC 2
|
|
108
|
+
const telegramPort = 443;
|
|
109
|
+
const hostBuf = Buffer.from(telegramHost, 'utf8');
|
|
110
|
+
const connectCmd = Buffer.concat([
|
|
111
|
+
Buffer.from([
|
|
112
|
+
0x05, // SOCKS version
|
|
113
|
+
0x01, // Connect command
|
|
114
|
+
0x00, // Reserved
|
|
115
|
+
0x03, // Domain name
|
|
116
|
+
hostBuf.length, // Domain length
|
|
117
|
+
]),
|
|
118
|
+
hostBuf,
|
|
119
|
+
Buffer.from([
|
|
120
|
+
(telegramPort >> 8) & 0xff, // Port high byte
|
|
121
|
+
telegramPort & 0xff, // Port low byte
|
|
122
|
+
]),
|
|
123
|
+
]);
|
|
124
|
+
this.socket.write(connectCmd);
|
|
125
|
+
this.socket.once('data', (data) => {
|
|
126
|
+
// Check SOCKS5 response
|
|
127
|
+
if (data[0] === 0x05 && data[1] === 0x00) {
|
|
128
|
+
// Success
|
|
129
|
+
resolve(true);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
resolve(false);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
setTimeout(() => resolve(false), 5000);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Close the connection.
|
|
140
|
+
*/
|
|
141
|
+
close() {
|
|
142
|
+
if (this.socket) {
|
|
143
|
+
this.socket.destroy();
|
|
144
|
+
this.connected = false;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=socks5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socks5.js","sourceRoot":"","sources":["../../src/mtproto/socks5.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type of Telegram proxy.
|
|
3
|
+
*/
|
|
4
|
+
export type ProxyType = 'mtproto' | 'socks5' | 'http';
|
|
5
|
+
/**
|
|
6
|
+
* Base proxy interface.
|
|
7
|
+
*/
|
|
8
|
+
export interface BaseProxy {
|
|
9
|
+
readonly type: ProxyType;
|
|
10
|
+
readonly server: string;
|
|
11
|
+
readonly port: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* MTProto proxy configuration.
|
|
15
|
+
*/
|
|
16
|
+
export interface MTProtoProxy extends BaseProxy {
|
|
17
|
+
readonly type: 'mtproto';
|
|
18
|
+
readonly secret: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* SOCKS5 proxy configuration.
|
|
22
|
+
*/
|
|
23
|
+
export interface SOCKS5Proxy extends BaseProxy {
|
|
24
|
+
readonly type: 'socks5';
|
|
25
|
+
readonly username?: string;
|
|
26
|
+
readonly password?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* HTTP proxy configuration.
|
|
30
|
+
*/
|
|
31
|
+
export interface HTTPProxy extends BaseProxy {
|
|
32
|
+
readonly type: 'http';
|
|
33
|
+
readonly username?: string;
|
|
34
|
+
readonly password?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Union type for all proxy types.
|
|
38
|
+
*/
|
|
39
|
+
export type TelegramProxy = MTProtoProxy | SOCKS5Proxy | HTTPProxy;
|
|
40
|
+
/**
|
|
41
|
+
* Result of a proxy check operation.
|
|
42
|
+
*/
|
|
43
|
+
export interface CheckResult {
|
|
44
|
+
readonly proxy: TelegramProxy;
|
|
45
|
+
readonly success: boolean;
|
|
46
|
+
readonly latency?: number;
|
|
47
|
+
readonly error?: string;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { TelegramProxy, CheckResult } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Format latency with color.
|
|
4
|
+
*/
|
|
5
|
+
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
|
+
*/
|
|
13
|
+
export declare const formatProxyAddress: (proxy: TelegramProxy) => string;
|
|
14
|
+
/**
|
|
15
|
+
* Print live result with in-place update.
|
|
16
|
+
*/
|
|
17
|
+
export declare const printPingResult: (proxyIndex: number, proxies: readonly TelegramProxy[], sequence: number, status: "testing" | "done", result?: CheckResult) => void;
|
|
18
|
+
/**
|
|
19
|
+
* Print statistics table for all proxies.
|
|
20
|
+
*/
|
|
21
|
+
export declare const printPingStatistics: (proxies: readonly TelegramProxy[], allResults: readonly (readonly CheckResult[])[]) => void;
|
|
22
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import Table from 'cli-table3';
|
|
3
|
+
import readline from 'readline';
|
|
4
|
+
/**
|
|
5
|
+
* Format latency with color.
|
|
6
|
+
*/
|
|
7
|
+
export const formatLatency = (latency) => {
|
|
8
|
+
if (latency < 100) {
|
|
9
|
+
return chalk.green(`${latency}ms`);
|
|
10
|
+
}
|
|
11
|
+
else if (latency < 300) {
|
|
12
|
+
return chalk.yellow(`${latency}ms`);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
return chalk.red(`${latency}ms`);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Format proxy type with color.
|
|
20
|
+
*/
|
|
21
|
+
export const formatProxyType = (type) => {
|
|
22
|
+
switch (type) {
|
|
23
|
+
case 'mtproto':
|
|
24
|
+
return chalk.cyan('MTProto');
|
|
25
|
+
case 'socks5':
|
|
26
|
+
return chalk.magenta('SOCKS5');
|
|
27
|
+
case 'http':
|
|
28
|
+
return chalk.blue('HTTP');
|
|
29
|
+
default:
|
|
30
|
+
return chalk.dim(type);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Format proxy address.
|
|
35
|
+
*/
|
|
36
|
+
export const formatProxyAddress = (proxy) => {
|
|
37
|
+
const server = proxy.server.length > 30 ? proxy.server.substring(0, 27) + '...' : proxy.server;
|
|
38
|
+
return `${server}:${proxy.port}`;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Print live result with in-place update.
|
|
42
|
+
*/
|
|
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...')}`;
|
|
52
|
+
}
|
|
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
|
+
}
|
|
64
|
+
}
|
|
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);
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Print statistics table for all proxies.
|
|
72
|
+
*/
|
|
73
|
+
export const printPingStatistics = (proxies, allResults) => {
|
|
74
|
+
console.log();
|
|
75
|
+
console.log(chalk.gray('━'.repeat(50)));
|
|
76
|
+
console.log();
|
|
77
|
+
console.log(chalk.bold.cyan('📊 Statistics'));
|
|
78
|
+
console.log();
|
|
79
|
+
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
|
+
}
|
|
94
|
+
});
|
|
95
|
+
proxies.forEach((proxy, index) => {
|
|
96
|
+
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 = '-';
|
|
105
|
+
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
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const lossColor = loss === 0 ? chalk.green : chalk.red;
|
|
117
|
+
table.push([
|
|
118
|
+
proxyStr,
|
|
119
|
+
typeStr,
|
|
120
|
+
chalk.white(transmitted),
|
|
121
|
+
chalk.green(received),
|
|
122
|
+
lossColor(`${loss}%`),
|
|
123
|
+
minStr,
|
|
124
|
+
avgStr,
|
|
125
|
+
maxStr
|
|
126
|
+
]);
|
|
127
|
+
});
|
|
128
|
+
console.log(table.toString());
|
|
129
|
+
console.log();
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@erfan_bahramali/tping",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Ping for Telegram Proxies - Test connectivity to Telegram Proxies (MTProto, SOCKS5)",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"telegram",
|
|
7
|
+
"mtproto",
|
|
8
|
+
"proxy",
|
|
9
|
+
"checker",
|
|
10
|
+
"cli",
|
|
11
|
+
"validator",
|
|
12
|
+
"ping",
|
|
13
|
+
"connection-test",
|
|
14
|
+
"network-tool"
|
|
15
|
+
],
|
|
16
|
+
"author": "Erfan Bahramali",
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/ErfanBahramali/tping.git"
|
|
21
|
+
},
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/ErfanBahramali/tping/issues"
|
|
24
|
+
},
|
|
25
|
+
"homepage": "https://github.com/ErfanBahramali/tping#readme",
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=18.0.0"
|
|
28
|
+
},
|
|
29
|
+
"type": "module",
|
|
30
|
+
"main": "./dist/index.js",
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"bin": {
|
|
33
|
+
"tping": "dist/index.js"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"dev": "bun src/index.ts",
|
|
37
|
+
"clean": "bun run rm -rf dist",
|
|
38
|
+
"prebuild": "bun run clean",
|
|
39
|
+
"build": "bun tsc",
|
|
40
|
+
"prepublishOnly": "bun run build"
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"dist",
|
|
44
|
+
"README.md",
|
|
45
|
+
"LICENSE"
|
|
46
|
+
],
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"chalk": "^5.4.1",
|
|
49
|
+
"cli-table3": "^0.6.5",
|
|
50
|
+
"commander": "^14.0.3"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@types/node": "^22.10.5",
|
|
54
|
+
"bun-types": "^1.4.0",
|
|
55
|
+
"typescript": "^5.9.3"
|
|
56
|
+
}
|
|
57
|
+
}
|