Files
Netcatty/electron/preload/terminalDataBacklog.cjs
T
2026-06-26 15:22:52 +08:00

85 lines
1.9 KiB
JavaScript

"use strict";
function createTerminalDataBacklog(options = {}) {
const maxBytesPerSession = options.maxBytesPerSession ?? 64 * 1024;
const pendingBySession = new Map();
function trimToLimit(value) {
if (value.length <= maxBytesPerSession) return value;
return value.slice(value.length - maxBytesPerSession);
}
function append(sessionId, data) {
if (!sessionId || !data) return;
const previous = pendingBySession.get(sessionId) || "";
pendingBySession.set(sessionId, trimToLimit(previous + data));
}
function take(sessionId) {
const data = pendingBySession.get(sessionId) || "";
pendingBySession.delete(sessionId);
return data;
}
function clear(sessionId) {
pendingBySession.delete(sessionId);
}
function size(sessionId) {
return pendingBySession.get(sessionId)?.length ?? 0;
}
return {
append,
take,
clear,
size,
};
}
function hasSessionListeners(listenersBySession, sessionId) {
return (listenersBySession.get(sessionId)?.size ?? 0) > 0;
}
function createTerminalDataDispatcher({
dataListeners,
displayDataListeners,
terminalDataBacklog,
onCallbackError = console.error,
}) {
return function deliverToListeners(sessionId, data) {
if (!data) return;
if (!hasSessionListeners(displayDataListeners, sessionId)) {
terminalDataBacklog?.append?.(sessionId, data);
}
const set = dataListeners.get(sessionId);
if (!set || set.size === 0) return;
set.forEach((cb) => {
try {
cb(data);
} catch (err) {
onCallbackError("Data callback failed", err);
}
});
};
}
function clearTerminalDataSession({
dataListeners,
displayDataListeners,
terminalDataBacklog,
}, sessionId) {
dataListeners?.delete?.(sessionId);
displayDataListeners?.delete?.(sessionId);
terminalDataBacklog?.clear?.(sessionId);
}
module.exports = {
createTerminalDataBacklog,
createTerminalDataDispatcher,
clearTerminalDataSession,
};