Skip to content
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
- Fix: Integrations are executed on Hub creation
- Fix: NoOp encode for Web
- Fix: Breadcrumb data should accept serializable types and not only String values
- Ref: added Scope.applyToEvent

# `package:sentry` changelog

Expand Down
66 changes: 12 additions & 54 deletions dart/lib/src/client.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'dart:async';
import 'dart:math';

import 'package:meta/meta.dart';
import 'package:sentry/sentry.dart';
import 'package:sentry/src/transport/noop_transport.dart';

Expand Down Expand Up @@ -44,20 +43,14 @@ abstract class SentryClient {
return emptyFuture;
}

event = _applyScope(event: event, scope: scope);
event = scope?.applyToEvent(event, hint) ?? event;

// dropped by scope event processors
if (event == null) {
return emptyFuture;
}

// TODO create eventProcessors ?
event = event.copyWith(
serverName: _options.serverName,
environment: _options.environment,
release: _options.release,
platform: event.platform ?? sdkPlatform,
);
event = _prepareEvent(event);

if (_options.beforeSendCallback != null) {
try {
Expand All @@ -77,6 +70,16 @@ abstract class SentryClient {
return _options.transport.send(event);
}

SentryEvent _prepareEvent(SentryEvent event) {
return event.copyWith(
serverName: _options.serverName,
dist: _options.dist,
environment: _options.environment,
release: _options.release,
platform: event.platform ?? sdkPlatform,
);
}

/// Reports the [throwable] and optionally its [stackTrace] to Sentry.io.
Future<SentryId> captureException(
dynamic throwable, {
Expand Down Expand Up @@ -142,51 +145,6 @@ abstract class SentryClient {
return event;
}

SentryEvent _applyScope({
@required SentryEvent event,
@required Scope scope,
}) {
if (scope != null) {
// Merge the scope transaction.
if (event.transaction == null) {
event = event.copyWith(transaction: scope.transaction);
}

// Merge the user context.
if (event.userContext == null) {
event = event.copyWith(userContext: scope.user);
}

// Merge the scope fingerprint.
if (event.fingerprint == null) {
event = event.copyWith(fingerprint: scope.fingerprint);
}

// Merge the scope breadcrumbs.
if (event.breadcrumbs == null) {
event = event.copyWith(breadcrumbs: scope.breadcrumbs);
}

// Merge the scope tags.
event = event.copyWith(
tags: scope.tags.map((key, value) => MapEntry(key, value))
..addAll(event.tags ?? {}));

// Merge the scope extra.
event = event.copyWith(
extra: scope.extra.map((key, value) => MapEntry(key, value))
..addAll(event.extra ?? {}));

// Merge the scope level.
if (scope.level != null) {
event = event.copyWith(level: scope.level);
}

// TODO: execute scope event processors
}
return event;
}

bool _sampleRate() {
if (_options.sampleRate != null && _random != null) {
return (_options.sampleRate < _random.nextDouble());
Expand Down
53 changes: 53 additions & 0 deletions dart/lib/src/scope.dart
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,59 @@ class Scope {
/// Removes an extra from the Scope
void removeExtra(String key) => _extra.remove(key);

SentryEvent applyToEvent(SentryEvent event, dynamic hint) {
if (event.transaction == null) {
event = event.copyWith(transaction: transaction);
}

// Merge the user context.
if (event.userContext == null) {
event = event.copyWith(userContext: user);
}

// Merge the scope fingerprint.
if (event.fingerprint == null) {
event = event.copyWith(fingerprint: fingerprint);
}

// Merge the scope breadcrumbs.
if (event.breadcrumbs == null) {
event = event.copyWith(breadcrumbs: breadcrumbs);
}

// Merge the scope tags.
event = event.copyWith(
tags: tags.map((key, value) => MapEntry(key, value))
..addAll(event.tags ?? {}));

// Merge the scope extra.
event = event.copyWith(
extra: extra.map((key, value) => MapEntry(key, value))
..addAll(event.extra ?? {}));

// Merge the scope level.
if (level != null) {
event = event.copyWith(level: level);
}

for (final processor in _eventProcessors) {
try {
event = processor(event, hint);
} catch (err) {
_options.logger(
SentryLevel.error,
'An exception occurred while processing event by a processor : $err',
);
}
if (event == null) {
_options.logger(SentryLevel.debug, 'Event was dropped by a processor');
break;
}
}

return event;
}

/// Clones the current Scope
Scope clone() {
final clone = Scope(_options)
Expand Down