-
Notifications
You must be signed in to change notification settings - Fork 114
Expand file tree
/
Copy pathexample.js
More file actions
159 lines (143 loc) · 4.15 KB
/
example.js
File metadata and controls
159 lines (143 loc) · 4.15 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
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
const webSocket = require('ws');
const url = process.argv[2];
console.log('Received URL params:', url);
let ws = null;
let webSocketReady = false;
let taskData = null;
let heartBeatTimer = null;
// 心跳包定时发送
function sendHeartBeat() {
if (heartBeatTimer) {
clearInterval(heartBeatTimer);
}
heartBeatTimer = setInterval(() => {
if (ws && ws.readyState === webSocket.OPEN) {
const heartBeatMessage = JSON.stringify({
type: 'heart_beat'
});
ws.send(heartBeatMessage);
}
}, 5000); // 每 5 秒发送一次心跳包
}
function sendRequestTaskData() {
if (ws.readyState === webSocket.OPEN) {
const requestTaskDataMessage = JSON.stringify({
type: 'request_task_data',
data: ''
});
ws.send(requestTaskDataMessage);
}
}
function sendTaskLog(log) {
if (ws.readyState === webSocket.OPEN) {
const taskLogMessage = JSON.stringify({
type: 'task_log',
message: log
});
ws.send(taskLogMessage);
}
}
function sendTaskCompleted(taskName,success,message) {
if (ws.readyState === webSocket.OPEN) {
const taskCompletedMessage = JSON.stringify({
type: 'task_completed',
taskName,
success,
message
});
ws.send(taskCompletedMessage);
}
}
function sendTerminateProcess() {
if (ws.readyState === webSocket.OPEN) {
const terminateProcessMessage = JSON.stringify({
type: 'terminate_process'
});
ws.send(terminateProcessMessage);
}
}
function exit() {
ws.close();
process.exit(0);
}
function initWebSocket() {
try {
if (ws) {
ws.removeAllListeners();
ws.close();
}
} catch {}
ws = new webSocket(url);
ws.on('open', () => {
webSocketReady = true;
sendHeartBeat();
sendRequestTaskData();
});
ws.on('message', (message) => {
let data = JSON.parse(message);
switch (data.type) {
case 'heart_beat':
console.log('Received heartbeat from server');
break;
case 'request_task_data':
console.log('Received task payload:', data);
taskData = data.data;
break;
case 'terminate_process':
sendTerminateProcess();
exit();
default:
break;
}
});
ws.on('close', () => {
webSocketReady = false;
});
ws.on('error', (error) => {
console.error('WebSocket connection error:', error);
webSocketReady = false;
try { ws.close(); } catch {}
});
}
initWebSocket();
// 定时检查连接状态,如果连接断开则重连
setInterval(() => {
if (!ws || ws.readyState === webSocket.CLOSED) {
console.log('WebSocket disconnected; attempting to reconnect...');
initWebSocket();
}
}, 5000); // 每 5 秒检查一次连接状态
// 进行任务时,需要发送心跳包,接收任务数据,发送任务日志,完成任务
// 进行任务逻辑
async function runTask() {
console.log('Task starting');
const startTime = Date.now();
// 模拟任务执行
while (true) {
await new Promise((resolve) => {
setTimeout(resolve, 5000);
});
sendTaskLog('Task running...');
if(Date.now()-startTime>10000){
break;
}
}
console.log('Task finished');
sendTaskCompleted('sample task',true,'Task completed successfully');
exit();
}
(async () => {
while (true) {
if (webSocketReady) {
// console.log('发送任务日志');
sendRequestTaskData();
if (taskData) {
sendTaskLog('Task log content: test');
await runTask();
}
}
await new Promise((resolve) => {
setTimeout(resolve, 1000);
});
}
})();