Alephant::Broker

Brokers requests for rendered templates, retrieved from S3 or a HTML endpoint.

Build StatusGem Version

Installation

Add this line to your application's Gemfile:

gem 'alephant-broker'

And then execute:

bundle install

Or install it yourself as:

gem install alephant-broker

Usage

The Broker is capable of retrieving rendered templates from either S3 or a HTML endpoint (e.g. alephant-publisher-request). This must be decided when creating an instance of the Broker, as a load strategy is given as a parameter (see below for examples).

Barebones

S3 Load Strategy
require 'alephant/broker'
require 'alephant/broker/load_strategy/s3'

config = {
  :s3_bucket_id      => 'test_bucket',
  :s3_object_path    => 'foo',
  :lookup_table_name => 'test_lookup'
}

request = {
  'PATH_INFO'      => '/component/foo',
  'QUERY_STRING'   => 'variant=bar',
  'REQUEST_METHOD' => 'GET'
}

Alephant::Broker::Application.new(
  Alephant::Broker::LoadStrategy::S3.new,
  config
).call(request).tap do |response|
  puts "status:  #{response.status}"
  puts "content: #{response.content}"
end
HTML Load Strategy
require 'alephant/broker'
require 'alephant/broker/load_strategy/http'

class UrlGenerator < Alephant::Broker::LoadStrategy::HTTP::URL
  def generate(id, options)
    "http://example-api.com/data?id=#{id}"
  end
end

request = {
  'PATH_INFO'      => '/component/foo',
  'QUERY_STRING'   => 'variant=bar',
  'REQUEST_METHOD' => 'GET'
}

Alephant::Broker::Application.new(
  Alephant::Broker::LoadStrategy::HTTP.new(UrlGenerator.new),
  {}
).call(request).tap do |response|
  puts "status:  #{response.status}"
  puts "content: #{response.content}"
end

Note

The HTML load strategy relies upon being given a URLGenerator, which is used to generate the URL of the HTML endpoint (see below for example). The class must:

require 'alephant/broker/load_strategy/http'
require 'rack'

class UrlGenerator < Alephant::Broker::LoadStrategy::HTTP::URL
  def generate(id, options)
    "http://api.my-app.com/component/#{id}?#{to_query_string(options)}"
  end

  private

  def to_query_string(hash)
    Rack::Utils.build_query hash
  end
end

Rack App

Create config.ru using example below, and then run:

rackup config.ru
require 'alephant/broker'
require 'alephant/broker/load_strategy/http'

class UrlGenerator < Alephant::Broker::LoadStrategy::HTTP::URL
  def generate(id, options)
    "http://example-api.com/data?id=#{id}"
  end
end

run Alephant::Broker::Application.new(
  Alephant::Broker::LoadStrategy::HTTP.new(UrlGenerator.new),
  {}
)

Cache version number

The broker looks for a configuration value elasticache_cache_version and if it exists it uses it to construct the cache key. This allows the cache to be busted if the data in the cache changes, or for any other reason that it needs to be invalidated.

This version is added as a header to the response in the following format:

X-Cache-Version: {CACHE_VERSION}

Contributing

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Create a new Pull Request.

Feel free to create a new issue if you find a bug.