• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taichunmin / chameleon-ultra.js / 15847482271

24 Jun 2025 10:04AM UTC coverage: 69.194% (+5.8%) from 63.351%
15847482271

push

github

web-flow
v0.3.30: change to vitest and lodash-es (#196)

502 of 657 branches covered (76.41%)

Branch coverage included in aggregate %.

12 of 18 new or added lines in 14 files covered. (66.67%)

218 existing lines in 5 files now uncovered.

2683 of 3946 relevant lines covered (67.99%)

3159783.57 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

94.23
/src/EventAsyncGenerator.ts
1
const symbolClose = Symbol.for('EventAsyncGenerator.close')
1✔
2

3
export class EventAsyncGenerator<T = unknown, TReturn = unknown, TNext = unknown> implements AsyncGenerator<T, TReturn, TNext> {
1✔
4
  #isFinally = false
146✔
5
  #pullPromise: Resolvable<T | typeof symbolClose> | null = null
146✔
6
  readonly #it: AsyncGenerator<T, TReturn, TNext>
146✔
7
  readonly #queue: Array<T | typeof symbolClose | Error> = []
146✔
8

9
  onClose: () => void
146✔
10
  onData: (value: T) => void
146✔
11
  onError: (err: Error) => void
146✔
12
  removeCallback?: () => void | Promise<void>
146✔
13

14
  constructor (init?: (me: EventAsyncGenerator<T, TReturn, TNext>) => void | Promise<void>) {
146✔
15
    const me = this // eslint-disable-line @typescript-eslint/no-this-alias
146✔
16
    this.onData = (value: T) => {
146✔
17
      if (this.#pullPromise !== null) this.#pullPromise.resolve?.(value)
140✔
18
      else this.#queue.push(value)
138✔
19
    }
140✔
20
    this.onClose = () => {
146✔
21
      if (this.#pullPromise !== null) this.#pullPromise.resolve?.(symbolClose)
5✔
22
      else this.#queue.push(symbolClose)
4✔
23
      void this.finally()
5✔
24
    }
5✔
25
    this.onError = (err: Error) => {
146✔
26
      if (this.#pullPromise !== null) this.#pullPromise.reject?.(err)
4✔
27
      else this.#queue.push(err)
2✔
28
      void this.finally()
4✔
29
    }
4✔
30
    this.#it = (async function * () {
146✔
31
      try {
146✔
32
        await init?.(me)
146✔
33
        while (true) {
146✔
34
          let valueOrErr: T | typeof symbolClose | Error
144✔
35
          if (me.#queue.length > 0) valueOrErr = me.#queue.shift() as T | typeof symbolClose | Error
144✔
36
          else {
5✔
37
            me.#pullPromise = createResolvable<T | typeof symbolClose>()
5✔
38
            valueOrErr = await me.#pullPromise.catch(err => err)
5✔
39
            me.#pullPromise = null
5✔
40
          }
5✔
41
          if (valueOrErr === symbolClose) return
144✔
42
          if (valueOrErr instanceof Error) throw valueOrErr
144✔
43
          yield valueOrErr
137✔
44
        }
3✔
45
      } finally {
146✔
46
        await me.finally()
138✔
47
      }
138✔
48
    })() as AsyncGenerator<T, TReturn, TNext>
146✔
49
  }
146✔
50

51
  async next (...args: [] | [TNext]): Promise<IteratorResult<T, TReturn>> {
146✔
52
    return await this.#it.next(...args)
149✔
53
  }
149✔
54

55
  async return (value: TReturn | PromiseLike<TReturn>): Promise<IteratorResult<T, TReturn>> {
146✔
56
    const result = await this.#it.return(value)
134✔
57
    await this.finally()
134✔
58
    return result
134✔
59
  }
134✔
60

61
  async throw (err: Error): Promise<IteratorResult<T, TReturn>> {
146✔
62
    const result = await this.#it.throw(err)
×
63
    await this.finally()
×
64
    return result
×
UNCOV
65
  }
×
66

67
  async finally (): Promise<void> {
146✔
68
    if (this.#isFinally) return
281✔
69
    this.#isFinally = true
143✔
70
    await this.removeCallback?.()
153✔
71
  }
281✔
72

73
  [Symbol.asyncIterator] (): this {
146✔
74
    return this
128✔
75
  }
128✔
76

77
  async [Symbol.asyncDispose] (): Promise<void> {
146✔
NEW
78
    await this.finally()
×
NEW
79
  }
×
80
}
146✔
81

82
type Resolvable<T> = Promise<T> & {
83
  resolve: (t: T) => void
84
  reject: (err: Error) => void
85
}
86

87
function createResolvable<T> (): Resolvable<T> {
5✔
88
  let resolve, reject
5✔
89
  const resolvable = new Promise<T>((...args) => {
5✔
90
    ;[resolve, reject] = args
5✔
91
  }) as Resolvable<T>
5✔
92
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
93
  Object.assign(resolvable, { resolve, reject })
5✔
94
  return resolvable
5✔
95
}
5✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc