[Init] Initial commit - NetMesh terminal manager
Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled

This commit is contained in:
2026-09-13 18:24:01 +08:00
commit 3c72efcb7f
3255 changed files with 907009 additions and 0 deletions

View File

@@ -0,0 +1,88 @@
"use strict";
const TERMINAL_OUTPUT_PORT_CHANNEL = "netcatty:terminal-output-port";
function createTerminalOutputChannel(options = {}) {
const MessageChannelMain = options.MessageChannelMain;
const sessions = new Map();
function closeEntry(entry) {
try {
entry?.port?.close?.();
} catch {
// Ignore close races while tearing down a terminal output route.
}
}
function openSession(sessionId, webContents, openOptions = {}) {
if (!sessionId || !webContents || typeof MessageChannelMain !== "function") {
return false;
}
const { port1, port2 } = new MessageChannelMain();
const transferToWorker = openOptions.transferToWorker === true;
const replacement = {
port: port1,
webContentsId: webContents.id,
transferToWorker,
};
try {
webContents.postMessage(TERMINAL_OUTPUT_PORT_CHANNEL, { sessionId }, [port2]);
} catch (error) {
closeEntry(replacement);
try { port2?.close?.(); } catch {}
throw error;
}
const previous = sessions.get(sessionId);
sessions.set(sessionId, replacement);
closeEntry(previous);
return transferToWorker ? port1 : true;
}
function send(sessionId, data, meta) {
if (!sessionId || !data) return false;
const entry = sessions.get(sessionId);
if (!entry || entry.transferToWorker) return false;
entry.port.postMessage(meta ? { sessionId, data, meta } : { sessionId, data });
return true;
}
function drainSession(sessionId, requestId) {
const entry = sessions.get(sessionId);
if (!entry || entry.transferToWorker || !requestId) return false;
try {
entry.port.postMessage({ kind: "drain", sessionId, requestId });
return true;
} catch {
return false;
}
}
function closeSession(sessionId) {
const entry = sessions.get(sessionId);
if (!entry) return;
closeEntry(entry);
sessions.delete(sessionId);
}
function closeAll() {
for (const entry of sessions.values()) {
closeEntry(entry);
}
sessions.clear();
}
return {
openSession,
send,
drainSession,
closeSession,
closeAll,
getSessionForTest: (sessionId) => sessions.get(sessionId),
};
}
module.exports = {
TERMINAL_OUTPUT_PORT_CHANNEL,
createTerminalOutputChannel,
};