summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/testing/terminal.ts
blob: aa197440455a9ed09fbd51e2c29928c691c1ada5 (plain)
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
export const terminalAttr = "data-pty-id"

export type TerminalProbeState = {
  connected: boolean
  rendered: string
  settled: number
}

export type E2EWindow = Window & {
  __opencode_e2e?: {
    terminal?: {
      enabled?: boolean
      terminals?: Record<string, TerminalProbeState>
    }
  }
}

const seed = (): TerminalProbeState => ({
  connected: false,
  rendered: "",
  settled: 0,
})

const root = () => {
  if (typeof window === "undefined") return
  const state = (window as E2EWindow).__opencode_e2e?.terminal
  if (!state?.enabled) return
  state.terminals ??= {}
  return state.terminals
}

export const terminalProbe = (id: string) => {
  const set = (next: Partial<TerminalProbeState>) => {
    const terms = root()
    if (!terms) return
    terms[id] = { ...(terms[id] ?? seed()), ...next }
  }

  return {
    init() {
      set(seed())
    },
    connect() {
      set({ connected: true })
    },
    render(data: string) {
      const terms = root()
      if (!terms) return
      const prev = terms[id] ?? seed()
      terms[id] = { ...prev, rendered: prev.rendered + data }
    },
    settle() {
      const terms = root()
      if (!terms) return
      const prev = terms[id] ?? seed()
      terms[id] = { ...prev, settled: prev.settled + 1 }
    },
    drop() {
      const terms = root()
      if (!terms) return
      delete terms[id]
    },
  }
}