Skip to content

Channel

TypedBus::Channel

A named, typed pub/sub channel with explicit acknowledgment tracking.

Constructor

Channel.new(name, type:, timeout:, max_pending:, stats:, throttle:)

Parameter Default Description
name required Symbol channel name
type nil Optional class constraint for messages
timeout 30 Seconds before delivery auto-nacks
max_pending nil Backpressure limit; nil = unbounded
stats nil Optional Stats instance for counters
throttle 0.0 Capacity ratio where backoff begins
channel = TypedBus::Channel.new(:orders,
  type: Order,
  timeout: 10,
  max_pending: 100,
  throttle: 0.5
)

Note

When using channels via MessageBus, these values are resolved through the configuration cascade. You don't normally construct channels directly with all parameters.

Attributes

nameSymbol

Channel name.

typeClass, nil

Type constraint, or nil for untyped channels.

dead_letter_queueDeadLetterQueue

The channel's dead letter queue.

Pub/Sub

publish(message)DeliveryTracker, nil

Publish a message to all current subscribers.

  • Blocks the calling fiber if bounded and at capacity
  • Applies throttle delay if configured
  • Returns nil if no subscribers (message goes to DLQ)

Raises: ArgumentError for type mismatches. RuntimeError if closed.

subscribe(&block)Integer

Subscribe to messages. Returns the subscriber ID.

Raises: RuntimeError if closed.

unsubscribe(id_or_block)

Remove a subscriber by integer ID or block reference.

Query

subscriber_countInteger

Number of active subscribers.

pending_countInteger

Number of unresolved delivery trackers.

pending?Boolean

True when there are unresolved deliveries.

closed?Boolean

True if the channel has been closed.

Lifecycle

close

Stop accepting new publishes and subscribes. Pending deliveries are force-NACKed and routed to the DLQ.

clear!

Hard reset: cancel all timeout tasks, discard pending state, clear DLQ. Does not mark the channel as closed.