-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmobile-relay.js
114 lines (95 loc) · 2.98 KB
/
mobile-relay.js
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
const WebSocket = require('ws');
const http = require('http');
const https = require('https');
const wsServerUrl = 'wss://websocket-server-6smo.onrender.com';
const lanServerUrl = 'http://172.18.8.72:8080/';
const reconnectInterval = 5000; // 5 seconds
const requestTimeout = 30000; // 30 seconds
let ws = null;
let reconnectTimeout = null;
function connectWebSocket() {
ws = new WebSocket(wsServerUrl);
ws.on('open', () => {
console.log("Connected to WebSocket Mainframe");
ws.send(JSON.stringify({ auth: '' }));
if (reconnectTimeout) {
clearTimeout(reconnectTimeout);
reconnectTimeout = null;
}
});
ws.on('message', async (data) => {
try {
const request = JSON.parse(data);
console.log('Received request:', request);
if (!request.id || !request.method || !request.url) {
throw new Error("Invalid request format: Missing 'id', 'method', or 'url'");
}
const response = await makeHttpRequest(
request.method,
lanServerUrl + request.url,
request.headers || {},
request.body || null
);
response.id = request.id;
ws.send(JSON.stringify(response)); // Send response back via WebSocket
} catch (error) {
console.error('Request error:', error);
ws.send(
JSON.stringify({
id: 'random' || null,
status: 500,
data: error.message,
})
);
}
});
ws.on('close', () => {
console.log('WebSocket connection closed');
reconnectTimeout = setTimeout(connectWebSocket, reconnectInterval);
});
ws.on('error', (error) => {
console.error('WebSocket error:', error);
});
}
function makeHttpRequest(method, url, headers, body) {
return new Promise((resolve, reject) => {
const parsedUrl = new URL(url);
const options = {
method: method,
headers: headers,
timeout: requestTimeout,
};
const req = parsedUrl.protocol === 'https:' ? https.request(parsedUrl, options) : http.request(parsedUrl, options);
req.on('timeout', () => {
req.destroy();
reject(new Error('Request timeout'));
});
if (body) {
req.write(typeof body === 'string' ? body : JSON.stringify(body));
}
req.on('response', (res) => {
const chunks = [];
res.on('data', (chunk) => chunks.push(chunk));
res.on('end', () => {
const data = Buffer.concat(chunks);
const contentType = res.headers['content-type'];
if (contentType && (contentType.includes('image') || contentType.includes('application/pdf'))) {
resolve({
status: res.statusCode,
headers: res.headers,
data: data.toString('base64'), // Encode binary data as base64
});
} else {
resolve({
status: res.statusCode,
headers: res.headers,
data: data.toString(),
});
}
});
});
req.on('error', (error) => reject(error));
req.end();
});
}
connectWebSocket();