From 42b6cd61056656d95a4bd76481bce1ed7c13a816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Og=C3=B3rek?= Date: Tue, 19 Feb 2019 15:25:45 +0100 Subject: [PATCH] feat: Disable client once flushed (#1904) --- CHANGELOG.md | 1 + packages/browser/src/integrations/globalhandlers.ts | 3 ++- packages/browser/test/index.test.ts | 11 ++++++----- packages/core/src/baseclient.ts | 4 +++- packages/node/test/index.test.ts | 8 ++++---- packages/utils/test/object.test.ts | 2 +- 6 files changed, 17 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4492270f33b..7f1243335670 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ since we removed some methods from the public API and removed some classes from - **breaking** [core] ref: Use `SyncPromise` internally, this reduces memory pressure by a lot. - **breaking** [browser] ref: Removed `BrowserBackend` from default export. - **breaking** [node] ref: Removed `BrowserBackend` from default export. +- **breaking** [core] feat: Disable client once flushed using `close` method - ref: Move internal `ExtendedError` to a types package - **breaking** [core] ref: Pass `Event` to `sendEvent` instead of already stringified data - [utils] feat: Introduce `isSyntheticEvent` util diff --git a/packages/browser/src/integrations/globalhandlers.ts b/packages/browser/src/integrations/globalhandlers.ts index 87dad8aabebe..ca97b3bcf600 100644 --- a/packages/browser/src/integrations/globalhandlers.ts +++ b/packages/browser/src/integrations/globalhandlers.ts @@ -1,6 +1,7 @@ import { getCurrentHub } from '@sentry/core'; import { Event, Integration } from '@sentry/types'; import { logger } from '@sentry/utils/logger'; +import { normalize } from '@sentry/utils/object'; import { truncate } from '@sentry/utils/string'; import { addExceptionTypeValue, eventFromStacktrace } from '../parsers'; import { @@ -113,7 +114,7 @@ export class GlobalHandlers implements Integration { }, }; - const fallbackValue = stacktrace.original ? truncate(JSON.stringify(stacktrace.original), 300) : ''; + const fallbackValue = stacktrace.original ? truncate(JSON.stringify(normalize(stacktrace.original)), 300) : ''; const fallbackType = stacktrace.mechanism === 'onunhandledrejection' ? 'UnhandledRejection' : 'Error'; // This makes sure we have type/value in every exception diff --git a/packages/browser/test/index.test.ts b/packages/browser/test/index.test.ts index 4df6ed90b7b4..a41b8e7e21a7 100644 --- a/packages/browser/test/index.test.ts +++ b/packages/browser/test/index.test.ts @@ -8,6 +8,7 @@ import { captureMessage, configureScope, Event, + flush, getCurrentHub, init, Integrations, @@ -74,7 +75,7 @@ describe('SentryBrowser', () => { addBreadcrumb({ message: 'test2' }); captureMessage('event'); - await (getCurrentHub().getClient() as BrowserClient).close(2000); + await flush(2000); expect(beforeSend.args[0][0].breadcrumbs).to.have.lengthOf(2); }); }); @@ -87,7 +88,7 @@ describe('SentryBrowser', () => { captureException(e); } - await (getCurrentHub().getClient() as BrowserClient).close(2000); + await flush(2000); const event = beforeSend.args[0][0]; expect(event.exception).to.not.be.undefined; @@ -131,7 +132,7 @@ describe('SentryBrowser', () => { captureMessage('event222'); captureMessage('event222'); - await (getCurrentHub().getClient() as BrowserClient).close(2000); + await flush(2000); expect(beforeSend.calledOnce).to.be.true; }); @@ -149,7 +150,7 @@ describe('SentryBrowser', () => { captureMessage('event222'); captureMessage('event222'); - await (getCurrentHub().getClient() as BrowserClient).close(2000); + await flush(2000); expect(localBeforeSend.calledTwice).to.be.true; }); @@ -166,7 +167,7 @@ describe('SentryBrowser', () => { captureMessage('capture'); - await (getCurrentHub().getClient() as BrowserClient).close(2000); + await flush(2000); expect(localBeforeSend.called).to.be.false; }); diff --git a/packages/core/src/baseclient.ts b/packages/core/src/baseclient.ts index e7d0deb27eee..87da0ef8751d 100644 --- a/packages/core/src/baseclient.ts +++ b/packages/core/src/baseclient.ts @@ -333,7 +333,9 @@ export abstract class BaseClient implement * @inheritDoc */ public async close(timeout?: number): Promise { - return this.flush(timeout); + return this.flush(timeout).finally(() => { + this.getOptions().enabled = false; + }); } /** diff --git a/packages/node/test/index.test.ts b/packages/node/test/index.test.ts index 55d4f7e6f1f9..3b3b883f2fa1 100644 --- a/packages/node/test/index.test.ts +++ b/packages/node/test/index.test.ts @@ -32,7 +32,7 @@ describe('SentryNode', () => { getCurrentHub().popScope(); }); - test('close() with to short timeout', done => { + test('flush() with to short timeout', done => { expect.assertions(1); jest.useFakeTimers(); const client = new NodeClient({ @@ -44,7 +44,7 @@ describe('SentryNode', () => { captureMessage('test'); captureMessage('test'); client - .close(50) + .flush(50) .then(result => { expect(result).toBeFalsy(); done(); @@ -55,7 +55,7 @@ describe('SentryNode', () => { jest.runAllTimers(); }); - test('close() with timeout', done => { + test('flush() with timeout', done => { expect.assertions(1); jest.useFakeTimers(); const client = new NodeClient({ @@ -68,7 +68,7 @@ describe('SentryNode', () => { captureMessage('test'); jest.runAllTimers(); client - .close(50) + .flush(50) .then(result => { expect(result).toBeFalsy(); done(); diff --git a/packages/utils/test/object.test.ts b/packages/utils/test/object.test.ts index cf0148a00ea6..c2bc0b70930a 100644 --- a/packages/utils/test/object.test.ts +++ b/packages/utils/test/object.test.ts @@ -495,7 +495,7 @@ describe('normalize()', () => { /*no-empty*/ }, }; - const result = safeNormalize(obj); + const result = normalize(obj); expect(result).toEqual({ foo: '[SyntheticEvent]', baz: '[NaN]',