From b867a518f4d9c7f0e45aa76124f2fb95c55c3faf Mon Sep 17 00:00:00 2001 From: Lejard Hadrien Date: Mon, 9 Apr 2018 22:34:19 +0200 Subject: [PATCH 1/8] use angular 5 --- .gitignore | 1 + lib/angular_sentry.dart | 48 ++--------------------------------------- pubspec.yaml | 14 ++++++------ 3 files changed, 11 insertions(+), 52 deletions(-) diff --git a/.gitignore b/.gitignore index 1410a61..2b52bee 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ pubspec.lock # Directory created by dartdoc doc/api/ +.dart_tool \ No newline at end of file diff --git a/lib/angular_sentry.dart b/lib/angular_sentry.dart index fe1dac2..394760a 100644 --- a/lib/angular_sentry.dart +++ b/lib/angular_sentry.dart @@ -6,7 +6,6 @@ import 'dart:async'; import 'package:angular/angular.dart'; import 'package:logging/logging.dart'; import "package:sentry/sentry.dart"; -import 'package:stack_trace/stack_trace.dart'; import "package:http/browser_client.dart"; const OpaqueToken sentryDsn = const OpaqueToken('sentryDSN'); @@ -29,7 +28,7 @@ class AngularSentry implements ExceptionHandler { _log = new Logger("$runtimeType"); // prevent DI circular dependency - new Future.delayed(Duration.ZERO, () { + new Future.delayed(Duration.zero, () { _appRef = injector.get(ApplicationRef) as ApplicationRef; }); } @@ -77,7 +76,7 @@ class AngularSentry implements ExceptionHandler { void _send(dynamic exception, [dynamic stackTrace, String reason]) { final event = new Event( exception: exception, - stackTrace: parseStackTrace(stackTrace), + stackTrace: stackTrace, release: release, environment: environment, extra: extra, @@ -86,46 +85,3 @@ class AngularSentry implements ExceptionHandler { _sentry?.capture(event: event); } } - -Trace parseStackTrace(dynamic stackTrace) { - if (stackTrace is StackTrace) { - return new Trace.parse(stackTrace.toString()); - } else if (stackTrace is String) { - return new Trace.parse(stackTrace); - } else if (stackTrace is Iterable && stackTrace.length == 1) { - return new Trace.parse(stackTrace.first); - } else if (stackTrace is Iterable) { - final trace = stackTrace.map(parseFrame).where((f) => f != null).toList(); - return new Trace(trace); - } - return new Trace.current(); -} - -Frame parseFrame(f) { - if (f is Frame) { - return f; - } - Frame parsed; - if (f is String) { - parsed = new Frame.parseV8(f); - if (parsed is UnparsedFrame) { - parsed = new Frame.parseFirefox(f); - if (parsed is UnparsedFrame) { - parsed = new Frame.parseSafari(f); - if (parsed is UnparsedFrame) { - try { - parsed = new Frame.parseFriendly(f); - } catch (_) { - parsed = null; - } - } - } - } - } - - if (parsed is UnparsedFrame) { - parsed = null; - } - - return parsed; -} diff --git a/pubspec.yaml b/pubspec.yaml index 53c42a2..0732eef 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: angular_sentry description: Helper to implements sentry with Angular -version: 0.0.3 +version: 0.0.4 homepage: https://lefty.io author: Hadrien Lejard @@ -8,11 +8,13 @@ environment: sdk: '>=1.20.1 <2.0.0' dependencies: - angular: ^4.0.0 - sentry: ^0.0.6 - stack_trace: ^1.9.0 + angular: ^5.0.0-alpha+9 + sentry: ^2.0.0 logging: ^0.11.0 http: ^0.11.3 -#dev_dependencies: -# test: ^0.12.0 +dev_dependencies: + build: '>=0.11.1 <0.13.0' + build_runner: ^0.8.1 + build_test: ^0.10.1+1 + build_web_compilers: ^0.3.5 \ No newline at end of file From 4a9b253e7bacc1ce2b733cc4289308a871d22308 Mon Sep 17 00:00:00 2001 From: Lejard Hadrien Date: Wed, 25 Apr 2018 23:54:08 +0200 Subject: [PATCH 2/8] use SentryBrowserClient --- .gitignore | 3 ++- CHANGELOG.md | 5 +++++ lib/angular_sentry.dart | 38 +++++++++++++++++--------------------- pubspec.yaml | 3 ++- 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index 2b52bee..29dccf1 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ pubspec.lock # Directory created by dartdoc doc/api/ -.dart_tool \ No newline at end of file +.dart_tool +.idea \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 79ae59a..e326ac2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 0.0.4 + +- Update angular 5 +- use SentryBrowserClient + ## 0.0.3 - fix logger diff --git a/lib/angular_sentry.dart b/lib/angular_sentry.dart index 394760a..5034791 100644 --- a/lib/angular_sentry.dart +++ b/lib/angular_sentry.dart @@ -5,25 +5,23 @@ import 'dart:async'; import 'package:angular/angular.dart'; import 'package:logging/logging.dart'; -import "package:sentry/sentry.dart"; +import "package:sentry/sentry_browser.dart"; import "package:http/browser_client.dart"; const OpaqueToken sentryDsn = const OpaqueToken('sentryDSN'); -@Injectable() class AngularSentry implements ExceptionHandler { - SentryClient _sentry; + SentryBrowserClient _sentry; Logger _log; + Logger get log => _log; ApplicationRef _appRef; AngularSentry(Injector injector, @Optional() @Inject(sentryDsn) String dsn, @Optional() BrowserClient client) { if (dsn != null) { - _sentry = new SentryClient( - dsn: dsn, - compressPayload: false, - httpClient: client ?? new BrowserClient()); + _sentry = new SentryBrowserClient( + dsn: dsn, httpClient: client ?? new BrowserClient()); } _log = new Logger("$runtimeType"); @@ -62,26 +60,24 @@ class AngularSentry implements ExceptionHandler { /// provide environment data to the sentry report String get environment => null; - Map get tags => { - "userAgent": html.window.navigator.userAgent, - "platform": html.window.navigator.platform - }; + Map get tags => {}; /// The release version of the application. String get release => null; /// provide extra data to the sentry report - Map get extra => null; + Map get extra => {}; void _send(dynamic exception, [dynamic stackTrace, String reason]) { - final event = new Event( - exception: exception, - stackTrace: stackTrace, - release: release, - environment: environment, - extra: extra, - tags: tags, - message: reason); - _sentry?.capture(event: event); + _sentry?.capture( + event: new Event( + exception: exception, + stackTrace: stackTrace, + release: release, + environment: environment, + extra: extra, + tags: tags, + message: reason, + platform: jsPlatform)); } } diff --git a/pubspec.yaml b/pubspec.yaml index 0732eef..1c5f7a2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,7 +9,8 @@ environment: dependencies: angular: ^5.0.0-alpha+9 - sentry: ^2.0.0 + sentry: + git: https://github.com/lejard-h/sentry.git logging: ^0.11.0 http: ^0.11.3 From 794ffafa40a64f94605d4bd54e0083e18dfd92b0 Mon Sep 17 00:00:00 2001 From: Lejard Hadrien Date: Thu, 26 Apr 2018 11:38:43 +0200 Subject: [PATCH 3/8] send origin --- lib/angular_sentry.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/angular_sentry.dart b/lib/angular_sentry.dart index 5034791..f6e1168 100644 --- a/lib/angular_sentry.dart +++ b/lib/angular_sentry.dart @@ -78,6 +78,7 @@ class AngularSentry implements ExceptionHandler { extra: extra, tags: tags, message: reason, - platform: jsPlatform)); + platform: jsPlatform, + origin: _sentry.origin)); } } From a59371d6faff603aa77fece1770990754629ad62 Mon Sep 17 00:00:00 2001 From: Lejard Hadrien Date: Tue, 17 Jul 2018 14:22:25 +0200 Subject: [PATCH 4/8] angular beta --- pubspec.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 1c5f7a2..966f8e4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,17 +5,17 @@ homepage: https://lefty.io author: Hadrien Lejard environment: - sdk: '>=1.20.1 <2.0.0' + sdk: '>=2.0.0-dev.65.0 <2.0.0' dependencies: - angular: ^5.0.0-alpha+9 + angular: ^5.0.0-beta sentry: git: https://github.com/lejard-h/sentry.git logging: ^0.11.0 http: ^0.11.3 dev_dependencies: - build: '>=0.11.1 <0.13.0' - build_runner: ^0.8.1 - build_test: ^0.10.1+1 - build_web_compilers: ^0.3.5 \ No newline at end of file + build: '>=0.11.1 <1.0.0' + build_runner: '>=0.8.0 <1.0.0' + build_test: '>=0.10.0 <1.0.0' + build_web_compilers: '>=0.4.0 <1.0.0' \ No newline at end of file From b4b39120a45c6943434021d502a6e08470f25931 Mon Sep 17 00:00:00 2001 From: Lejard Hadrien Date: Mon, 6 Aug 2018 14:41:03 +0200 Subject: [PATCH 5/8] update sentry, refactoring, 0.1.0 --- CHANGELOG.md | 9 +++ README.md | 72 ++++++++++++------ analysis_options.yaml | 15 ++-- example/index.html | 18 +++++ example/main.dart | 65 ++++++++++++++++ lib/angular_sentry.dart | 165 +++++++++++++++++++++++++++++----------- pubspec.yaml | 8 +- 7 files changed, 273 insertions(+), 79 deletions(-) create mode 100644 example/index.html create mode 100644 example/main.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index e326ac2..ee1fb69 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 0.1.0 + +- Update sentry package +- ***Warning*** refactoring ***Breaking Change***: + + use OpaqueToken to pass release version, environment, dsn and logger + sentryEnvironmentToken,sentryReleaseVersionToken, sentryLoggerToken, sentryDsnToken + + no more tags and extra field, override `transformEvent` function instead + + rename `onCatch` to `capture` + ## 0.0.4 - Update angular 5 diff --git a/README.md b/README.md index d0fc110..fe68891 100644 --- a/README.md +++ b/README.md @@ -10,43 +10,71 @@ Helper to implements sentry with Angular. import "package:angular/angular.dart"; import "package:angular_sentry/angular_sentry.dart"; +// ignore: uri_has_not_been_generated +import 'main.template.dart' as ng; + +const sentryModule = Module(provide: [ + ValueProvider.forToken(sentryLoggerToken, "MY_SENTRY_DSN"), + ValueProvider.forToken(sentryEnvironmentToken, "production"), + ValueProvider.forToken(sentryReleaseVersionToken, "1.0.0"), + ClassProvider( + ExceptionHandler, + useClass: AngularSentry, + ), +]); + +@GenerateInjector( + [sentryModule], +) +const scannerApp = ng.scannerApp$Injector; + main() { - bootstrap(MyApp, [ - provide(SENTRY_DSN, useValue: "MY_SENTRY_DSN"), - provide(ExceptionHandler, useClass: AngularSentry) - ]); + runApp(appComponentNgFactory, createInjector: scannerApp); } - ``` ### Advanced +Implement your own class using AngularSentry + ```dart +const sentryModule = Module(provide: [ + ... + ClassProvider( + ExceptionHandler, + useClass: AppSentry, + ), +]); + main() { - bootstrap(MyApp, [ - AppSentry - ]); + runApp(appComponentNgFactory, createInjector: scannerApp); } -@Injectable() class AppSentry extends AngularSentry { - AppSentry(Injector injector) - : super(injector, "MY_SENTRY_DSN"); - - SentryUser get user => new SentryUser(); - - String get environment => "production"; - - String get release => "1.0.0"; - - Map get extra => {"location_url": window.location.href}; + AppSentry(Injector injector, NgZone zone) + : super( + injector, + zone, + dsn: "MY_SENTRY_DSN", + environment: "production", + release: "1.0.0", + ); + + @override + Event transformEvent(Event e) { + return super.transformEvent(e).replace( + userContext: new User(id: '1', ipAddress: '0.0.0.0'), + extra: {"location_url": window.location.href}, + ); + } - void onCatch(dynamic exception, Trace trace, [String reason]) { + @override + void capture(exception, [trace, String reason]) { if (exception is ClientException) { - log("Network error"); + logError("Network error"); } else { - super.onCatch(exception, trace, reason); + super.capture(exception, trace, reason); } } } diff --git a/analysis_options.yaml b/analysis_options.yaml index 97f0908..8d57e21 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,15 +1,14 @@ analyzer: - strong-mode: true # exclude: # - path/to/excluded/files/** # Lint rules and documentation, see http://dart-lang.github.io/linter/lints linter: rules: - - cancel_subscriptions - - hash_and_equals - - iterable_contains_unrelated_type - - list_remove_unrelated_type - - test_types_in_equals - - unrelated_type_equality_checks - - valid_regexps + - cancel_subscriptions + - hash_and_equals + - iterable_contains_unrelated_type + - list_remove_unrelated_type + - test_types_in_equals + - unrelated_type_equality_checks + - valid_regexps diff --git a/example/index.html b/example/index.html new file mode 100644 index 0000000..df47544 --- /dev/null +++ b/example/index.html @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/example/main.dart b/example/main.dart new file mode 100644 index 0000000..395c51d --- /dev/null +++ b/example/main.dart @@ -0,0 +1,65 @@ +import 'dart:html' hide Event; + +import "package:angular/angular.dart"; +import "package:angular_sentry/angular_sentry.dart"; +import 'package:http/http.dart'; + +// ignore: uri_has_not_been_generated +import 'main.template.dart' as ng; + +const sentryModule = Module(provide: [ + //ValueProvider.forToken(sentryLoggerToken, "MY_SENTRY_DSN"), + ValueProvider.forToken(sentryEnvironmentToken, "production"), + ValueProvider.forToken(sentryReleaseVersionToken, "1.0.0"), + ClassProvider( + ExceptionHandler, + useClass: AppSentry, + ), +]); + +@GenerateInjector( + [sentryModule], +) +const scannerApp = ng.scannerApp$Injector; + +main() { + runApp(ng.AppComponentNgFactory, createInjector: scannerApp); +} + +@Component( + selector: 'app', + template: '', +) +class AppComponent { + void error() { + throw Exception("Test error"); + } +} + +class AppSentry extends AngularSentry { + AppSentry(Injector injector, NgZone zone) + : super( + injector, + zone, + //dsn: "MY_SENTRY_DSN", + environment: "production", + release: "1.0.0", + ); + + @override + Event transformEvent(Event e) { + return super.transformEvent(e).replace( + userContext: new User(id: '1', ipAddress: '0.0.0.0'), + extra: {"location_url": window.location.href}, + ); + } + + @override + void capture(exception, [trace, String reason]) { + if (exception is ClientException) { + logError("Network error"); + } else { + super.capture(exception, trace, reason); + } + } +} diff --git a/lib/angular_sentry.dart b/lib/angular_sentry.dart index f6e1168..d3cf746 100644 --- a/lib/angular_sentry.dart +++ b/lib/angular_sentry.dart @@ -3,82 +3,155 @@ library angular_sentry; import "dart:html" as html; import 'dart:async'; +import 'package:meta/meta.dart'; import 'package:angular/angular.dart'; import 'package:logging/logging.dart'; import "package:sentry/sentry_browser.dart"; +import "package:http/http.dart"; import "package:http/browser_client.dart"; -const OpaqueToken sentryDsn = const OpaqueToken('sentryDSN'); +export 'package:sentry/sentry_browser.dart'; + +typedef Event TransformEvent(Event e); + +/// Use to transform the event before sending to sentry +/// add tags or extra for example +const sentryTransformEventToken = OpaqueToken( + 'sentry.transformEvent', +); + +/// provide environment data to the sentry report +const sentryEnvironmentToken = OpaqueToken('sentry.env'); + +/// The release version of the application. +const sentryReleaseVersionToken = OpaqueToken('sentry.release'); + +/// Pass Logger to sentry +/// If no logger, it will print exception to console +const sentryLoggerToken = OpaqueToken('sentry.logger'); + +/// Provide sentry dsn +/// If no dsn provided, it will log the exception without reporting it to sentry +const sentryDsnToken = OpaqueToken('sentry.dsn'); class AngularSentry implements ExceptionHandler { - SentryBrowserClient _sentry; - Logger _log; + final Logger log; + final String environment; + final String release; + final String dsn; + final Client client; + final TransformEvent eventTransformer; + final _exceptionController = new StreamController.broadcast(); + final NgZone zone; - Logger get log => _log; + Stream _onException; + SentryClientBrowser _sentry; ApplicationRef _appRef; - AngularSentry(Injector injector, @Optional() @Inject(sentryDsn) String dsn, - @Optional() BrowserClient client) { - if (dsn != null) { - _sentry = new SentryBrowserClient( - dsn: dsn, httpClient: client ?? new BrowserClient()); - } - - _log = new Logger("$runtimeType"); + AngularSentry( + Injector injector, + this.zone, { + @Optional() this.client, + @Optional() @Inject(sentryDsnToken) this.dsn, + @Optional() @Inject(sentryLoggerToken) this.log, + @Optional() @Inject(sentryEnvironmentToken) this.environment, + @Optional() @Inject(sentryReleaseVersionToken) this.release, + @Optional() @Inject(sentryTransformEventToken) this.eventTransformer, + }) { // prevent DI circular dependency new Future.delayed(Duration.zero, () { _appRef = injector.get(ApplicationRef) as ApplicationRef; }); + + _onException = + _exceptionController.stream.map(transformEvent).where((e) => e != null); + + _onException.listen(_sendEvent, onError: logError); + + zone.runOutsideAngular(_initSentry); } - void onCatch(dynamic exception, [dynamic stackTrace, String reason]) { + void _initSentry() { + if (dsn == null) return; + try { - _send(exception, stackTrace, reason); + _sentry = new SentryClientBrowser( + dsn: dsn, + httpClient: client ?? new BrowserClient(), + environmentAttributes: Event( + environment: environment, + release: release, + )); } catch (e, s) { logError(e, s); - // do nothing; } } + void _sendEvent(Event e) => zone.runOutsideAngular(() { + try { + _sentry?.capture(event: e); + } catch (e, s) { + logError(e, s); + } + }); + + /// onException stream after [transformEvent] call + Stream get onException => _onException; + + /// can be override to transform sentry report + /// adding tags or extra for example + @protected + @mustCallSuper + Event transformEvent(Event e) => zone.runOutsideAngular(() { + try { + if (eventTransformer == null) return e; + + return eventTransformer(e); + } catch (e, s) { + logError(e, s); + } + }); + /// Log the catched error using Logging - /// Called before onCatch - void logError(dynamic exception, [dynamic stackTrace, String reason]) { - _log.severe(() => ExceptionHandler.exceptionToString( - exception, - stackTrace, - reason, - )); + /// if no logger provided, print into console with window.console.error + void logError(exception, [stackTrace, String reason]) { + if (log != null) { + log.severe(reason, exception, stackTrace); + } else { + logErrorWindow(exception, stackTrace, reason); + } + } + + /// log error using window.console.error + void logErrorWindow(exception, [stackTrace, String reason]) { + if (reason != null) html.window.console.error(reason); + + html.window.console.error(exception); + + if (stackTrace != null) html.window.console.error(stackTrace); } + @protected + @mustCallSuper + void capture(dynamic exception, [dynamic stackTrace, String reason]) => + _exceptionController.add(Event( + exception: exception, + stackTrace: stackTrace, + message: reason, + )); + @override + @protected void call(dynamic exception, [dynamic stackTrace, String reason]) { logError(exception, stackTrace, reason); - onCatch(exception, stackTrace, reason); + capture(exception, stackTrace, reason); + + // not sure about this + // the application state might not be clean _appRef?.tick(); } - /// provide environment data to the sentry report - String get environment => null; - - Map get tags => {}; - - /// The release version of the application. - String get release => null; - - /// provide extra data to the sentry report - Map get extra => {}; - - void _send(dynamic exception, [dynamic stackTrace, String reason]) { - _sentry?.capture( - event: new Event( - exception: exception, - stackTrace: stackTrace, - release: release, - environment: environment, - extra: extra, - tags: tags, - message: reason, - platform: jsPlatform, - origin: _sentry.origin)); + void dispose() { + _exceptionController.close(); } } diff --git a/pubspec.yaml b/pubspec.yaml index 966f8e4..516b964 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,16 +1,18 @@ name: angular_sentry description: Helper to implements sentry with Angular -version: 0.0.4 +version: 0.1.0 homepage: https://lefty.io author: Hadrien Lejard environment: - sdk: '>=2.0.0-dev.65.0 <2.0.0' + sdk: '>=2.0.0-dev.65.0 <3.0.0' dependencies: angular: ^5.0.0-beta sentry: - git: https://github.com/lejard-h/sentry.git + git: + url: https://github.com/lejard-h/sentry.git + ref: web logging: ^0.11.0 http: ^0.11.3 From 661051878c593d6a4640228840a9bebda3643e36 Mon Sep 17 00:00:00 2001 From: Lejard Hadrien Date: Mon, 6 Aug 2018 15:43:09 +0200 Subject: [PATCH 6/8] log with toString() --- example/app.dart | 11 +++++++++++ example/main.dart | 17 +++++------------ lib/angular_sentry.dart | 6 +++--- 3 files changed, 19 insertions(+), 15 deletions(-) create mode 100644 example/app.dart diff --git a/example/app.dart b/example/app.dart new file mode 100644 index 0000000..563811c --- /dev/null +++ b/example/app.dart @@ -0,0 +1,11 @@ +import 'package:angular/angular.dart'; + +@Component( + selector: 'app', + template: '', +) +class AppComponent { + void error() { + throw Exception("Test error"); + } +} diff --git a/example/main.dart b/example/main.dart index 395c51d..251dd7c 100644 --- a/example/main.dart +++ b/example/main.dart @@ -7,13 +7,16 @@ import 'package:http/http.dart'; // ignore: uri_has_not_been_generated import 'main.template.dart' as ng; +// ignore: uri_has_not_been_generated +import 'app.template.dart' as app; + const sentryModule = Module(provide: [ //ValueProvider.forToken(sentryLoggerToken, "MY_SENTRY_DSN"), ValueProvider.forToken(sentryEnvironmentToken, "production"), ValueProvider.forToken(sentryReleaseVersionToken, "1.0.0"), ClassProvider( ExceptionHandler, - useClass: AppSentry, + useClass: AngularSentry, ), ]); @@ -23,17 +26,7 @@ const sentryModule = Module(provide: [ const scannerApp = ng.scannerApp$Injector; main() { - runApp(ng.AppComponentNgFactory, createInjector: scannerApp); -} - -@Component( - selector: 'app', - template: '', -) -class AppComponent { - void error() { - throw Exception("Test error"); - } + runApp(app.AppComponentNgFactory, createInjector: scannerApp); } class AppSentry extends AngularSentry { diff --git a/lib/angular_sentry.dart b/lib/angular_sentry.dart index d3cf746..e89488b 100644 --- a/lib/angular_sentry.dart +++ b/lib/angular_sentry.dart @@ -124,11 +124,11 @@ class AngularSentry implements ExceptionHandler { /// log error using window.console.error void logErrorWindow(exception, [stackTrace, String reason]) { - if (reason != null) html.window.console.error(reason); + if (reason != null) html.window.console.error(reason.toString()); - html.window.console.error(exception); + html.window.console.error(exception.toString()); - if (stackTrace != null) html.window.console.error(stackTrace); + if (stackTrace != null) html.window.console.error(stackTrace.toString()); } @protected From 01437fddc068c0aee967add426c9e96f56fe16d0 Mon Sep 17 00:00:00 2001 From: Lejard Hadrien Date: Thu, 30 Aug 2018 10:22:47 +0200 Subject: [PATCH 7/8] fix build example --- build.yaml | 8 ++++++++ lib/angular_sentry.dart | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 build.yaml diff --git a/build.yaml b/build.yaml new file mode 100644 index 0000000..26ba14c --- /dev/null +++ b/build.yaml @@ -0,0 +1,8 @@ +targets: + angular_sentry: + sources: + include: ["example/**", "lib/**"] + builders: + build_web_compilers|dart_source_cleanup: + release_options: + enabled: false \ No newline at end of file diff --git a/lib/angular_sentry.dart b/lib/angular_sentry.dart index b2d85ed..bdbd54c 100644 --- a/lib/angular_sentry.dart +++ b/lib/angular_sentry.dart @@ -155,4 +155,4 @@ class AngularSentry implements ExceptionHandler { void dispose() { _exceptionController.close(); } -} \ No newline at end of file +} From 6593ce0ec4c5c904dd0425e15704b2f2a17963e1 Mon Sep 17 00:00:00 2001 From: Lejard Hadrien Date: Thu, 30 Aug 2018 10:27:04 +0200 Subject: [PATCH 8/8] remove zone --- example/main.dart | 3 +- lib/angular_sentry.dart | 62 ++++++++++++++++++++++------------------- 2 files changed, 35 insertions(+), 30 deletions(-) diff --git a/example/main.dart b/example/main.dart index 251dd7c..96b0325 100644 --- a/example/main.dart +++ b/example/main.dart @@ -30,10 +30,9 @@ main() { } class AppSentry extends AngularSentry { - AppSentry(Injector injector, NgZone zone) + AppSentry(Injector injector) : super( injector, - zone, //dsn: "MY_SENTRY_DSN", environment: "production", release: "1.0.0", diff --git a/lib/angular_sentry.dart b/lib/angular_sentry.dart index bdbd54c..d238cdf 100644 --- a/lib/angular_sentry.dart +++ b/lib/angular_sentry.dart @@ -41,8 +41,8 @@ class AngularSentry implements ExceptionHandler { final String dsn; final Client client; final TransformEvent eventTransformer; - final _exceptionController = new StreamController.broadcast(); - final NgZone zone; + + final _exceptionController = StreamController.broadcast(); Stream _onException; SentryClientBrowser _sentry; @@ -50,8 +50,7 @@ class AngularSentry implements ExceptionHandler { ApplicationRef _appRef; AngularSentry( - Injector injector, - this.zone, { + Injector injector, { @Optional() this.client, @Optional() @Inject(sentryDsnToken) this.dsn, @Optional() @Inject(sentryLoggerToken) this.log, @@ -64,21 +63,27 @@ class AngularSentry implements ExceptionHandler { _appRef = injector.get(ApplicationRef) as ApplicationRef; }); - _onException = - _exceptionController.stream.map(transformEvent).where((e) => e != null); - - _onException.listen(_sendEvent, onError: logError); - - zone.runOutsideAngular(_initSentry); + _onException = _exceptionController.stream + .map( + transformEvent, + ) + .where( + (event) => event != null, + )..listen( + _sendEvent, + onError: logError, + ); + + _initSentry(); } void _initSentry() { if (dsn == null) return; try { - _sentry = new SentryClientBrowser( + _sentry = SentryClientBrowser( dsn: dsn, - httpClient: client ?? new BrowserClient(), + httpClient: client ?? BrowserClient(), environmentAttributes: Event( environment: environment, release: release, @@ -88,13 +93,13 @@ class AngularSentry implements ExceptionHandler { } } - void _sendEvent(Event e) => zone.runOutsideAngular(() { - try { - _sentry?.capture(event: e); - } catch (e, s) { - logError(e, s); - } - }); + void _sendEvent(Event e) { + try { + _sentry?.capture(event: e); + } catch (e, s) { + logError(e, s); + } + } /// onException stream after [transformEvent] call Stream get onException => _onException; @@ -103,15 +108,16 @@ class AngularSentry implements ExceptionHandler { /// adding tags or extra for example @protected @mustCallSuper - Event transformEvent(Event e) => zone.runOutsideAngular(() { - try { - if (eventTransformer == null) return e; - - return eventTransformer(e); - } catch (e, s) { - logError(e, s); - } - }); + Event transformEvent(Event e) { + try { + if (eventTransformer == null) return e; + + return eventTransformer(e); + } catch (e, s) { + logError(e, s); + return e; + } + } /// Log the catched error using Logging /// if no logger provided, print into console with window.console.error