Class: TpCommon::AssetLoaders::RemoteAssetsLoader
- Inherits:
-
Object
- Object
- TpCommon::AssetLoaders::RemoteAssetsLoader
- Defined in:
- lib/tp_common/asset_loaders/remote_assets_loader.rb
Overview
This class supports switching between development env and production env in loading assets Follow TINYpulse development convention.
-
Use minified assets on cdn for production
-
On development, prefer development spa on local, if not, fallback to production behaviors
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’] %> “‘
Defined Under Namespace
Classes: LoaderConfiguration
Constant Summary collapse
- DEFAULT_CDN =
'https://cdn.tinypulse.com/spa'
Class Method Summary collapse
-
.[](package_name) ⇒ Object
Get package: “‘ TpCommon::AssetLoaders::RemoteAssetsLoader[:’main.js’] # ‘some.cdn/spa/tinypulse-spa-1/v1.0.0/main.js’ “‘ Raise `PackageIsNotLoaded` exception if package is not found.
- .asset_url(package_name, version, asset) ⇒ Object
-
.cache_get(package_name) ⇒ Object
TODO: [AV] Add desc before release.
-
.cache_set(package_name, version) ⇒ Object
TODO: [AV] Add desc before release.
-
.cache_unset(package_name) ⇒ Object
TODO: [AV] Add desc before release.
-
.configure {|config| ... } ⇒ Object
Configure RemoteAssetsLoader, for now, only :cdn is supported “‘ TpCommon::AssetLoaders::RemoteAssetsLoader.configure do |config| config.cdn = ’other.hotter.cdn’ end “‘.
-
.load(package_name, version = nil) ⇒ Object
Load a package (SPA) with specific version to use.
Instance Method Summary collapse
- #[](asset_name) ⇒ Object
-
#initialize(package_name, version) ⇒ RemoteAssetsLoader
constructor
A new instance of RemoteAssetsLoader.
Constructor Details
#initialize(package_name, version) ⇒ RemoteAssetsLoader
Returns a new instance of RemoteAssetsLoader.
151 152 153 154 |
# File 'lib/tp_common/asset_loaders/remote_assets_loader.rb', line 151 def initialize(package_name, version) @package_name = package_name @version = version end |
Class Method Details
.[](package_name) ⇒ Object
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'
115 116 117 118 119 |
# 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) ⇒ Object
121 122 123 124 125 126 127 128 129 130 |
# 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) ⇒ Object
TODO: [AV] Add desc before release
95 96 97 |
# 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) ⇒ Object
TODO: [AV] Add desc before release
90 91 92 |
# 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) ⇒ Object
TODO: [AV] Add desc before release
100 101 102 |
# 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| ... } ⇒ Object
Configure RemoteAssetsLoader, for now, only :cdn is supported “‘
TpCommon::AssetLoaders::RemoteAssetsLoader.configure do |config|
config.cdn = 'https://other.hotter.cdn'
end
“‘
47 48 49 50 51 52 53 |
# 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) ⇒ Object
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')
“‘
74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# 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 |
Instance Method Details
#[](asset_name) ⇒ Object
156 157 158 159 160 161 162 |
# 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 |