-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient.ts
More file actions
77 lines (68 loc) · 2.62 KB
/
Copy pathclient.ts
File metadata and controls
77 lines (68 loc) · 2.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import WebSocket from "ws";
import { EventEmitter } from "events";
interface ZigoxyClientOptions {
serverHost: string;
serverPort: number;
localPort: number;
secure?: boolean;
}
export class ZigoxyClient extends EventEmitter {
private serverHost: string;
private serverPort: number;
private localPort: number;
private secure: boolean;
private controlSocket: WebSocket | null = null;
constructor(options: ZigoxyClientOptions) {
super();
this.serverHost = options.serverHost;
this.serverPort = options.serverPort;
this.localPort = options.localPort;
this.secure = options.secure ?? false;
}
async connect(): Promise<void> {
return new Promise((resolve, reject) => {
const protocol = this.secure ? "wss" : "ws";
const wsUrl = `${protocol}://${this.serverHost}:${this.serverPort}?port=${this.localPort}`;
this.controlSocket = new WebSocket(wsUrl);
this.controlSocket.on("open", () => {
console.log("Connected to zigoxy server");
resolve();
});
this.controlSocket.on("message", (data) => {
try {
const message = JSON.parse(data.toString());
if (message.subdomain) {
console.log(`✨ Tunnel created!`);
const domain = message.domain || `${message.subdomain}.${this.serverHost}`;
const protocol = this.secure ? "https" : "http";
const portSuffix = this.secure
? this.serverPort !== 443
? `:${this.serverPort}`
: ""
: this.serverPort !== 80
? `:${this.serverPort}`
: "";
console.log(
`🔗 Access your service at: ${protocol}://${domain}${portSuffix}`
);
}
} catch (err) {
console.error("Failed to parse server message:", err);
}
});
this.controlSocket.on("error", (err) => {
console.error("Control socket error:", err);
reject(err);
});
this.controlSocket.on("close", () => {
console.log("Disconnected from zigoxy server");
});
});
}
disconnect() {
if (this.controlSocket) {
this.controlSocket.close();
this.controlSocket = null;
}
}
}