Skip to content

Commit d7359a3

Browse files
committed
sdk-core: overhaul of database and storage [INT-355]
1 parent 47ff386 commit d7359a3

32 files changed

+530
-634
lines changed

packages/sdk-core/src/BacktraceCoreClient.ts

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@ import {
99
BacktraceReportSubmissionResult,
1010
BacktraceRequestHandler,
1111
BacktraceSessionProvider,
12+
BacktraceStorageModule,
1213
BacktraceSubmissionResponse,
1314
DebugIdProvider,
14-
FileSystem,
15+
DefaultReportBacktraceDatabaseRecordFactory,
16+
ReportBacktraceDatabaseRecordSender,
17+
ReportBacktraceDatabaseRecordSerializer,
1518
SdkOptions,
1619
SessionFiles,
1720
} from './index.js';
@@ -117,7 +120,7 @@ export abstract class BacktraceCoreClient<
117120

118121
protected readonly attributeManager: AttributeManager;
119122
protected readonly attachmentManager: AttachmentManager;
120-
protected readonly fileSystem?: FileSystem;
123+
protected readonly databaseStorage?: BacktraceStorageModule;
121124

122125
private readonly _modules: BacktraceModules = new Map();
123126
private readonly _dataBuilder: BacktraceDataBuilder;
@@ -133,7 +136,6 @@ export abstract class BacktraceCoreClient<
133136
super();
134137

135138
this.options = setup.options;
136-
this.fileSystem = setup.fileSystem;
137139
this._sdkOptions = setup.sdkOptions;
138140
this._sessionProvider = setup.sessionProvider ?? new SingleSessionProvider();
139141
this._reportSubmission =
@@ -167,27 +169,35 @@ export abstract class BacktraceCoreClient<
167169
new DebugIdProvider(stackTraceConverter, setup.debugIdMapProvider),
168170
);
169171

170-
if (this.options?.database?.enable === true && setup.fileSystem) {
172+
if (this.options?.database?.enable === true && setup.database?.storage) {
173+
this.databaseStorage = setup.database.storage;
174+
this.addModule(this.databaseStorage);
175+
171176
const provider = BacktraceDatabaseFileStorageProvider.createIfValid(
172-
setup.fileSystem,
177+
{
178+
report: new ReportBacktraceDatabaseRecordSerializer(),
179+
...setup.database?.recordSerializers,
180+
},
181+
this.databaseStorage,
173182
this.options.database,
174183
);
175184

176-
if (this.fileSystem) {
177-
const sessionFiles = new SessionFiles(
178-
this.fileSystem,
179-
this.options.database.path,
180-
this.sessionId,
181-
this.options.database.maximumOldSessions ?? 1,
182-
);
183-
this._modules.set(SessionFiles, sessionFiles);
184-
}
185+
const sessionFiles = new SessionFiles(
186+
this.databaseStorage,
187+
this.sessionId,
188+
this.options.database.maximumOldSessions ?? 1,
189+
);
190+
this._modules.set(SessionFiles, sessionFiles);
185191

186192
if (provider) {
187193
const database = new BacktraceDatabase(
188194
this.options.database,
189195
provider,
190-
this._reportSubmission,
196+
{
197+
report: new ReportBacktraceDatabaseRecordSender(this._reportSubmission),
198+
...setup.database?.recordSenders?.(this._reportSubmission),
199+
},
200+
setup.database?.reportRecordFactory ?? DefaultReportBacktraceDatabaseRecordFactory.default(),
191201
this.sessionFiles,
192202
);
193203
this._modules.set(BacktraceDatabase, database);
@@ -220,16 +230,6 @@ export abstract class BacktraceCoreClient<
220230
public initialize() {
221231
this.validateAttributes();
222232

223-
if (this.fileSystem && this.options.database?.createDatabaseDirectory) {
224-
if (!this.options.database.path) {
225-
throw new Error(
226-
'Missing mandatory path to the database. Please define the database.path option in the configuration.',
227-
);
228-
}
229-
230-
this.fileSystem.createDirSync(this.options.database?.path);
231-
}
232-
233233
for (const module of this._modules.values()) {
234234
if (module.bind) {
235235
module.bind(this.getModuleBindData());
@@ -403,7 +403,7 @@ export abstract class BacktraceCoreClient<
403403
return data instanceof BacktraceReport;
404404
}
405405

406-
private getModuleBindData(): BacktraceModuleBindData {
406+
private getModuleBindData(): BacktraceModuleBindData<O> {
407407
return {
408408
client: this,
409409
options: this.options,
@@ -413,7 +413,7 @@ export abstract class BacktraceCoreClient<
413413
requestHandler: this._requestHandler,
414414
database: this.database,
415415
sessionFiles: this.sessionFiles,
416-
fileSystem: this.fileSystem,
416+
storage: this.databaseStorage,
417417
};
418418
}
419419

packages/sdk-core/src/builder/BacktraceCoreClientBuilder.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { BacktraceSessionProvider } from '../modules/metrics/BacktraceSessionPro
1212
import { MetricsQueue } from '../modules/metrics/MetricsQueue.js';
1313
import { SummedEvent } from '../modules/metrics/model/SummedEvent.js';
1414
import { UniqueEvent } from '../modules/metrics/model/UniqueEvent.js';
15-
import { FileSystem } from '../modules/storage/index.js';
15+
import { BacktraceStorageModule } from '../modules/storage/index.js';
1616
import { CoreClientSetup } from './CoreClientSetup.js';
1717

1818
type Writeable<T> = { -readonly [P in keyof T]: T[P] };
@@ -77,8 +77,11 @@ export abstract class BacktraceCoreClientBuilder<S extends Partial<CoreClientSet
7777
return this;
7878
}
7979

80-
public useFileSystem(fileSystem: FileSystem): this {
81-
this.clientSetup.fileSystem = fileSystem;
80+
public useDatabaseStorage(storage: BacktraceStorageModule): this {
81+
this.clientSetup.database = {
82+
...this.clientSetup.database,
83+
storage,
84+
};
8285
return this;
8386
}
8487

packages/sdk-core/src/builder/CoreClientSetup.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@ import { BacktraceModule } from '../modules/BacktraceModule.js';
55
import { BacktraceAttributeProvider } from '../modules/attribute/BacktraceAttributeProvider.js';
66
import { BreadcrumbsSetup } from '../modules/breadcrumbs/index.js';
77
import { BacktraceStackTraceConverter } from '../modules/converter/index.js';
8+
import { BacktraceDatabaseRecordSenders } from '../modules/database/BacktraceDatabaseRecordSender.js';
9+
import { BacktraceDatabaseRecordSerializers } from '../modules/database/BacktraceDatabaseRecordSerializer.js';
10+
import { ReportBacktraceDatabaseRecordFactory } from '../modules/database/ReportBacktraceDatabaseRecordFactory.js';
811
import { BacktraceSessionProvider } from '../modules/metrics/BacktraceSessionProvider.js';
912
import { MetricsQueue } from '../modules/metrics/MetricsQueue.js';
1013
import { SummedEvent } from '../modules/metrics/model/SummedEvent.js';
1114
import { UniqueEvent } from '../modules/metrics/model/UniqueEvent.js';
12-
import { FileSystem } from '../modules/storage/index.js';
15+
import { BacktraceStorageModule } from '../modules/storage/BacktraceStorage.js';
1316
import { DebugIdMapProvider } from '../sourcemaps/index.js';
1417
import { SdkOptions } from './SdkOptions.js';
1518

@@ -28,8 +31,13 @@ export interface CoreClientSetup<O extends BacktraceConfiguration = BacktraceCon
2831
readonly debugIdMapProvider?: DebugIdMapProvider;
2932
readonly breadcrumbsSetup?: BreadcrumbsSetup;
3033
readonly reportSubmission?: BacktraceReportSubmission;
31-
readonly fileSystem?: FileSystem;
3234
readonly modules?: BacktraceModule[];
3335
readonly summedMetricsQueue?: MetricsQueue<SummedEvent>;
3436
readonly uniqueMetricsQueue?: MetricsQueue<UniqueEvent>;
37+
readonly database?: {
38+
readonly storage?: BacktraceStorageModule;
39+
readonly recordSerializers?: BacktraceDatabaseRecordSerializers;
40+
readonly recordSenders?: (submission: BacktraceReportSubmission) => BacktraceDatabaseRecordSenders;
41+
readonly reportRecordFactory?: ReportBacktraceDatabaseRecordFactory;
42+
};
3543
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export async function toArray<T>(generator: AsyncGenerator<T>): Promise<T[]> {
2+
const result: T[] = [];
3+
for await (const element of generator) {
4+
result.push(element);
5+
}
6+
return result;
7+
}

packages/sdk-core/src/model/configuration/BacktraceDatabaseConfiguration.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,6 @@ export interface EnabledBacktraceDatabaseConfiguration {
33
* Determine if the Database is enabled
44
*/
55
enable: true;
6-
/**
7-
* Path where the SDK can store data.
8-
*/
9-
path: string;
10-
/**
11-
* Determine if the directory should be auto created by the SDK.
12-
* @default true
13-
*/
14-
createDatabaseDirectory?: boolean;
156

167
/**
178
* Sends reports to the server based on the retry settings.

packages/sdk-core/src/modules/BacktraceModule.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,28 @@ import {
22
BacktraceConfiguration,
33
BacktraceCoreClient,
44
BacktraceRequestHandler,
5-
FileSystem,
5+
BacktraceStorageModule,
66
SessionFiles,
77
} from '../index.js';
88
import { BacktraceReportSubmission } from '../model/http/BacktraceReportSubmission.js';
99
import { AttachmentManager } from './attachments/AttachmentManager.js';
1010
import { AttributeManager } from './attribute/AttributeManager.js';
1111
import { BacktraceDatabase } from './database/BacktraceDatabase.js';
1212

13-
export interface BacktraceModuleBindData {
13+
export interface BacktraceModuleBindData<O extends BacktraceConfiguration = BacktraceConfiguration> {
1414
readonly client: BacktraceCoreClient;
15-
readonly options: BacktraceConfiguration;
15+
readonly options: O;
1616
readonly attributeManager: AttributeManager;
1717
readonly attachmentManager: AttachmentManager;
1818
readonly reportSubmission: BacktraceReportSubmission;
1919
readonly requestHandler: BacktraceRequestHandler;
2020
readonly database?: BacktraceDatabase;
2121
readonly sessionFiles?: SessionFiles;
22-
readonly fileSystem?: FileSystem;
22+
readonly storage?: BacktraceStorageModule;
2323
}
2424

25-
export interface BacktraceModule {
26-
bind?(client: BacktraceModuleBindData): void;
25+
export interface BacktraceModule<O extends BacktraceConfiguration = BacktraceConfiguration> {
26+
bind?(client: BacktraceModuleBindData<O>): void;
2727
initialize?(): void;
2828
dispose?(): void;
2929
}

packages/sdk-core/src/modules/attribute/FileAttributeManager.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { jsonEscaper } from '../../common/jsonEscaper.js';
22
import { AttributeType } from '../../model/data/index.js';
33
import { BacktraceModule, BacktraceModuleBindData } from '../BacktraceModule.js';
4-
import { FileSystem, SessionFiles } from '../storage/index.js';
4+
import { BacktraceStorage, BacktraceSyncStorage } from '../storage/BacktraceStorage.js';
5+
import { SessionFiles } from '../storage/index.js';
56
import { AttributeManager } from './AttributeManager.js';
67

78
const ATTRIBUTE_FILE_NAME = 'bt-attributes';
@@ -10,17 +11,17 @@ export class FileAttributeManager implements BacktraceModule {
1011
private _attributeManager?: AttributeManager;
1112

1213
constructor(
13-
private readonly _fileSystem: FileSystem,
14+
private readonly _storage: BacktraceStorage,
1415
private _fileName?: string,
1516
) {}
1617

17-
public static create(fileSystem: FileSystem) {
18-
return new FileAttributeManager(fileSystem);
18+
public static create(storage: BacktraceStorage) {
19+
return new FileAttributeManager(storage);
1920
}
2021

21-
public static createFromSession(sessionFiles: SessionFiles, fileSystem: FileSystem) {
22+
public static createFromSession(sessionFiles: SessionFiles, storage: BacktraceStorage & BacktraceSyncStorage) {
2223
const fileName = sessionFiles.getFileName(ATTRIBUTE_FILE_NAME);
23-
return new FileAttributeManager(fileSystem, fileName);
24+
return new FileAttributeManager(storage, fileName);
2425
}
2526

2627
public initialize(): void {
@@ -51,7 +52,10 @@ export class FileAttributeManager implements BacktraceModule {
5152
}
5253

5354
try {
54-
const content = await this._fileSystem.readFile(this._fileName);
55+
const content = await this._storage.get(this._fileName);
56+
if (!content) {
57+
return {};
58+
}
5559
return JSON.parse(content);
5660
} catch {
5761
return {};
@@ -64,6 +68,6 @@ export class FileAttributeManager implements BacktraceModule {
6468
}
6569

6670
const reportData = this._attributeManager.get('scoped');
67-
await this._fileSystem.writeFile(this._fileName, JSON.stringify(reportData.attributes, jsonEscaper()));
71+
await this._storage.set(this._fileName, JSON.stringify(reportData.attributes, jsonEscaper()));
6872
}
6973
}

packages/sdk-core/src/modules/database/AttachmentBacktraceDatabaseFileRecord.ts

Lines changed: 0 additions & 55 deletions
This file was deleted.

0 commit comments

Comments
 (0)