summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/utils/terminal-writer.ts
blob: b6caff789cf7f35d2dd106aed0b9e00b227c1610 (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
export function terminalWriter(
  write: (data: string) => void,
  schedule: (flush: VoidFunction) => void = queueMicrotask,
) {
  let chunks: string[] | undefined
  let scheduled = false

  const flush = () => {
    scheduled = false
    const items = chunks
    if (!items?.length) return
    chunks = undefined
    write(items.join(""))
  }

  const push = (data: string) => {
    if (!data) return
    if (chunks) chunks.push(data)
    else chunks = [data]

    if (scheduled) return
    scheduled = true
    schedule(flush)
  }

  return { push, flush }
}