Skip to content

Commit b3aa059

Browse files
committed
node: use new AlternatingFileWriter with limits, add and use factory for FileBreadcrumbsStorage
1 parent 3fd0565 commit b3aa059

File tree

3 files changed

+356
-19
lines changed

3 files changed

+356
-19
lines changed

packages/node/src/BacktraceClient.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,7 @@ export class BacktraceClient extends BacktraceCoreClient<BacktraceConfiguration>
4343

4444
const breadcrumbsManager = this.modules.get(BreadcrumbsManager);
4545
if (breadcrumbsManager && this.sessionFiles) {
46-
breadcrumbsManager.setStorage(
47-
FileBreadcrumbsStorage.create(
48-
this.sessionFiles,
49-
fileSystem,
50-
clientSetup.options.breadcrumbs?.maximumBreadcrumbs ?? 100,
51-
),
52-
);
46+
breadcrumbsManager.setStorage(FileBreadcrumbsStorage.factory(this.sessionFiles, fileSystem));
5347
}
5448

5549
if (this.sessionFiles && clientSetup.options.database?.captureNativeCrashes) {

packages/node/src/breadcrumbs/FileBreadcrumbsStorage.ts

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ import {
33
Breadcrumb,
44
BreadcrumbLogLevel,
55
BreadcrumbsStorage,
6+
BreadcrumbsStorageFactory,
7+
BreadcrumbsStorageLimits,
68
BreadcrumbType,
79
jsonEscaper,
810
RawBreadcrumb,
911
SessionFiles,
1012
TimeHelper,
1113
} from '@backtrace/sdk-core';
1214
import path from 'path';
15+
import { Readable } from 'stream';
1316
import { BacktraceFileAttachment } from '../attachment';
1417
import { AlternatingFileWriter } from '../common/AlternatingFileWriter';
1518
import { NodeFileSystem } from '../storage/interfaces/NodeFileSystem';
@@ -28,14 +31,15 @@ export class FileBreadcrumbsStorage implements BreadcrumbsStorage {
2831
constructor(
2932
private readonly _mainFile: string,
3033
private readonly _fallbackFile: string,
31-
fileSystem: NodeFileSystem,
32-
maximumBreadcrumbs: number,
34+
private readonly _fileSystem: NodeFileSystem,
35+
private readonly _limits: BreadcrumbsStorageLimits,
3336
) {
3437
this._writer = new AlternatingFileWriter(
38+
_fileSystem,
3539
_mainFile,
3640
_fallbackFile,
37-
Math.floor(maximumBreadcrumbs / 2),
38-
fileSystem,
41+
Math.floor((this._limits.maximumBreadcrumbs ?? 100) / 2),
42+
this._limits.maximumBreadcrumbsSize,
3943
);
4044
}
4145

@@ -52,19 +56,24 @@ export class FileBreadcrumbsStorage implements BreadcrumbsStorage {
5256
return undefined;
5357
}
5458

55-
return new FileBreadcrumbsStorage(files[0], files[1], fileSystem, 1);
59+
return new FileBreadcrumbsStorage(files[0], files[1], fileSystem, {
60+
maximumBreadcrumbs: 0,
61+
maximumBreadcrumbsSize: 0,
62+
});
5663
}
5764

58-
public static create(session: SessionFiles, fileSystem: NodeFileSystem, maximumBreadcrumbs: number) {
59-
const file1 = session.getFileName(this.getFileName(0));
60-
const file2 = session.getFileName(this.getFileName(1));
61-
return new FileBreadcrumbsStorage(file1, file2, fileSystem, maximumBreadcrumbs);
65+
public static factory(session: SessionFiles, fileSystem: NodeFileSystem): BreadcrumbsStorageFactory {
66+
return ({ limits }) => {
67+
const file1 = session.getFileName(this.getFileName(0));
68+
const file2 = session.getFileName(this.getFileName(1));
69+
return new FileBreadcrumbsStorage(file1, file2, fileSystem, limits);
70+
};
6271
}
6372

64-
public getAttachments(): BacktraceAttachment<unknown>[] {
73+
public getAttachments(): [BacktraceAttachment<Readable>, BacktraceAttachment<Readable>] {
6574
return [
66-
new BacktraceFileAttachment(this._mainFile, 'bt-breadcrumbs-0'),
67-
new BacktraceFileAttachment(this._fallbackFile, 'bt-breadcrumbs-1'),
75+
new BacktraceFileAttachment(this._mainFile, 'bt-breadcrumbs-0', this._fileSystem),
76+
new BacktraceFileAttachment(this._fallbackFile, 'bt-breadcrumbs-1', this._fileSystem),
6877
];
6978
}
7079

@@ -81,6 +90,14 @@ export class FileBreadcrumbsStorage implements BreadcrumbsStorage {
8190
};
8291

8392
const breadcrumbJson = JSON.stringify(breadcrumb, jsonEscaper());
93+
const jsonLength = breadcrumbJson.length + 1; // newline
94+
const sizeLimit = this._limits.maximumBreadcrumbsSize;
95+
if (sizeLimit !== undefined) {
96+
if (jsonLength > sizeLimit) {
97+
return id;
98+
}
99+
}
100+
84101
this._writer.writeLine(breadcrumbJson);
85102

86103
return id;

0 commit comments

Comments
 (0)