Class: ReactOnRailsPro::LicenseValidator

Inherits:
Object
  • Object
show all
Defined in:
lib/react_on_rails_pro/license_validator.rb,
sig/react_on_rails_pro/license_validator.rbs

Overview

Validates React on Rails Pro licenses. This class only determines license status - it does NOT log. All logging is handled by Engine.log_license_status for environment-aware messaging. rubocop:disable Metrics/ClassLength

Constant Summary collapse

VALID_PLANS =

Valid license plan types

Returns:

  • (Array[String])
%w[paid startup nonprofit education oss partner].freeze
ATTRIBUTION_REQUIRED_PLANS =

Recognized plans, all of which require product-level attribution

Returns:

  • (Array[String])
VALID_PLANS
LICENSE_MUTEX =

Mutex for thread-safe license status initialization. Using a constant eliminates the race condition that would exist with @mutex ||= Mutex.new See: https://bugs.ruby-lang.org/issues/20875

Mutex.new
ENV_LICENSE_CACHE_KEY =

Explicit tokens receive distinct cache keys so later application configuration cannot reuse ENV/default metadata. The ENV/default path intentionally retains one process-lifetime key and the existing reset-required semantics.

Object.new.freeze

Class Method Summary collapse

Class Method Details

.attribution_required?Boolean

Returns whether attribution is required for this license

Returns:

  • (Boolean)


79
80
81
# File 'lib/react_on_rails_pro/license_validator.rb', line 79

def attribution_required?
  fetch_cached_license_value(:@attribution_required) { determine_attribution_required }
end

.license_expirationTime?

Returns the license expiration time if available

Returns:

  • (Time, nil)


59
60
61
# File 'lib/react_on_rails_pro/license_validator.rb', line 59

def license_expiration
  fetch_cached_license_value(:@license_expiration) { determine_license_expiration }
end

.license_infolicense_info_hash

Returns license information for use in helpers and components

Returns:

  • (license_info_hash)


85
86
87
88
89
90
91
92
93
# File 'lib/react_on_rails_pro/license_validator.rb', line 85

def license_info
  {
    org: license_organization,
    plan: license_plan,
    status: license_status,
    attribution_required: attribution_required?,
    expiration: license_expiration
  }
end

.license_organizationString?

Returns the organization name from the license if available

Returns:

  • (String, nil)


65
66
67
# File 'lib/react_on_rails_pro/license_validator.rb', line 65

def license_organization
  fetch_cached_license_value(:@license_organization) { determine_license_organization }
end

.license_planString?

Returns the license plan type if available

Returns:

  • (String, nil)


71
72
73
# File 'lib/react_on_rails_pro/license_validator.rb', line 71

def license_plan
  fetch_cached_license_value(:@license_plan) { determine_license_plan }
end

.license_statuslicense_status

Returns the current license status (never raises, never logs) Thread-safe: uses Mutex to prevent race conditions during initialization

Returns:



53
54
55
# File 'lib/react_on_rails_pro/license_validator.rb', line 53

def license_status
  fetch_cached_license_value(:@license_status) { determine_license_status }
end

.reset!void

This method returns an undefined value.

Resets all cached state (primarily for testing)



96
97
98
99
100
101
102
103
104
# File 'lib/react_on_rails_pro/license_validator.rb', line 96

def reset!
  LICENSE_MUTEX.synchronize do
    remove_instance_variable(:@license_status) if defined?(@license_status)
    remove_instance_variable(:@license_expiration) if defined?(@license_expiration)
    remove_instance_variable(:@license_organization) if defined?(@license_organization)
    remove_instance_variable(:@license_plan) if defined?(@license_plan)
    remove_instance_variable(:@attribution_required) if defined?(@attribution_required)
  end
end