Module: SolidErrors::Frontend

Defined in:
lib/solid_errors/frontend.rb,
lib/solid_errors/frontend/engine.rb,
lib/solid_errors/frontend/report.rb,
lib/solid_errors/frontend/payload.rb,
lib/solid_errors/frontend/version.rb,
lib/solid_errors/frontend/reporter.rb,
lib/solid_errors/frontend/stack_parser.rb,
lib/solid_errors/frontend/source_mapper.rb,
lib/solid_errors/frontend/message_normalizer.rb,
app/helpers/solid_errors/frontend/tags_helper.rb,
lib/solid_errors/frontend/backtrace_formatter.rb,
app/controllers/solid_errors/frontend/reports_controller.rb

Defined Under Namespace

Modules: Payload, TagsHelper Classes: BacktraceFormatter, BrowserError, Engine, MessageNormalizer, Report, Reporter, ReportsController, SourceMapper, StackParser

Constant Summary collapse

NAME_PATTERN =

JavaScript error names we're willing to turn into a Ruby class name. Anything else (including anything an attacker could POST) collapses to JS::Error.

/\A[A-Z][A-Za-z0-9_]{0,63}\z/
MAX_ERROR_CLASSES =

Upper bound on the generated class registry, so a hostile client can't grow it without limit.

100
VERSION =
"0.1.0"

Class Method Summary collapse

Class Method Details

.error_class_for(js_name) ⇒ Object

Builds (and memoizes) an exception class whose #name reads "JS::TypeError". Solid Errors keys its grouping off the exception class name, so this is what makes browser errors legible next to server-side ones.



87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/solid_errors/frontend.rb', line 87

def error_class_for(js_name)
  name = NAME_PATTERN.match?(js_name.to_s) ? js_name.to_s : "Error"

  error_classes_lock.synchronize do
    error_classes[name] ||=
      if error_classes.size >= MAX_ERROR_CLASSES
        BrowserError
      else
        Class.new(BrowserError) do
          define_singleton_method(:name) { "JS::#{name}" }
        end
      end
  end
end

.log_reports?Boolean

Returns:

  • (Boolean)


78
79
80
81
82
# File 'lib/solid_errors/frontend.rb', line 78

def log_reports?
  return log_reports unless log_reports.nil?

  defined?(Rails) && Rails.respond_to?(:env) && !Rails.env.production?
end

.reset_error_classes!Object

:nodoc: for tests



102
103
104
# File 'lib/solid_errors/frontend.rb', line 102

def reset_error_classes! # :nodoc: for tests
  error_classes_lock.synchronize { @error_classes = {} }
end