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
-
.error_class_for(js_name) ⇒ Object
Builds (and memoizes) an exception class whose #name reads "JS::TypeError".
- .log_reports? ⇒ Boolean
-
.reset_error_classes! ⇒ Object
:nodoc: for tests.
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
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 |