-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnode-pty-server.js
More file actions
77 lines (60 loc) · 1.82 KB
/
node-pty-server.js
File metadata and controls
77 lines (60 loc) · 1.82 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 http from "http";
import { WebSocketServer } from "ws";
import os from "os";
import pty from "node-pty";
let sharedPtyProcess = null;
let sharedTerminalMode = false;
const shell = os.platform() === "win32" ? "pwsh.exe" : "bash";
const spawnShell = () => {
return pty.spawn(shell, [], {
name: "xterm-color",
env: process.env,
});
};
const setSharedTerminalMode = (useSharedTerminal) => {
sharedTerminalMode = useSharedTerminal;
if (sharedTerminalMode && !sharedPtyProcess) {
sharedPtyProcess = spawnShell();
}
};
const handleTerminalConnection = (ws) => {
let ptyProcess = sharedTerminalMode ? sharedPtyProcess : spawnShell();
ws.on("message", (command) => {
const processedCommand = commandProcessor(command);
ptyProcess.write(processedCommand);
});
ptyProcess.on("data", (rawOutput) => {
const processedOutput = outputProcessor(rawOutput);
ws.send(processedOutput);
});
ws.on("close", () => {
if (!sharedTerminalMode) {
ptyProcess.kill();
}
});
};
// Utility function to process commands
const commandProcessor = (command) => {
return command;
};
// Utility function to process output
const outputProcessor = (output) => {
return output;
};
/* Host ws node-pty server */
setSharedTerminalMode(false); // Set this to false to allow a shared session
const port = 6060;
export function createTerminalServer() {
const server = http.createServer((req, res) => {});
const wss = new WebSocketServer({ noServer: true });
wss.on("connection", handleTerminalConnection);
server.on("upgrade", (request, socket, head) => {
wss.handleUpgrade(request, socket, head, (ws) => {
wss.emit("connection", ws, request);
});
});
server.listen(port, () => {
console.log(`HTTP and WebSocket server is running on port ${port}`);
});
}
createTerminalServer()