Class: Spree::Events::Adapters::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/spree/events/adapters/base.rb

Overview

Base class for event adapters.

Adapters are responsible for the actual publishing and subscription management of events. The default adapter uses ActiveSupport::Notifications, but you can create custom adapters for other backends like Kafka, RabbitMQ, or Redis Pub/Sub.

Examples:

Creating a custom adapter

class MyApp::Events::KafkaAdapter < Spree::Events::Adapters::Base
  def publish(event_name, payload,  = {})
    event = Spree::Event.new(name: event_name, payload: payload, metadata: )
    kafka_producer.produce(event.to_json, topic: event_name)
    event
  end

  def activate!
    @kafka_producer = Kafka.new.producer
  end

  def deactivate!
    @kafka_producer&.shutdown
  end
end

Configuring Spree to use your adapter

# config/initializers/spree.rb
Spree.events_adapter_class = 'MyApp::Events::KafkaAdapter'

Direct Known Subclasses

ActiveSupportNotifications

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(registry) ⇒ Base

Initialize the adapter with a registry.

Parameters:



40
41
42
# File 'lib/spree/events/adapters/base.rb', line 40

def initialize(registry)
  @registry = registry
end

Instance Attribute Details

#registryObject (readonly)

Returns the value of attribute registry.



35
36
37
# File 'lib/spree/events/adapters/base.rb', line 35

def registry
  @registry
end

Instance Method Details

#activate!Object

Activate the adapter.

Called during Rails initialization. Use this to set up connections, start consumers, or perform any initialization needed.

Raises:

  • (NotImplementedError)


92
93
94
# File 'lib/spree/events/adapters/base.rb', line 92

def activate!
  raise NotImplementedError, "#{self.class}#activate! must be implemented"
end

#deactivate!Object

Deactivate the adapter.

Called during shutdown or when resetting the event system. Use this to clean up connections and resources.

Raises:

  • (NotImplementedError)


101
102
103
# File 'lib/spree/events/adapters/base.rb', line 101

def deactivate!
  raise NotImplementedError, "#{self.class}#deactivate! must be implemented"
end

#publish(event_name, payload, metadata = {}) ⇒ Spree::Event

Publish an event to all matching subscribers.

Examples:

adapter.publish('order.complete', order.serializable_hash, { user_id: 1 })

Parameters:

  • event_name (String)

    the event name (e.g., ‘order.complete’)

  • payload (Hash)

    the event payload (should be serializable)

  • metadata (Hash) (defaults to: {})

    additional metadata for the event

Returns:

Raises:

  • (NotImplementedError)


54
55
56
# File 'lib/spree/events/adapters/base.rb', line 54

def publish(event_name, payload,  = {})
  raise NotImplementedError, "#{self.class}#publish must be implemented"
end

#subscribe(pattern, subscriber, options = {}) ⇒ Object

Subscribe to an event pattern.

This method should register the subscriber in the registry. The adapter is responsible for ensuring events are routed to matching subscribers.

Examples:

adapter.subscribe('order.complete', MySubscriber)
adapter.subscribe('order.*', AuditLogger, async: false)

Parameters:

  • pattern (String)

    event pattern (supports wildcards like ‘order.*’)

  • subscriber (Class, Proc)

    the subscriber class or callable

  • options (Hash) (defaults to: {})

    subscription options

Options Hash (options):

  • :async (Boolean) — default: true

    whether to run async via ActiveJob

Raises:

  • (NotImplementedError)


73
74
75
# File 'lib/spree/events/adapters/base.rb', line 73

def subscribe(pattern, subscriber, options = {})
  raise NotImplementedError, "#{self.class}#subscribe must be implemented"
end

#unsubscribe(pattern, subscriber) ⇒ Boolean

Unsubscribe from an event pattern.

Parameters:

  • pattern (String)

    event pattern

  • subscriber (Class, Proc)

    the subscriber to remove

Returns:

  • (Boolean)

    true if removed, false if not found

Raises:

  • (NotImplementedError)


83
84
85
# File 'lib/spree/events/adapters/base.rb', line 83

def unsubscribe(pattern, subscriber)
  raise NotImplementedError, "#{self.class}#unsubscribe must be implemented"
end