All files proposed-global-stream.ts

100% Statements 33/33
100% Branches 6/6
100% Functions 1/1
100% Lines 33/33

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 441x 1x             1x 3x 3x 3x 3x 3x 1x 1x   2x 2x 2x 2x   2x   2x 2x 3x 3x 3x 2x 2x 2x 2x 2x 2x 2x 2x 3x 2x 2x   2x 2x  
import * as vscode from "vscode";
import { ShellIntegrationAccumulator } from "./extract-output";
import type { TerminalOutputRegisterDeps, VSCodeWindowWithProposed } from "./types";
 
/**
 * Proposed API: global terminal PTY write stream (when available).
 * One shared ShellIntegrationAccumulator across chunks (matches legacy extension behavior).
 */
export function registerProposedGlobalTerminalOutput(
  context: vscode.ExtensionContext,
  deps: TerminalOutputRegisterDeps,
): boolean {
  const windowAny = vscode.window as unknown as VSCodeWindowWithProposed;
  if (typeof windowAny.onDidWriteTerminalData !== "function") {
    return false;
  }
 
  const onDidWriteTerminalData = windowAny.onDidWriteTerminalData;
  const acc = new ShellIntegrationAccumulator();
  let bufRaw = "";
  let timer: ReturnType<typeof setTimeout> | null = null;
 
  const { maxChars, debounceMs, emitOutput } = deps;
 
  context.subscriptions.push(
    onDidWriteTerminalData((e: { data: string }) => {
      bufRaw += e.data;
      if (timer) clearTimeout(timer);
      timer = setTimeout(() => {
        const raw = bufRaw;
        bufRaw = "";
        timer = null;
        const output = acc
          .process(raw)
          .slice(-maxChars)
          .trim();
        if (output) emitOutput(output);
      }, debounceMs);
    }),
  );
 
  return true;
}