Files
NetMesh/electron/bridges/terminalBridge.workerSessionLogMirror.test.cjs

113 lines
4.0 KiB
JavaScript
Raw Normal View History

const test = require("node:test");
const assert = require("node:assert/strict");
const fs = require("node:fs");
const path = require("node:path");
const terminalBridge = require("./terminalBridge.cjs");
const sessionLogStreamManager = require("./sessionLogStreamManager.cjs");
const TEMP_ROOT = path.join(__dirname, ".tmp-terminal-bridge-worker-log-mirror-tests");
function registerWorkerHandlers(sent) {
const listeners = new Map();
const handlers = new Map();
terminalBridge.registerHandlers(
{
handle(channel, handler) {
handlers.set(channel, handler);
},
on(channel, listener) {
listeners.set(channel, listener);
},
},
{
terminalWorkerManager: {
request: async () => ({}),
send(channel, payload, options) {
sent.push([channel, payload, options]);
},
},
},
);
return { listeners, handlers };
}
test("worker-mode write forward still delivers the payload to the worker", () => {
const sent = [];
const { listeners } = registerWorkerHandlers(sent);
const write = listeners.get("netcatty:write");
write({ sender: { id: 7 } }, { sessionId: "session-x", data: "ls\r" });
assert.deepEqual(sent, [
["netcatty:write", { sessionId: "session-x", data: "ls\r" }, { webContentsId: 7 }],
]);
});
test("worker-mode write forward mirrors sudo autofill rewrites into main-process session logs", async () => {
const directory = path.join(TEMP_ROOT, `sudo-${Date.now()}-${Math.random().toString(16).slice(2)}`);
const filePath = path.join(directory, "manual.log");
const sessionId = `session-${Date.now()}-${Math.random().toString(16).slice(2)}`;
const sent = [];
const { listeners } = registerWorkerHandlers(sent);
const write = listeners.get("netcatty:write");
try {
const startResult = sessionLogStreamManager.startStreamToFile(sessionId, {
filePath,
format: "raw",
hostLabel: "manual",
stopRequiresToken: true,
});
assert.equal(startResult.ok, true);
const prepared = "sudo -p '[sudo] password for %p: __NETCATTY_SUDO_abc123__' apt update\r";
write({ sender: { id: 7 } }, { sessionId, data: prepared });
assert.equal(sent.length, 1);
// The remote echo of the prepared command arrives as terminal output.
sessionLogStreamManager.appendData(sessionId, `${prepared}\n`);
const finalPath = await sessionLogStreamManager.stopStream(sessionId, startResult.token);
assert.equal(finalPath, filePath);
assert.equal(fs.readFileSync(filePath, "utf8"), "sudo apt update\r\n");
} finally {
await sessionLogStreamManager.cleanupAll();
fs.rmSync(directory, { recursive: true, force: true });
}
});
test("worker-mode write forward mirrors programmatic command rewrites into main-process session logs", async () => {
const directory = path.join(TEMP_ROOT, `programmatic-${Date.now()}-${Math.random().toString(16).slice(2)}`);
const filePath = path.join(directory, "manual.log");
const sessionId = `session-${Date.now()}-${Math.random().toString(16).slice(2)}`;
const sent = [];
const { listeners } = registerWorkerHandlers(sent);
const write = listeners.get("netcatty:write");
try {
const startResult = sessionLogStreamManager.startStreamToFile(sessionId, {
filePath,
format: "raw",
hostLabel: "manual",
stopRequiresToken: true,
});
assert.equal(startResult.ok, true);
write({ sender: { id: 7 } }, {
sessionId,
data: " netcatty-internal-reload\r",
logRewrite: { sentCommand: " netcatty-internal-reload", displayCommand: "" },
});
sessionLogStreamManager.appendData(sessionId, " netcatty-internal-reload\r\nuser@host:~$ ");
const finalPath = await sessionLogStreamManager.stopStream(sessionId, startResult.token);
assert.equal(finalPath, filePath);
assert.equal(fs.readFileSync(filePath, "utf8"), "\r\nuser@host:~$ ");
} finally {
await sessionLogStreamManager.cleanupAll();
fs.rmSync(directory, { recursive: true, force: true });
}
});