Files
Netcatty/electron/preload/terminalDataMeta.cjs
T
陈大猫 67f8108713 feat(plugins): add reviewed privileged terminal data pipeline (#2402)
* feat(plugins): add privileged terminal data pipeline

* fix(plugins): harden terminal interceptor lifecycle

* fix(plugins): close terminal interceptor lifecycle gaps

* fix(plugins): preserve terminal interceptor state transitions

* fix(plugin): close terminal pipeline lifecycle gaps

* fix(plugin): harden terminal interceptor startup

* fix(plugin): isolate terminal output route attempts

* fix(plugin): isolate reused terminal sessions

* fix(plugin): harden terminal interceptor boundaries

* fix(plugin): harden terminal replay metadata

* fix(plugin): preserve terminal replay provenance

* fix(plugin): close terminal pipeline lifecycle races

* fix(plugin): harden terminal route handoff

* fix(plugin): contain terminal handoff failures

* fix(plugin): route terminal attachment through RPC

* fix(plugin): validate terminal attachment RPC

* fix(plugin): close unexpected runtime ports

* fix(plugin): canonicalize terminal data frames

* fix(plugin): close terminal pipeline lifecycle gaps

* fix(plugin): close terminal interceptor review gaps

* fix(plugin): harden terminal interceptor protocol handling

* fix(plugin): preserve terminal flow compatibility

* fix(plugin): preserve terminal protocol accounting

* fix(plugin): bound terminal interceptor lifecycle

* fix(plugin): close terminal interceptor review gaps

---------

Co-authored-by: ryan-wong-coder <wangsiyuan19990317@gmail.com>
2026-07-23 09:42:47 +08:00

77 lines
2.3 KiB
JavaScript

"use strict";
function isRecord(value) {
return value !== null && typeof value === "object" && !Array.isArray(value);
}
function normalizeTerminalDataMeta(meta) {
if (!isRecord(meta)) return undefined;
return { ...meta };
}
function hasMetaFields(meta) {
return Boolean(meta && Object.keys(meta).length > 0);
}
function mergeTerminalDataMeta(first, second, options = {}) {
const merged = {
...(normalizeTerminalDataMeta(first) || {}),
...(normalizeTerminalDataMeta(second) || {}),
};
const droppedOutputMayAffectTerminalState = Boolean(
first?.droppedOutputMayAffectTerminalState
|| second?.droppedOutputMayAffectTerminalState
);
const droppedOutputAlternateScreenAction = second?.droppedOutputMayAffectTerminalState
? second?.droppedOutputAlternateScreenAction
: (second?.droppedOutputAlternateScreenAction ?? first?.droppedOutputAlternateScreenAction);
const firstHasPluginPipelineIngress = Number.isFinite(first?.pluginPipelineIngressBytes);
const secondHasPluginPipelineIngress = Number.isFinite(second?.pluginPipelineIngressBytes);
const pluginPipelineIngressBytes = Math.max(
0,
Number(first?.pluginPipelineIngressBytes ?? 0)
+ Number(second?.pluginPipelineIngressBytes ?? 0),
);
if (typeof second?.pluginPipelineSensitiveInput === "boolean") {
merged.pluginPipelineSensitiveInput = second.pluginPipelineSensitiveInput;
} else {
delete merged.pluginPipelineSensitiveInput;
}
if (second?.pluginPipelineProcessed === true) {
merged.pluginPipelineProcessed = true;
} else {
delete merged.pluginPipelineProcessed;
}
if (droppedOutputMayAffectTerminalState) {
merged.droppedOutputMayAffectTerminalState = true;
} else {
delete merged.droppedOutputMayAffectTerminalState;
}
if (droppedOutputAlternateScreenAction) {
merged.droppedOutputAlternateScreenAction = droppedOutputAlternateScreenAction;
} else {
delete merged.droppedOutputAlternateScreenAction;
}
if (firstHasPluginPipelineIngress || secondHasPluginPipelineIngress) {
merged.pluginPipelineIngressBytes = pluginPipelineIngressBytes;
} else {
delete merged.pluginPipelineIngressBytes;
}
if (options.preserveTerminalPerf !== true) {
delete merged.terminalPerf;
}
return hasMetaFields(merged) ? merged : undefined;
}
module.exports = {
mergeTerminalDataMeta,
};