πŸ“„ File detail

ink/events/emitter.ts

🧩 .tsπŸ“ 40 linesπŸ’Ύ 1,125 bytesπŸ“ text
← Back to All Files

🎯 Use case

This file lives under β€œink/”, which covers Ink terminal UI (layouts, TTY IO, keyboard, renderer components). On the API surface it exposes EventEmitter β€” mainly types, interfaces, or factory objects. Dependencies touch Node events. It composes internal code from event (relative imports). What the file header says: Similar to node's builtin EventEmitter, but is also aware of our `Event` class, and so `emit` respects `stopImmediatePropagation()`.

Generated from folder role, exports, dependency roots, and inline comments β€” not hand-reviewed for every path.

🧠 Inline summary

Similar to node's builtin EventEmitter, but is also aware of our `Event` class, and so `emit` respects `stopImmediatePropagation()`.

πŸ“€ Exports (heuristic)

  • EventEmitter

πŸ“š External import roots

Package roots from from "…" (relative paths omitted).

  • events

πŸ–₯️ Source preview

import { EventEmitter as NodeEventEmitter } from 'events'
import { Event } from './event.js'

// Similar to node's builtin EventEmitter, but is also aware of our `Event`
// class, and so `emit` respects `stopImmediatePropagation()`.
export class EventEmitter extends NodeEventEmitter {
  constructor() {
    super()
    // Disable the default maxListeners warning. In React, many components
    // can legitimately listen to the same event (e.g., useInput hooks).
    // The default limit of 10 causes spurious warnings.
    this.setMaxListeners(0)
  }

  override emit(type: string | symbol, ...args: unknown[]): boolean {
    // Delegate to node for `error`, since it's not treated like a normal event
    if (type === 'error') {
      return super.emit(type, ...args)
    }

    const listeners = this.rawListeners(type)

    if (listeners.length === 0) {
      return false
    }

    const ccEvent = args[0] instanceof Event ? args[0] : null

    for (const listener of listeners) {
      listener.apply(this, args)

      if (ccEvent?.didStopImmediatePropagation()) {
        break
      }
    }

    return true
  }
}