Module: Supabase::Rails::Env

Defined in:
lib/supabase/rails/env.rb

Class Method Summary collapse

Class Method Details

.loopback_host?(hostname) ⇒ Boolean

Returns:

  • (Boolean)


94
95
96
97
98
99
100
101
102
# File 'lib/supabase/rails/env.rb', line 94

def loopback_host?(hostname)
  return false if hostname.nil?
  return true if hostname == "localhost"
  return true if hostname.end_with?(".localhost")
  return true if hostname == "[::1]" || hostname == "::1"
  return true if /\A127\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/.match?(hostname)

  false
end

.parse_jwks(raw) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
# File 'lib/supabase/rails/env.rb', line 65

def parse_jwks(raw)
  return nil if raw.nil? || raw.empty?

  parsed = JSON.parse(raw)
  return { "keys" => parsed } if parsed.is_a?(Array)
  return parsed if parsed.is_a?(Hash) && parsed["keys"].is_a?(Array)

  nil
rescue JSON::ParserError
  nil
end

.parse_jwks_url(raw) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/supabase/rails/env.rb', line 77

def parse_jwks_url(raw)
  return nil if raw.nil?

  trimmed = raw.strip
  return nil if trimmed.empty?

  uri = URI.parse(trimmed)
  return nil if uri.host.nil? || uri.host.empty?

  return uri if uri.scheme == "https"
  return uri if uri.scheme == "http" && loopback_host?(uri.host)

  nil
rescue URI::InvalidURIError
  nil
end

.parse_keys(raw) ⇒ Object



44
45
46
47
48
49
50
51
52
53
# File 'lib/supabase/rails/env.rb', line 44

def parse_keys(raw)
  return {} if raw.nil? || raw.empty?

  parsed = JSON.parse(raw)
  return {} unless parsed.is_a?(Hash)

  parsed
rescue JSON::ParserError
  {}
end

.resolve(overrides = {}) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/supabase/rails/env.rb', line 15

def resolve(overrides = {})
  overrides = symbolize_overrides(overrides)

  url = overrides.fetch(:url) { ENV["SUPABASE_URL"] }
  raise EnvError.missing_supabase_url if url.nil? || url.to_s.empty?

  SupabaseEnv.new(
    url: url,
    publishable_keys: overrides[:publishable_keys] || resolve_keys("SUPABASE_PUBLISHABLE_KEY", "SUPABASE_PUBLISHABLE_KEYS"),
    secret_keys: overrides[:secret_keys] || resolve_keys("SUPABASE_SECRET_KEY", "SUPABASE_SECRET_KEYS"),
    jwks: overrides.key?(:jwks) ? overrides[:jwks] : resolve_jwks
  )
end

.resolve_jwksObject



55
56
57
58
59
60
61
62
63
# File 'lib/supabase/rails/env.rb', line 55

def resolve_jwks
  raw_jwks = ENV["SUPABASE_JWKS"]
  return parse_jwks(raw_jwks) if raw_jwks && !raw_jwks.strip.empty?

  raw_jwks_url = ENV["SUPABASE_JWKS_URL"]
  return parse_jwks_url(raw_jwks_url) if raw_jwks_url && !raw_jwks_url.strip.empty?

  nil
end

.resolve_keys(singular_var, plural_var) ⇒ Object



34
35
36
37
38
39
40
41
42
# File 'lib/supabase/rails/env.rb', line 34

def resolve_keys(singular_var, plural_var)
  plural = ENV[plural_var]
  return parse_keys(plural) if plural && !plural.empty?

  singular = ENV[singular_var]
  return { "default" => singular } if singular && !singular.empty?

  {}
end

.symbolize_overrides(overrides) ⇒ Object



29
30
31
32
# File 'lib/supabase/rails/env.rb', line 29

def symbolize_overrides(overrides)
  return {} if overrides.nil?
  overrides.each_with_object({}) { |(k, v), h| h[k.to_sym] = v }
end