WisperNext

This is the next version of Wisper. Alpha only.

Installation

gem 'wisper_next'

Usage

Publishing

class MyPublisher
  include WisperNext.publisher

  def call
    broadcast(:wow, x: rand(10), y: rand(10), at: Time.now)
  end
end

A publisher can broadcast events, the first argument is the event name followed by an optional payload.

Listeners

Objects

class MyListener
  def on_event(event_name, payload)
    puts "#{event_name} received with #{payload.inspect}"
  end
end

We can then subscribe an instance of our listener to the publisher:

publisher = MyPublisher.new
publisher.subscribe(MyListener.new)
publisher.call

Blocks

Blocks can be subscribed to a specific event name.

publisher = MyPublisher.new
publisher.on(:wow) { |payload| puts(payload) }
publisher.call

Enhanced Listeners

By including Wisper.subscriber you can get additional features.

Firstly instead of #on_event you provide a method for every event the listener may receive. For example if our publisher broadcasts a "user_created" event then the listener would provide a user_created method which receives the payload.

class MyListener
  include Wisper.subscriber

  def user_created(payload)
    #...
  end
end

If the listener receives an event for which there is no method an exception is raised.

You can opt-out of this behaviour by setting the strict option to false:

include Wisper.subscriber(strict: false)

Prefixing broadcast events

The method called can be prefixed with on_:

class MyListener
  include Wisper.subscriber(prefix: true)

  def on_user_created(payload)
    #...
  end
end

Handling Events Asynchronously

WisperNext has adapters for asynchronous event handling, please refer to .

include Wisper.subscriber(async: :true)

If you are interested in building an async adapter and releasing it as a gem please get in touch.

Passing options

If the value for an option being passed to subscriber is true then you can use a symbol instead to mean the same thing.

So WisperNext.subscriber(async: true) and WisperNext.subscriber(:async) are the same. You can pass multiple symbols with any key/values at the end, e.g. WisperNext.subscriber(:async, :prefix, strict: false).

Global Subscriptions

EVENTS = WisperNext::Events.new

EVENTS.subscribe(MyListener.new)

EVENTS.broadcast('user_promoted', user: user)

Security

Development

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/krisleech/wisper_next.

This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

The gem is available as open source under the terms of the MIT License.

Code of Conduct

Everyone interacting in the WisperNext project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.