-
-
Notifications
You must be signed in to change notification settings - Fork 196
Expand file tree
/
Copy pathprocess-manager.js
More file actions
128 lines (108 loc) · 3.5 KB
/
Copy pathprocess-manager.js
File metadata and controls
128 lines (108 loc) · 3.5 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
import { spawn } from "child_process";
import { LogBuffer } from "./log-buffer.js";
export function createProcessManager() {
let childProcess = null;
const terminalLogs = new LogBuffer();
function start(phoenixDesktopPath) {
if (childProcess) {
throw new Error("Phoenix is already running. Stop it first.");
}
return new Promise((resolve, reject) => {
const child = spawn("npm", ["run", "serve:electron"], {
cwd: phoenixDesktopPath,
shell: true,
stdio: ["ignore", "pipe", "pipe"],
env: { ...process.env }
});
childProcess = child;
child.stdout.on("data", (data) => {
const text = data.toString();
terminalLogs.push({
stream: "stdout",
text,
timestamp: new Date().toISOString()
});
});
child.stderr.on("data", (data) => {
const text = data.toString();
terminalLogs.push({
stream: "stderr",
text,
timestamp: new Date().toISOString()
});
});
child.on("error", (err) => {
terminalLogs.push({
stream: "stderr",
text: `Process error: ${err.message}`,
timestamp: new Date().toISOString()
});
childProcess = null;
reject(err);
});
child.on("exit", (code, signal) => {
terminalLogs.push({
stream: "stderr",
text: `Process exited with code=${code} signal=${signal}`,
timestamp: new Date().toISOString()
});
childProcess = null;
});
// Give the process a moment to start or fail
setTimeout(() => {
if (childProcess) {
resolve({ pid: child.pid });
}
}, 500);
});
}
function stop() {
return new Promise((resolve) => {
if (!childProcess) {
resolve({ success: true, message: "No process running" });
return;
}
const child = childProcess;
let killed = false;
const forceKillTimeout = setTimeout(() => {
if (childProcess === child) {
child.kill("SIGKILL");
killed = true;
}
}, 5000);
child.on("exit", () => {
clearTimeout(forceKillTimeout);
childProcess = null;
resolve({ success: true, forced: killed });
});
child.kill("SIGTERM");
});
}
function isRunning() {
return childProcess !== null;
}
function getPid() {
return childProcess ? childProcess.pid : null;
}
function getTerminalLogs(sinceLast) {
if (sinceLast) {
return terminalLogs.getSinceLastRead();
}
return terminalLogs.getAll();
}
function clearTerminalLogs() {
terminalLogs.clear();
}
function getTerminalLogsTotalPushed() {
return terminalLogs.totalPushed();
}
return {
start,
stop,
isRunning,
getPid,
getTerminalLogs,
clearTerminalLogs,
getTerminalLogsTotalPushed
};
}