class TpCommon::AssetLoaders::RemoteAssetsLoader

This class supports switching between development env and production env in loading assets Follow TINYpulse development convention.

To config: “` TpCommon::AssetLoaders::RemoteAssetsLoader.configure do |config|

config.cdn = 'https://other.hotter.cdn'
# And for development mode, add more
config.dev_cdn = 'http://app.lvh.me:3001'

end # Load a package. This is required. TpCommon::AssetLoaders::RemoteAssetsLoader.load(:'any-spa', 'v1.0.0') “`

Use in template: “` <%= javascript_include_tag TpCommon::AssetLoaders::RemoteAssetsLoader['main.js'] %> “`

Constants

DEFAULT_CDN
LoaderConfiguration

Public Class Methods

[](package_name) click to toggle source

Get package: “`

TpCommon::AssetLoaders::RemoteAssetsLoader[:'tinypulse-spa-1'][:'main.js'] # 'https://some.cdn/spa/tinypulse-spa-1/v1.0.0/main.js'

“` Raise `PackageIsNotLoaded` exception if package is not found.

  • In Rails development environment, Asset loader will try to ping and access assets at localhost:3001

    Which assets are served without minified, so file name is keep the same.
  • In other environments, assets are minified and served through cdn

    File name will be append `.min` before extension. i.e. 'main.min.js'
# File lib/tp_common/asset_loaders/remote_assets_loader.rb, line 115
def [](package_name)
  packages[package_name].tap do |package|
    raise TpCommon::AssetLoaders::Errors::PackageIsNotLoaded.new("Package #{package_name} is not loaded yet.") if package.nil?
  end
end
asset_url(package_name, version, asset) click to toggle source
# File lib/tp_common/asset_loaders/remote_assets_loader.rb, line 121
def asset_url(package_name, version, asset)
  if config.enable_hot_reload
    cached_version = cache_get(package_name)
    if cached_version
      return config.package_path_provider.asset_url(package_name, cached_version, asset)
    end
  end

  config.package_path_provider.asset_url(package_name, version, asset)
end
cache_get(package_name) click to toggle source

TODO: [AV] Add desc before release

# File lib/tp_common/asset_loaders/remote_assets_loader.rb, line 95
def cache_get(package_name)
  config.redis_connection.get(cache_key(package_name))
end
cache_set(package_name, version) click to toggle source

TODO: [AV] Add desc before release

# File lib/tp_common/asset_loaders/remote_assets_loader.rb, line 90
def cache_set(package_name, version)
  config.redis_connection.set(cache_key(package_name), version)
end
cache_unset(package_name) click to toggle source

TODO: [AV] Add desc before release

# File lib/tp_common/asset_loaders/remote_assets_loader.rb, line 100
def cache_unset(package_name)
  config.redis_connection.del(cache_key(package_name))
end
configure() { |config| ... } click to toggle source

Configure RemoteAssetsLoader, for now, only :cdn is supported “`

TpCommon::AssetLoaders::RemoteAssetsLoader.configure do |config|
  config.cdn = 'https://other.hotter.cdn'
end

“`

# File lib/tp_common/asset_loaders/remote_assets_loader.rb, line 47
def configure
  yield(config)

  config.enable_hot_reload = !!config.enable_hot_reload
  raise StandardError.new('Please add :redis_connection if enable hot_reload') if config.enable_hot_reload && config.redis_connection.nil?
  config.package_path_provider = TpCommon::AssetLoaders::ProviderClass.new(config.cdn, config.dev_cdn)
end
load(package_name, version = nil) click to toggle source

Load a package (SPA) with specific version to use. “`

TpCommon::AssetLoaders::RemoteAssetsLoader.load(:'tinypulse-spa-1', 'v1.0.0')

“`

To prioritize version from env variable, we dont provide this magic here So declare it explicitly when load: “`

TpCommon::AssetLoaders::RemoteAssetsLoader.load(:'tinypulse-spa-1', ENV['SPA_VERSION_TINYPULSE_SPA_1_HOT_CHANGE'] || 'v1.0.0')

“`

For multiple packages: “`

TpCommon::AssetLoaders::RemoteAssetsLoader.load(
  'tinypulse-spa-1': 'v1.0.0',
  'tinypulse-spa-2': 'v1.0.0',
  'tinypulse-spa-3': 'v1.0.0')

“`

# File lib/tp_common/asset_loaders/remote_assets_loader.rb, line 74
def load(package_name, version = nil)
  if version
    package_name = package_name.to_sym
    packages[package_name] = new(package_name, version)
    packages
  else
    all_packages = Hash(package_name)
    all_packages.each do |key, ver|
      packages[key] = new(key, ver)
    end

    packages
  end
end
new(package_name, version) click to toggle source
# File lib/tp_common/asset_loaders/remote_assets_loader.rb, line 151
def initialize(package_name, version)
  @package_name = package_name
  @version = version
end

Private Class Methods

cache_key(package_name) click to toggle source
# File lib/tp_common/asset_loaders/remote_assets_loader.rb, line 134
def cache_key(package_name)
  "tp_common/asset_loaders/remote_assets_loader/#{package_name}"
end
config() click to toggle source
# File lib/tp_common/asset_loaders/remote_assets_loader.rb, line 142
def config
  @config ||= new_config
end
new_config() click to toggle source
# File lib/tp_common/asset_loaders/remote_assets_loader.rb, line 138
def new_config
  LoaderConfiguration.new(DEFAULT_CDN, nil)
end
packages() click to toggle source
# File lib/tp_common/asset_loaders/remote_assets_loader.rb, line 146
def packages
  @packages ||= {}
end

Public Instance Methods

[](asset_name) click to toggle source
# File lib/tp_common/asset_loaders/remote_assets_loader.rb, line 156
def [](asset_name)
  # TODO: [AV] Do performance test and cache the string in system level
  # NOTE: [AV] It's secure to check this asset url exists by Net::HTTP then try more than 1 cdn.
  #       but DONT DO IT. Using unavailable spa version/cdn is a SERIOUS problem need to solve, not auto-recovery
  #       beside, this url will be called every page hit, so any milisecond are counted.
  RemoteAssetsLoader.asset_url(@package_name, @version, asset_name)
end