Skip to content

Commit e71dc94

Browse files
authored
feat: Logger API/Helpers (#570)
1 parent d0d0c02 commit e71dc94

17 files changed

+97
-40
lines changed

.changeset/giant-moose-crash.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@powersync/web': minor
3+
---
4+
5+
Removed `js-logger` dependency, using the logger helper exposed by `@powersync/common`.

.changeset/lemon-shrimps-pretend.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@powersync/common': minor
3+
---
4+
5+
Added logger helpers, which can be used instead of the `js-logger` dependency.

packages/common/rollup.config.mjs

+1-3
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ export default (commandLineArgs) => {
3232
// This makes life easier
3333
external: [
3434
// This has dynamic logic - makes bundling hard
35-
'cross-fetch',
36-
// TODO: make the useDefaults logic better. Currently need access to this package directly
37-
'js-logger'
35+
'cross-fetch'
3836
]
3937
};
4038
};

packages/common/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export * from './db/DBAdapter.js';
3434
export * from './utils/AbortOperation.js';
3535
export * from './utils/BaseObserver.js';
3636
export * from './utils/DataStream.js';
37+
export * from './utils/Logger.js';
3738
export * from './utils/parseQuery.js';
3839

3940
export * from './types/types.js';

packages/common/src/utils/Logger.ts

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import Logger, { type ILogger, type ILogLevel } from 'js-logger';
2+
3+
export { GlobalLogger, ILogger, ILoggerOpts, ILogHandler, ILogLevel } from 'js-logger';
4+
5+
const TypedLogger: ILogger = Logger as any;
6+
7+
export const LogLevel = {
8+
TRACE: TypedLogger.TRACE,
9+
DEBUG: TypedLogger.DEBUG,
10+
INFO: TypedLogger.INFO,
11+
TIME: TypedLogger.TIME,
12+
WARN: TypedLogger.WARN,
13+
ERROR: TypedLogger.ERROR,
14+
OFF: TypedLogger.OFF
15+
};
16+
17+
export interface CreateLoggerOptions {
18+
logLevel?: ILogLevel;
19+
}
20+
21+
/**
22+
* Retrieves the base (default) logger instance.
23+
*
24+
* This base logger controls the default logging configuration and is shared
25+
* across all loggers created with `createLogger`. Adjusting settings on this
26+
* base logger affects all loggers derived from it unless explicitly overridden.
27+
*
28+
*/
29+
export function createBaseLogger() {
30+
return Logger;
31+
}
32+
33+
/**
34+
* Creates and configures a new named logger based on the base logger.
35+
*
36+
* Named loggers allow specific modules or areas of your application to have
37+
* their own logging levels and behaviors. These loggers inherit configuration
38+
* from the base logger by default but can override settings independently.
39+
*/
40+
export function createLogger(name: string, options: CreateLoggerOptions = {}): ILogger {
41+
const logger = Logger.get(name);
42+
if (options.logLevel) {
43+
logger.setLevel(options.logLevel);
44+
}
45+
46+
return logger;
47+
}

packages/web/package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@
6868
"async-mutex": "^0.4.0",
6969
"bson": "^6.6.0",
7070
"comlink": "^4.4.2",
71-
"commander": "^12.1.0",
72-
"js-logger": "^1.6.1"
71+
"commander": "^12.1.0"
7372
},
7473
"devDependencies": {
7574
"@journeyapps/wa-sqlite": "^1.2.2",

packages/web/src/db/adapters/AbstractWebSQLOpenFactory.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { DBAdapter, SQLOpenFactory } from '@powersync/common';
2-
import Logger, { ILogger } from 'js-logger';
1+
import { type ILogger, createLogger, DBAdapter, SQLOpenFactory } from '@powersync/common';
32
import { SSRDBAdapter } from './SSRDBAdapter';
43
import { ResolvedWebSQLFlags, WebSQLOpenFactoryOptions, isServerSide, resolveWebSQLFlags } from './web-sql-flags';
54

@@ -9,7 +8,7 @@ export abstract class AbstractWebSQLOpenFactory implements SQLOpenFactory {
98

109
constructor(protected options: WebSQLOpenFactoryOptions) {
1110
this.resolvedFlags = resolveWebSQLFlags(options.flags);
12-
this.logger = options.logger ?? Logger.get(`AbstractWebSQLOpenFactory - ${this.options.dbFilename}`);
11+
this.logger = options.logger ?? createLogger(`AbstractWebSQLOpenFactory - ${this.options.dbFilename}`);
1312
}
1413

1514
/**

packages/web/src/db/adapters/LockedAsyncDatabaseAdapter.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import {
2+
type ILogger,
23
BaseObserver,
4+
createLogger,
35
DBAdapter,
46
DBAdapterListener,
57
DBGetUtils,
@@ -8,7 +10,6 @@ import {
810
QueryResult,
911
Transaction
1012
} from '@powersync/common';
11-
import Logger, { ILogger } from 'js-logger';
1213
import { getNavigatorLocks } from '../..//shared/navigator';
1314
import { AsyncDatabaseConnection } from './AsyncDatabaseConnection';
1415
import { SharedConnectionWorker, WebDBAdapter } from './WebDBAdapter';
@@ -50,7 +51,7 @@ export class LockedAsyncDatabaseAdapter
5051
constructor(protected options: LockedAsyncDatabaseAdapterOptions) {
5152
super();
5253
this._dbIdentifier = options.name;
53-
this.logger = options.logger ?? Logger.get(`LockedAsyncDatabaseAdapter - ${this._dbIdentifier}`);
54+
this.logger = options.logger ?? createLogger(`LockedAsyncDatabaseAdapter - ${this._dbIdentifier}`);
5455
// Set the name if provided. We can query for the name if not available yet
5556
this.debugMode = options.debugMode ?? false;
5657
if (this.debugMode) {

packages/web/src/db/adapters/web-sql-flags.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { SQLOpenOptions } from '@powersync/common';
2-
import { ILogger } from 'js-logger';
1+
import { type ILogger, SQLOpenOptions } from '@powersync/common';
32

43
/**
54
* Common settings used when creating SQL connections on web.

packages/web/src/db/sync/WebRemote.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
import { type ILogger } from 'js-logger';
2-
31
import {
42
AbstractRemote,
53
AbstractRemoteOptions,
64
BSONImplementation,
75
DEFAULT_REMOTE_LOGGER,
86
FetchImplementation,
97
FetchImplementationProvider,
8+
ILogger,
109
RemoteConnector
1110
} from '@powersync/common';
1211

packages/web/src/worker/sync/BroadcastLogger.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import Logger, { type ILogLevel, type ILogger } from 'js-logger';
1+
import { type ILogger, type ILogLevel, LogLevel } from '@powersync/common';
22
import { type WrappedSyncPort } from './SharedSyncImplementation';
33

44
/**
@@ -14,13 +14,13 @@ export class BroadcastLogger implements ILogger {
1414
OFF: ILogLevel;
1515

1616
constructor(protected clients: WrappedSyncPort[]) {
17-
this.TRACE = Logger.TRACE;
18-
this.DEBUG = Logger.DEBUG;
19-
this.INFO = Logger.INFO;
20-
this.TIME = Logger.TIME;
21-
this.WARN = Logger.WARN;
22-
this.ERROR = Logger.ERROR;
23-
this.OFF = Logger.OFF;
17+
this.TRACE = LogLevel.TRACE;
18+
this.DEBUG = LogLevel.DEBUG;
19+
this.INFO = LogLevel.INFO;
20+
this.TIME = LogLevel.TIME;
21+
this.WARN = LogLevel.WARN;
22+
this.ERROR = LogLevel.ERROR;
23+
this.OFF = LogLevel.OFF;
2424
}
2525

2626
trace(...x: any[]): void {
@@ -75,7 +75,7 @@ export class BroadcastLogger implements ILogger {
7575

7676
getLevel(): ILogLevel {
7777
// Levels are not adjustable on this level.
78-
return Logger.INFO;
78+
return LogLevel.INFO;
7979
}
8080

8181
enabledFor(level: ILogLevel): boolean {

packages/web/src/worker/sync/SharedSyncImplementation.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
import {
22
type AbstractStreamingSyncImplementation,
3+
type ILogger,
34
type LockOptions,
45
type PowerSyncConnectionOptions,
56
type StreamingSyncImplementation,
67
type StreamingSyncImplementationListener,
78
type SyncStatusOptions,
89
AbortOperation,
910
BaseObserver,
11+
createLogger,
1012
DBAdapter,
1113
SqliteBucketStorage,
1214
SyncStatus
1315
} from '@powersync/common';
1416
import { Mutex } from 'async-mutex';
1517
import * as Comlink from 'comlink';
16-
import Logger, { type ILogger } from 'js-logger';
1718
import { WebRemote } from '../../db/sync/WebRemote';
1819
import {
1920
WebStreamingSyncImplementation,
@@ -107,7 +108,7 @@ export class SharedSyncImplementation
107108
this.dbAdapter = null;
108109
this.syncParams = null;
109110
this.syncStreamClient = null;
110-
this.logger = Logger.get('shared-sync');
111+
this.logger = createLogger('shared-sync');
111112
this.lastConnectOptions = undefined;
112113

113114
this.isInitialized = new Promise((resolve) => {

packages/web/src/worker/sync/SharedSyncImplementation.worker.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ import {
44
SharedSyncClientEvent,
55
type ManualSharedSyncPayload
66
} from './SharedSyncImplementation';
7-
import Logger from 'js-logger';
7+
import { createBaseLogger } from '@powersync/common';
88

99
const _self: SharedWorkerGlobalScope = self as any;
10-
Logger.useDefaults();
10+
const logger = createBaseLogger();
11+
logger.useDefaults();
12+
1113
const sharedSyncImplementation = new SharedSyncImplementation();
1214

1315
_self.onconnect = function (event: MessageEvent<string>) {

packages/web/tests/multiple_instances.test.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
1-
import { AbstractPowerSyncDatabase, SqliteBucketStorage, SyncStatus } from '@powersync/common';
1+
import {
2+
AbstractPowerSyncDatabase,
3+
createBaseLogger,
4+
createLogger,
5+
SqliteBucketStorage,
6+
SyncStatus
7+
} from '@powersync/common';
28
import {
39
SharedWebStreamingSyncImplementation,
410
SharedWebStreamingSyncImplementationOptions,
511
WebRemote
612
} from '@powersync/web';
713
import { Mutex } from 'async-mutex';
8-
import Logger from 'js-logger';
14+
915
import { beforeAll, describe, expect, it, vi } from 'vitest';
1016
import { WebDBAdapter } from '../src/db/adapters/WebDBAdapter';
1117
import { TestConnector } from './utils/MockStreamOpenFactory';
@@ -20,7 +26,7 @@ describe('Multiple Instances', { sequential: true }, () => {
2026
schema: testSchema
2127
});
2228

23-
beforeAll(() => Logger.useDefaults());
29+
beforeAll(() => createBaseLogger().useDefaults());
2430

2531
function createAsset(powersync: AbstractPowerSyncDatabase) {
2632
return powersync.execute('INSERT INTO assets(id, description) VALUES(uuid(), ?)', ['test']);
@@ -39,7 +45,7 @@ describe('Multiple Instances', { sequential: true }, () => {
3945
});
4046

4147
it('should broadcast logs from shared sync worker', { timeout: 20000 }, async () => {
42-
const logger = Logger.get('test-logger');
48+
const logger = createLogger('test-logger');
4349
const spiedErrorLogger = vi.spyOn(logger, 'error');
4450
const spiedDebugLogger = vi.spyOn(logger, 'debug');
4551

packages/web/tests/uploads.test.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { WebPowerSyncDatabaseOptions } from '@powersync/web';
2-
import Logger from 'js-logger';
1+
import { createBaseLogger, createLogger, WebPowerSyncDatabaseOptions } from '@powersync/web';
32
import p from 'p-defer';
43
import { v4 } from 'uuid';
54
import { beforeAll, describe, expect, it, vi } from 'vitest';
@@ -40,10 +39,10 @@ describe(
4039

4140
function describeCrudUploadTests(getDatabaseOptions: () => WebPowerSyncDatabaseOptions) {
4241
return () => {
43-
beforeAll(() => Logger.useDefaults());
42+
beforeAll(() => createBaseLogger().useDefaults());
4443

4544
it('should warn for missing upload operations in uploadData', async () => {
46-
const logger = Logger.get('crud-logger');
45+
const logger = createLogger('crud-logger');
4746

4847
const options = getDatabaseOptions();
4948

@@ -83,7 +82,7 @@ function describeCrudUploadTests(getDatabaseOptions: () => WebPowerSyncDatabaseO
8382
});
8483

8584
it('should immediately upload sequential transactions', async () => {
86-
const logger = Logger.get('crud-logger');
85+
const logger = createLogger('crud-logger');
8786

8887
const options = getDatabaseOptions();
8988

packages/web/webpack.config.js

-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ module.exports = () => {
4949
'@powersync/common': '@powersync/common',
5050
'async-mutex': 'async-mutex',
5151
comlink: 'comlink',
52-
'js-logger': 'js-logger',
5352
lodash: 'lodash'
5453
},
5554
devtool: production ? 'source-map' : 'cheap-module-source-map',

pnpm-lock.yaml

-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)