From 9895c918810e90976f3990d9b74fe5edf478d784 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Tue, 8 Apr 2025 10:18:43 +0200 Subject: [PATCH 01/10] Updated BroadcastLogger to respect logLevels. Passing log level to db and sync worker. --- .../adapters/wa-sqlite/WASQLiteOpenFactory.ts | 11 ++++-- .../SharedWebStreamingSyncImplementation.ts | 2 ++ .../db/sync/WebStreamingSyncImplementation.ts | 5 ++- .../web/src/worker/db/WASQLiteDB.worker.ts | 22 ++++++++---- .../web/src/worker/sync/BroadcastLogger.ts | 35 ++++++++++++++++--- .../worker/sync/SharedSyncImplementation.ts | 11 ++++-- 6 files changed, 69 insertions(+), 17 deletions(-) diff --git a/packages/web/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts b/packages/web/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts index 6217b35dc..95589f87b 100644 --- a/packages/web/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts +++ b/packages/web/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts @@ -12,6 +12,7 @@ import { } from '../web-sql-flags'; import { WorkerWrappedAsyncDatabaseConnection } from '../WorkerWrappedAsyncDatabaseConnection'; import { WASqliteConnection, WASQLiteVFS } from './WASQLiteConnection'; +import { ILogLevel } from 'js-logger'; export interface WASQLiteOpenFactoryOptions extends WebSQLOpenFactoryOptions { vfs?: WASQLiteVFS; @@ -20,6 +21,11 @@ export interface WASQLiteOpenFactoryOptions extends WebSQLOpenFactoryOptions { export interface ResolvedWASQLiteOpenFactoryOptions extends ResolvedWebSQLOpenOptions { vfs: WASQLiteVFS; } + +export interface WorkerDBOpenerOptions extends ResolvedWASQLiteOpenFactoryOptions { + logLevel: ILogLevel; +} + /** * Opens a SQLite connection using WA-SQLite. */ @@ -73,7 +79,7 @@ export class WASQLiteOpenFactory extends AbstractWebSQLOpenFactory { ) : openWorkerDatabasePort(this.options.dbFilename, enableMultiTabs, optionsDbWorker, this.waOptions.vfs); - const workerDBOpener = Comlink.wrap>(workerPort); + const workerDBOpener = Comlink.wrap>(workerPort); return new WorkerWrappedAsyncDatabaseConnection({ remote: workerDBOpener, @@ -83,7 +89,8 @@ export class WASQLiteOpenFactory extends AbstractWebSQLOpenFactory { temporaryStorage, cacheSizeKb, flags: this.resolvedFlags, - encryptionKey: encryptionKey + encryptionKey: encryptionKey, + logLevel: this.logger.getLevel() }), identifier: this.options.dbFilename, onClose: () => { diff --git a/packages/web/src/db/sync/SharedWebStreamingSyncImplementation.ts b/packages/web/src/db/sync/SharedWebStreamingSyncImplementation.ts index 916541d9f..dadb1276c 100644 --- a/packages/web/src/db/sync/SharedWebStreamingSyncImplementation.ts +++ b/packages/web/src/db/sync/SharedWebStreamingSyncImplementation.ts @@ -135,6 +135,8 @@ export class SharedWebStreamingSyncImplementation extends WebStreamingSyncImplem } this.syncManager = Comlink.wrap(this.messagePort); + this.syncManager.setLogLevel(this.logger.getLevel()); + this.triggerCrudUpload = this.syncManager.triggerCrudUpload; /** diff --git a/packages/web/src/db/sync/WebStreamingSyncImplementation.ts b/packages/web/src/db/sync/WebStreamingSyncImplementation.ts index 05d60f0a2..9d55c3a7c 100644 --- a/packages/web/src/db/sync/WebStreamingSyncImplementation.ts +++ b/packages/web/src/db/sync/WebStreamingSyncImplementation.ts @@ -6,6 +6,7 @@ import { } from '@powersync/common'; import { getNavigatorLocks } from '../../shared/navigator'; import { ResolvedWebSQLOpenOptions, WebSQLFlags } from '../adapters/web-sql-flags'; +import Logger from 'js-logger'; export interface WebStreamingSyncImplementationOptions extends AbstractStreamingSyncImplementationOptions { flags?: WebSQLFlags; @@ -26,7 +27,9 @@ export class WebStreamingSyncImplementation extends AbstractStreamingSyncImpleme obtainLock(lockOptions: LockOptions): Promise { const identifier = `streaming-sync-${lockOptions.type}-${this.webOptions.identifier}`; - lockOptions.type == LockType.SYNC && console.debug('requesting lock for ', identifier); + if (lockOptions.type == LockType.SYNC) { + (this.logger ?? Logger.get('WebStreamingSyncImplementation')).debug('requesting lock for ', identifier); + } return getNavigatorLocks().request(identifier, { signal: lockOptions.signal }, lockOptions.callback); } } diff --git a/packages/web/src/worker/db/WASQLiteDB.worker.ts b/packages/web/src/worker/db/WASQLiteDB.worker.ts index 7e28b024d..c7ac24ecf 100644 --- a/packages/web/src/worker/db/WASQLiteDB.worker.ts +++ b/packages/web/src/worker/db/WASQLiteDB.worker.ts @@ -6,8 +6,15 @@ import '@journeyapps/wa-sqlite'; import * as Comlink from 'comlink'; import { AsyncDatabaseConnection } from '../../db/adapters/AsyncDatabaseConnection'; import { WASqliteConnection } from '../../db/adapters/wa-sqlite/WASQLiteConnection'; -import { ResolvedWASQLiteOpenFactoryOptions } from '../../db/adapters/wa-sqlite/WASQLiteOpenFactory'; +import { + ResolvedWASQLiteOpenFactoryOptions, + WorkerDBOpenerOptions +} from '../../db/adapters/wa-sqlite/WASQLiteOpenFactory'; import { getNavigatorLocks } from '../../shared/navigator'; +import Logger from 'js-logger'; + +Logger.useDefaults(); +const logger = Logger.get('db-worker'); /** * Keeps track of open DB connections and the clients which @@ -39,11 +46,14 @@ const openWorkerConnection = async (options: ResolvedWASQLiteOpenFactoryOptions) }; }; -const openDBShared = async (options: ResolvedWASQLiteOpenFactoryOptions): Promise => { +const openDBShared = async (options: WorkerDBOpenerOptions): Promise => { // Prevent multiple simultaneous opens from causing race conditions return getNavigatorLocks().request(OPEN_DB_LOCK, async () => { const clientId = nextClientId++; - const { dbFilename } = options; + const { dbFilename, logLevel } = options; + + logger.setLevel(logLevel); + if (!DBMap.has(dbFilename)) { const clientIds = new Set(); const connection = await openWorkerConnection(options); @@ -65,14 +75,14 @@ const openDBShared = async (options: ResolvedWASQLiteOpenFactoryOptions): Promis }), close: Comlink.proxy(() => { const { clientIds } = dbEntry; - console.debug(`Close requested from client ${clientId} of ${[...clientIds]}`); + logger.debug(`Close requested from client ${clientId} of ${[...clientIds]}`); clientIds.delete(clientId); if (clientIds.size == 0) { - console.debug(`Closing connection to ${dbFilename}.`); + logger.debug(`Closing connection to ${dbFilename}.`); DBMap.delete(dbFilename); return db.close?.(); } - console.debug(`Connection to ${dbFilename} not closed yet due to active clients.`); + logger.debug(`Connection to ${dbFilename} not closed yet due to active clients.`); return; }) }; diff --git a/packages/web/src/worker/sync/BroadcastLogger.ts b/packages/web/src/worker/sync/BroadcastLogger.ts index 099f65d72..0b1bbb3c8 100644 --- a/packages/web/src/worker/sync/BroadcastLogger.ts +++ b/packages/web/src/worker/sync/BroadcastLogger.ts @@ -13,6 +13,8 @@ export class BroadcastLogger implements ILogger { ERROR: ILogLevel; OFF: ILogLevel; + private currentLevel: ILogLevel = Logger.INFO; + constructor(protected clients: WrappedSyncPort[]) { this.TRACE = Logger.TRACE; this.DEBUG = Logger.DEBUG; @@ -24,63 +26,86 @@ export class BroadcastLogger implements ILogger { } trace(...x: any[]): void { + if (!this.enabledFor(this.TRACE)) return; + console.trace(...x); const sanitized = this.sanitizeArgs(x); this.iterateClients((client) => client.clientProvider.trace(...sanitized)); } debug(...x: any[]): void { + if (!this.enabledFor(this.DEBUG)) return; + console.debug(...x); const sanitized = this.sanitizeArgs(x); this.iterateClients((client) => client.clientProvider.debug(...sanitized)); } info(...x: any[]): void { + if (!this.enabledFor(this.INFO)) return; + console.info(...x); const sanitized = this.sanitizeArgs(x); this.iterateClients((client) => client.clientProvider.info(...sanitized)); } log(...x: any[]): void { + if (!this.enabledFor(this.INFO)) return; + console.log(...x); const sanitized = this.sanitizeArgs(x); this.iterateClients((client) => client.clientProvider.log(...sanitized)); } warn(...x: any[]): void { + if (!this.enabledFor(this.WARN)) return; + console.warn(...x); const sanitized = this.sanitizeArgs(x); this.iterateClients((client) => client.clientProvider.warn(...sanitized)); } error(...x: any[]): void { + if (!this.enabledFor(this.ERROR)) return; + console.error(...x); const sanitized = this.sanitizeArgs(x); this.iterateClients((client) => client.clientProvider.error(...sanitized)); } time(label: string): void { + if (!this.enabledFor(this.TIME)) return; + console.time(label); this.iterateClients((client) => client.clientProvider.time(label)); } timeEnd(label: string): void { + if (!this.enabledFor(this.TIME)) return; + console.timeEnd(label); this.iterateClients((client) => client.clientProvider.timeEnd(label)); } + /** + * Set the global log level. + */ setLevel(level: ILogLevel): void { - // Levels are not adjustable on this level. + this.currentLevel = level; } + /** + * Get the current log level. + */ getLevel(): ILogLevel { - // Levels are not adjustable on this level. - return Logger.INFO; + return this.currentLevel; } + /** + * Returns true if the given level is enabled. + */ enabledFor(level: ILogLevel): boolean { - // Levels are not adjustable on this level. - return true; + return level.value >= this.currentLevel.value; } /** diff --git a/packages/web/src/worker/sync/SharedSyncImplementation.ts b/packages/web/src/worker/sync/SharedSyncImplementation.ts index f5c7c5bdc..d97139335 100644 --- a/packages/web/src/worker/sync/SharedSyncImplementation.ts +++ b/packages/web/src/worker/sync/SharedSyncImplementation.ts @@ -13,7 +13,7 @@ import { } from '@powersync/common'; import { Mutex } from 'async-mutex'; import * as Comlink from 'comlink'; -import Logger, { type ILogger } from 'js-logger'; +import Logger, { ILogLevel, type ILogger } from 'js-logger'; import { WebRemote } from '../../db/sync/WebRemote'; import { WebStreamingSyncImplementation, @@ -145,6 +145,11 @@ export class SharedSyncImplementation return this.isInitialized; } + setLogLevel(level: ILogLevel) { + this.logger.setLevel(level); + this.broadCastLogger.setLevel(level); + } + /** * Configures the DBAdapter connection and a streaming sync client. */ @@ -234,7 +239,7 @@ export class SharedSyncImplementation async removePort(port: MessagePort) { const index = this.ports.findIndex((p) => p.port == port); if (index < 0) { - console.warn(`Could not remove port ${port} since it is not present in active ports.`); + this.logger.warn(`Could not remove port ${port} since it is not present in active ports.`); return; } @@ -311,7 +316,7 @@ export class SharedSyncImplementation abortController.signal.onabort = reject; try { - console.log('calling the last port client provider for credentials'); + this.logger.log('calling the last port client provider for credentials'); resolve(await lastPort.clientProvider.fetchCredentials()); } catch (ex) { reject(ex); From 4d6e73b7477a5c294a5e59630a8b48b92d5ccf53 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Tue, 8 Apr 2025 11:41:52 +0200 Subject: [PATCH 02/10] Exposing logger in AbstractPowerSyncDatabase, opens the ability to have controlled logging in packages like Attachments, React, and Vue. --- .../src/AbstractAttachmentQueue.ts | 42 ++++++++++--------- .../src/client/AbstractPowerSyncDatabase.ts | 34 ++++++++------- packages/react/src/WatchedQuery.ts | 8 +++- packages/react/src/hooks/useQuery.ts | 7 ++-- packages/vue/src/composables/useQuery.ts | 7 ++-- .../db/adapters/AbstractWebSQLOpenFactory.ts | 4 +- 6 files changed, 58 insertions(+), 44 deletions(-) diff --git a/packages/attachments/src/AbstractAttachmentQueue.ts b/packages/attachments/src/AbstractAttachmentQueue.ts index 888d38a53..a5f4d4d28 100644 --- a/packages/attachments/src/AbstractAttachmentQueue.ts +++ b/packages/attachments/src/AbstractAttachmentQueue.ts @@ -91,6 +91,10 @@ export abstract class AbstractAttachmentQueue { const _ids = `${ids.map((id) => `'${id}'`).join(',')}`; - console.debug(`Queuing for sync, attachment IDs: [${_ids}]`); + this.logger.debug(`Queuing for sync, attachment IDs: [${_ids}]`); if (this.initialSync) { this.initialSync = false; @@ -151,11 +155,11 @@ export abstract class AbstractAttachmentQueue 0) { const id = this.downloadQueue.values().next().value; this.downloadQueue.delete(id); @@ -474,9 +478,9 @@ export abstract class AbstractAttachmentQueue { for (const record of res) { await this.delete(record, tx); @@ -527,7 +531,7 @@ export abstract class AbstractAttachmentQueue { - console.debug(`Clearing attachment queue...`); + this.logger.debug(`Clearing attachment queue...`); await this.powersync.writeTransaction(async (tx) => { await tx.execute(`DELETE FROM ${this.table}`); }); diff --git a/packages/common/src/client/AbstractPowerSyncDatabase.ts b/packages/common/src/client/AbstractPowerSyncDatabase.ts index 2e71083e7..c56507359 100644 --- a/packages/common/src/client/AbstractPowerSyncDatabase.ts +++ b/packages/common/src/client/AbstractPowerSyncDatabase.ts @@ -406,6 +406,10 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver cb.schemaChanged?.(schema)); } + get logger() { + return this.options.logger!; + } + /** * Wait for initialization to complete. * While initializing is automatic, this helps to catch and report initialization errors. @@ -555,7 +559,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver { @@ -633,7 +637,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver { @@ -661,7 +665,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver implements }); } + get logger() { + return this.db.logger; + } + addTemporaryHold() { const ref = new Object(); this.temporaryHolds.add(ref); @@ -88,7 +92,7 @@ export class WatchedQuery extends BaseObserver implements try { this.tables = await this.db.resolveTables(this.query.sqlStatement, this.query.queryParameters, this.options); } catch (e) { - console.error('Failed to fetch tables:', e); + this.logger.error('Failed to fetch tables:', e); this.setError(e); } } @@ -103,7 +107,7 @@ export class WatchedQuery extends BaseObserver implements const data = result ?? []; this.setData(data); } catch (e) { - console.error('Failed to fetch data:', e); + this.logger.error('Failed to fetch data:', e); this.setError(e); } } diff --git a/packages/react/src/hooks/useQuery.ts b/packages/react/src/hooks/useQuery.ts index b5701027d..59c5225c3 100644 --- a/packages/react/src/hooks/useQuery.ts +++ b/packages/react/src/hooks/useQuery.ts @@ -42,6 +42,7 @@ export const useQuery = ( options: AdditionalOptions = { runQueryOnce: false } ): QueryResult => { const powerSync = usePowerSync(); + const logger = powerSync.logger; if (!powerSync) { return { isLoading: false, isFetching: false, data: [], error: new Error('PowerSync not configured.') }; } @@ -50,7 +51,7 @@ export const useQuery = ( try { parsedQuery = parseQuery(query, parameters); } catch (error) { - console.error('Failed to parse query:', error); + logger.error('Failed to parse query:', error); return { isLoading: false, isFetching: false, data: [], error }; } @@ -107,7 +108,7 @@ export const useQuery = ( handleResult(result); } catch (e) { - console.error('Failed to fetch data:', e); + logger.error('Failed to fetch data:', e); handleError(e); } }; @@ -122,7 +123,7 @@ export const useQuery = ( setTables(tables); } catch (e) { - console.error('Failed to fetch tables:', e); + logger.error('Failed to fetch tables:', e); handleError(e); } }; diff --git a/packages/vue/src/composables/useQuery.ts b/packages/vue/src/composables/useQuery.ts index 57295e65a..ca09ea3d3 100644 --- a/packages/vue/src/composables/useQuery.ts +++ b/packages/vue/src/composables/useQuery.ts @@ -65,6 +65,7 @@ export const useQuery = ( let fetchData: () => Promise | undefined; const powerSync = usePowerSync(); + const logger = powerSync.value.logger; const finishLoading = () => { isLoading.value = false; @@ -99,7 +100,7 @@ export const useQuery = ( const result = await executor(); handleResult(result); } catch (e) { - console.error('Failed to fetch data:', e); + logger.error('Failed to fetch data:', e); handleError(e); } }; @@ -114,7 +115,7 @@ export const useQuery = ( try { parsedQuery = parseQuery(queryValue, toValue(sqlParameters).map(toValue)); } catch (e) { - console.error('Failed to parse query:', e); + logger.error('Failed to parse query:', e); handleError(e); return; } @@ -125,7 +126,7 @@ export const useQuery = ( try { resolvedTables = await powerSync.value.resolveTables(sql, parameters, options); } catch (e) { - console.error('Failed to fetch tables:', e); + logger.error('Failed to fetch tables:', e); handleError(e); return; } diff --git a/packages/web/src/db/adapters/AbstractWebSQLOpenFactory.ts b/packages/web/src/db/adapters/AbstractWebSQLOpenFactory.ts index 2e1755e3f..134a2b2a7 100644 --- a/packages/web/src/db/adapters/AbstractWebSQLOpenFactory.ts +++ b/packages/web/src/db/adapters/AbstractWebSQLOpenFactory.ts @@ -26,7 +26,7 @@ export abstract class AbstractWebSQLOpenFactory implements SQLOpenFactory { resolvedFlags: { disableSSRWarning, enableMultiTabs, ssrMode = isServerSide() } } = this; if (ssrMode && !disableSSRWarning) { - console.warn( + this.logger.warn( ` Running PowerSync in SSR mode. Only empty query results will be returned. @@ -35,7 +35,7 @@ export abstract class AbstractWebSQLOpenFactory implements SQLOpenFactory { } if (!enableMultiTabs) { - console.warn( + this.logger.warn( 'Multiple tab support is not enabled. Using this site across multiple tabs may not function correctly.' ); } From 637ac75e875e1122cff0f92f26563e45daa74535 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Tue, 8 Apr 2025 11:44:34 +0200 Subject: [PATCH 03/10] Changeset entries. --- .changeset/dirty-buttons-hunt.md | 7 +++++++ .changeset/fresh-jobs-explain.md | 5 +++++ .changeset/green-rings-judge.md | 5 +++++ 3 files changed, 17 insertions(+) create mode 100644 .changeset/dirty-buttons-hunt.md create mode 100644 .changeset/fresh-jobs-explain.md create mode 100644 .changeset/green-rings-judge.md diff --git a/.changeset/dirty-buttons-hunt.md b/.changeset/dirty-buttons-hunt.md new file mode 100644 index 000000000..cabfca0e0 --- /dev/null +++ b/.changeset/dirty-buttons-hunt.md @@ -0,0 +1,7 @@ +--- +'@powersync/attachments': patch +'@powersync/react': patch +'@powersync/vue': patch +--- + +Using newly exposed logger from AbstractPowerSyncDatabase to have controlled logging instead of using console based logging. diff --git a/.changeset/fresh-jobs-explain.md b/.changeset/fresh-jobs-explain.md new file mode 100644 index 000000000..6e9721717 --- /dev/null +++ b/.changeset/fresh-jobs-explain.md @@ -0,0 +1,5 @@ +--- +'@powersync/common': minor +--- + +Exposing logger on AbstractPowerSyncDatabase. diff --git a/.changeset/green-rings-judge.md b/.changeset/green-rings-judge.md new file mode 100644 index 000000000..7f24b955b --- /dev/null +++ b/.changeset/green-rings-judge.md @@ -0,0 +1,5 @@ +--- +'@powersync/web': patch +--- + +Updated db and sync workers to respect log levels. From 5609dee27fb52aebf392f2c25a9f102a00708d5a Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Tue, 8 Apr 2025 13:48:38 +0200 Subject: [PATCH 04/10] Reverting helper package's logging to console in test environments. --- packages/attachments/src/AbstractAttachmentQueue.ts | 2 +- packages/react/src/WatchedQuery.ts | 2 +- packages/react/src/hooks/useQuery.ts | 2 +- packages/vue/src/composables/useQuery.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/attachments/src/AbstractAttachmentQueue.ts b/packages/attachments/src/AbstractAttachmentQueue.ts index a5f4d4d28..b056007f1 100644 --- a/packages/attachments/src/AbstractAttachmentQueue.ts +++ b/packages/attachments/src/AbstractAttachmentQueue.ts @@ -92,7 +92,7 @@ export abstract class AbstractAttachmentQueue implements } get logger() { - return this.db.logger; + return this.db.logger ?? console; } addTemporaryHold() { diff --git a/packages/react/src/hooks/useQuery.ts b/packages/react/src/hooks/useQuery.ts index 59c5225c3..b7400eaea 100644 --- a/packages/react/src/hooks/useQuery.ts +++ b/packages/react/src/hooks/useQuery.ts @@ -42,7 +42,7 @@ export const useQuery = ( options: AdditionalOptions = { runQueryOnce: false } ): QueryResult => { const powerSync = usePowerSync(); - const logger = powerSync.logger; + const logger = powerSync?.logger ?? console; if (!powerSync) { return { isLoading: false, isFetching: false, data: [], error: new Error('PowerSync not configured.') }; } diff --git a/packages/vue/src/composables/useQuery.ts b/packages/vue/src/composables/useQuery.ts index ca09ea3d3..2a5d32f25 100644 --- a/packages/vue/src/composables/useQuery.ts +++ b/packages/vue/src/composables/useQuery.ts @@ -65,7 +65,7 @@ export const useQuery = ( let fetchData: () => Promise | undefined; const powerSync = usePowerSync(); - const logger = powerSync.value.logger; + const logger = powerSync?.value?.logger ?? console; const finishLoading = () => { isLoading.value = false; From 189d4a0677145414ba3388203f0a50ecc442671c Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Thu, 17 Apr 2025 08:54:34 +0200 Subject: [PATCH 05/10] Changed .worker.ts console.log to console.debug --- packages/web/src/worker/sync/SharedSyncImplementation.worker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/src/worker/sync/SharedSyncImplementation.worker.ts b/packages/web/src/worker/sync/SharedSyncImplementation.worker.ts index 8c8e12663..cb32a9c76 100644 --- a/packages/web/src/worker/sync/SharedSyncImplementation.worker.ts +++ b/packages/web/src/worker/sync/SharedSyncImplementation.worker.ts @@ -20,7 +20,7 @@ _self.onconnect = function (event: MessageEvent) { port.addEventListener('message', (event) => { const payload = event.data as ManualSharedSyncPayload; if (payload?.event == SharedSyncClientEvent.CLOSE_CLIENT) { - console.log('closing shared for port', port); + console.debug('closing shared for port', port); sharedSyncImplementation.removePort(port); } }); From 8a4f12bf55ad4532980b0b4977cbea2621a075a0 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Tue, 22 Apr 2025 16:43:46 +0200 Subject: [PATCH 06/10] Using logger types from @powersync/common for node package. --- .changeset/calm-roses-poke.md | 5 +++++ packages/node/src/sync/stream/NodeRemote.ts | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 .changeset/calm-roses-poke.md diff --git a/.changeset/calm-roses-poke.md b/.changeset/calm-roses-poke.md new file mode 100644 index 000000000..e87a34ff1 --- /dev/null +++ b/.changeset/calm-roses-poke.md @@ -0,0 +1,5 @@ +--- +'@powersync/node': patch +--- + +Using logger types from @powersync/common. diff --git a/packages/node/src/sync/stream/NodeRemote.ts b/packages/node/src/sync/stream/NodeRemote.ts index b0c147484..b05be330d 100644 --- a/packages/node/src/sync/stream/NodeRemote.ts +++ b/packages/node/src/sync/stream/NodeRemote.ts @@ -1,8 +1,7 @@ import * as os from 'node:os'; -import { ILogger } from 'js-logger'; - import { + type ILogger, AbstractRemote, AbstractRemoteOptions, BSONImplementation, From 9854fb01e3f20fbd9a2c2dc55eabd07b05b8f2d0 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Tue, 22 Apr 2025 16:44:58 +0200 Subject: [PATCH 07/10] Removed last console.debug calls from workers. --- packages/web/src/worker/db/WASQLiteDB.worker.ts | 1 - packages/web/src/worker/sync/SharedSyncImplementation.worker.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/web/src/worker/db/WASQLiteDB.worker.ts b/packages/web/src/worker/db/WASQLiteDB.worker.ts index 169f40f44..2ffd8be89 100644 --- a/packages/web/src/worker/db/WASQLiteDB.worker.ts +++ b/packages/web/src/worker/db/WASQLiteDB.worker.ts @@ -97,7 +97,6 @@ if (typeof SharedWorkerGlobalScope !== 'undefined') { const _self: SharedWorkerGlobalScope = self as any; _self.onconnect = function (event: MessageEvent) { const port = event.ports[0]; - console.debug('Exposing shared db on port', port); Comlink.expose(openDBShared, port); }; } else { diff --git a/packages/web/src/worker/sync/SharedSyncImplementation.worker.ts b/packages/web/src/worker/sync/SharedSyncImplementation.worker.ts index 2379524d5..ad7644456 100644 --- a/packages/web/src/worker/sync/SharedSyncImplementation.worker.ts +++ b/packages/web/src/worker/sync/SharedSyncImplementation.worker.ts @@ -22,7 +22,6 @@ _self.onconnect = function (event: MessageEvent) { port.addEventListener('message', (event) => { const payload = event.data as ManualSharedSyncPayload; if (payload?.event == SharedSyncClientEvent.CLOSE_CLIENT) { - console.debug('closing shared for port', port); sharedSyncImplementation.removePort(port); } }); From 0857d51cf83c8c27e2946be4460cce498a7b4877 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Wed, 23 Apr 2025 12:18:46 +0200 Subject: [PATCH 08/10] Minor cleanup. --- packages/web/src/db/sync/WebStreamingSyncImplementation.ts | 2 +- packages/web/src/worker/sync/BroadcastLogger.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/web/src/db/sync/WebStreamingSyncImplementation.ts b/packages/web/src/db/sync/WebStreamingSyncImplementation.ts index 105858be2..10f8905d4 100644 --- a/packages/web/src/db/sync/WebStreamingSyncImplementation.ts +++ b/packages/web/src/db/sync/WebStreamingSyncImplementation.ts @@ -28,7 +28,7 @@ export class WebStreamingSyncImplementation extends AbstractStreamingSyncImpleme obtainLock(lockOptions: LockOptions): Promise { const identifier = `streaming-sync-${lockOptions.type}-${this.webOptions.identifier}`; if (lockOptions.type == LockType.SYNC) { - (this.logger ?? createLogger('WebStreamingSyncImplementation')).debug('requesting lock for ', identifier); + this.logger.debug('requesting lock for ', identifier); } return getNavigatorLocks().request(identifier, { signal: lockOptions.signal }, lockOptions.callback); } diff --git a/packages/web/src/worker/sync/BroadcastLogger.ts b/packages/web/src/worker/sync/BroadcastLogger.ts index 4fa1aba62..01b015489 100644 --- a/packages/web/src/worker/sync/BroadcastLogger.ts +++ b/packages/web/src/worker/sync/BroadcastLogger.ts @@ -13,7 +13,7 @@ export class BroadcastLogger implements ILogger { ERROR: ILogLevel; OFF: ILogLevel; - private currentLevel: ILogLevel = Logger.INFO; + private currentLevel: ILogLevel = LogLevel.INFO; constructor(protected clients: WrappedSyncPort[]) { this.TRACE = LogLevel.TRACE; From 098034c0815c71889fe7f6e90508649d84fd4fc0 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Wed, 23 Apr 2025 14:21:53 +0200 Subject: [PATCH 09/10] Dropped js-logger depedency from demos and tools. --- demos/angular-supabase-todolist/angular.json | 2 +- .../app/index.tsx | 7 ++-- .../django-react-native-todolist/package.json | 1 - demos/example-capacitor/package.json | 1 - .../components/providers/SystemProvider.tsx | 8 ++-- demos/example-capacitor/vite.config.ts | 1 - demos/example-electron-node/src/main/index.ts | 42 ++++++++++++------- demos/example-electron/package.json | 1 - .../components/providers/SystemProvider.tsx | 8 ++-- .../example-electron/vite.renderer.config.ts | 3 +- demos/example-nextjs/package.json | 1 - .../components/providers/SystemProvider.tsx | 9 ++-- demos/example-node/src/main.ts | 8 ++-- demos/example-vite-encryption/src/index.js | 5 +-- demos/example-vite-encryption/vite.config.ts | 3 +- demos/example-vite/src/index.js | 7 ++-- demos/example-vite/vite.config.ts | 3 +- demos/example-webpack/src/index.js | 7 ++-- demos/react-multi-client/package.json | 1 - .../components/providers/SystemProvider.tsx | 9 ++-- demos/react-multi-client/vite.config.mts | 1 - .../src/providers/PowerSync.tsx | 5 +-- .../app/index.tsx | 8 ++-- .../library/powersync/system.ts | 5 +-- .../package.json | 1 - .../app/index.tsx | 8 ++-- .../library/powersync/system.ts | 5 +-- .../package.json | 1 - .../components/providers/SystemProvider.tsx | 13 +++--- .../vite.config.mts | 3 +- demos/react-supabase-todolist/package.json | 1 - .../components/providers/SystemProvider.tsx | 11 +++-- demos/react-supabase-todolist/vite.config.mts | 1 - demos/vue-supabase-todolist/package.json | 1 - demos/vue-supabase-todolist/src/App.vue | 7 ++-- demos/vue-supabase-todolist/vite.config.ts | 3 +- .../package.json | 1 - .../components/providers/SystemProvider.tsx | 8 ++-- .../vite.config.mts | 1 - pnpm-lock.yaml | 33 --------------- tools/diagnostics-app/package.json | 1 - .../library/powersync/ConnectionManager.ts | 14 ++++--- 42 files changed, 109 insertions(+), 150 deletions(-) diff --git a/demos/angular-supabase-todolist/angular.json b/demos/angular-supabase-todolist/angular.json index 4c72ee6ab..05b71dbac 100644 --- a/demos/angular-supabase-todolist/angular.json +++ b/demos/angular-supabase-todolist/angular.json @@ -20,7 +20,7 @@ "customWebpackConfig": { "path": "./extra-webpack.config.js" }, - "allowedCommonJsDependencies": ["js-logger", "ws"], + "allowedCommonJsDependencies": ["ws"], "outputPath": "dist", "index": "src/index.html", "main": "src/main.ts", diff --git a/demos/django-react-native-todolist/app/index.tsx b/demos/django-react-native-todolist/app/index.tsx index 15fd1332d..b083e08c0 100644 --- a/demos/django-react-native-todolist/app/index.tsx +++ b/demos/django-react-native-todolist/app/index.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { ActivityIndicator, View } from 'react-native'; import { router } from 'expo-router'; -import Logger from 'js-logger'; +import { createBaseLogger, LogLevel } from '@powersync/react-native'; /** * This is the entry point when the app loads. * Checks for a Supabase session. @@ -10,8 +10,9 @@ import Logger from 'js-logger'; */ const App = () => { React.useEffect(() => { - Logger.useDefaults(); - Logger.setLevel(Logger.DEBUG); + const logger = createBaseLogger(); + logger.useDefaults(); + logger.setLevel(LogLevel.DEBUG); setImmediate(() => router.replace('signin')); }, []); diff --git a/demos/django-react-native-todolist/package.json b/demos/django-react-native-todolist/package.json index c19771487..9b1b6b700 100644 --- a/demos/django-react-native-todolist/package.json +++ b/demos/django-react-native-todolist/package.json @@ -28,7 +28,6 @@ "expo-router": "4.0.20", "expo-splash-screen": "~0.29.22", "expo-status-bar": "~2.0.1", - "js-logger": "^1.6.1", "lodash": "^4.17.21", "react": "18.3.1", "react-native": "0.76.9", diff --git a/demos/example-capacitor/package.json b/demos/example-capacitor/package.json index 689831a66..b9609d0e9 100644 --- a/demos/example-capacitor/package.json +++ b/demos/example-capacitor/package.json @@ -26,7 +26,6 @@ "@journeyapps/wa-sqlite": "^1.2.0", "@powersync/react": "workspace:*", "@powersync/web": "workspace:*", - "js-logger": "^1.6.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.23.0" diff --git a/demos/example-capacitor/src/components/providers/SystemProvider.tsx b/demos/example-capacitor/src/components/providers/SystemProvider.tsx index 8db8d5638..fc3b9e050 100644 --- a/demos/example-capacitor/src/components/providers/SystemProvider.tsx +++ b/demos/example-capacitor/src/components/providers/SystemProvider.tsx @@ -1,14 +1,14 @@ import { PowerSyncContext } from '@powersync/react'; -import { PowerSyncDatabase } from '@powersync/web'; +import { PowerSyncDatabase, createBaseLogger, LogLevel } from '@powersync/web'; import { CircularProgress } from '@mui/material'; -import Logger from 'js-logger'; import React, { Suspense } from 'react'; import { AppSchema } from '../../library/powersync/AppSchema.js'; import { BackendConnector } from '../../library/powersync/BackendConnector.js'; import { Capacitor } from '@capacitor/core'; -Logger.useDefaults(); -Logger.setLevel(Logger.DEBUG); +const logger = createBaseLogger(); +logger.useDefaults(); +logger.setLevel(LogLevel.DEBUG); const platform = Capacitor.getPlatform(); const isIOs = platform === 'ios'; diff --git a/demos/example-capacitor/vite.config.ts b/demos/example-capacitor/vite.config.ts index 5ff1782e4..e36be6a57 100644 --- a/demos/example-capacitor/vite.config.ts +++ b/demos/example-capacitor/vite.config.ts @@ -19,7 +19,6 @@ export default defineConfig({ // https://github.com/vitejs/vite/issues/11672#issuecomment-1415820673 exclude: ['@journeyapps/wa-sqlite', '@powersync/web'], include: [] - // include: ['@powersync/web > js-logger'], // <-- Include `js-logger` when it isn't installed and imported. }, plugins: [wasm(), topLevelAwait()], worker: { diff --git a/demos/example-electron-node/src/main/index.ts b/demos/example-electron-node/src/main/index.ts index c17951a1e..7cb44813c 100644 --- a/demos/example-electron-node/src/main/index.ts +++ b/demos/example-electron-node/src/main/index.ts @@ -1,13 +1,20 @@ import fs from 'node:fs'; import { Worker } from 'node:worker_threads'; -import { PowerSyncDatabase, SyncStreamConnectionMethod } from '@powersync/node'; +import { + createBaseLogger, + createLogger, + LogLevel, + PowerSyncDatabase, + SyncStreamConnectionMethod +} from '@powersync/node'; import { app, BrowserWindow, ipcMain, MessagePortMain } from 'electron'; import { AppSchema, BackendConnector } from './powersync'; -import { default as Logger } from 'js-logger'; -const logger = Logger.get('PowerSyncDemo'); -Logger.useDefaults({ defaultLevel: logger.WARN }); +const baseLogger = createBaseLogger(); +baseLogger.useDefaults({ defaultLevel: LogLevel.WARN }); + +const logger = createLogger('PowerSyncDemo'); // This allows TypeScript to pick up the magic constants that's auto-generated by Forge's Webpack // plugin that tells the Electron app where to look for the Webpack-bundled app code (depending on @@ -71,7 +78,7 @@ app.whenReady().then(() => { const unregister = database.registerListener({ statusChanged(status) { port.postMessage(status.toJSON()); - }, + } }); port.once('close', unregister); }; @@ -80,14 +87,19 @@ app.whenReady().then(() => { const abort = new AbortController(); port.once('close', () => abort.abort()); - database.watchWithCallback(sql, args, { - onResult(results) { - port.postMessage(results.rows._array); - }, - onError(error) { - console.error(`Watch ${sql} with ${args} failed`, error); + database.watchWithCallback( + sql, + args, + { + onResult(results) { + port.postMessage(results.rows._array); + }, + onError(error) { + console.error(`Watch ${sql} with ${args} failed`, error); + } }, - }, {signal: abort.signal}); + { signal: abort.signal } + ); }; ipcMain.on('port', (portEvent) => { @@ -95,16 +107,16 @@ app.whenReady().then(() => { port.start(); port.on('message', (event) => { - const {method, payload} = event.data; + const { method, payload } = event.data; switch (method) { case 'syncStatus': forwardSyncStatus(port); break; case 'watch': - const {sql, args} = payload; + const { sql, args } = payload; forwardWatchResults(sql, args, port); break; - }; + } }); }); diff --git a/demos/example-electron/package.json b/demos/example-electron/package.json index 852348a9e..917a20283 100644 --- a/demos/example-electron/package.json +++ b/demos/example-electron/package.json @@ -29,7 +29,6 @@ "@powersync/react": "workspace:*", "@powersync/web": "workspace:*", "electron-squirrel-startup": "^1.0.0", - "js-logger": "^1.6.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.23.0" diff --git a/demos/example-electron/src/components/providers/SystemProvider.tsx b/demos/example-electron/src/components/providers/SystemProvider.tsx index 0399d6fb3..0fe7aaac3 100644 --- a/demos/example-electron/src/components/providers/SystemProvider.tsx +++ b/demos/example-electron/src/components/providers/SystemProvider.tsx @@ -1,13 +1,13 @@ import { PowerSyncContext } from '@powersync/react'; -import { PowerSyncDatabase } from '@powersync/web'; +import { createBaseLogger, LogLevel, PowerSyncDatabase } from '@powersync/web'; import { CircularProgress } from '@mui/material'; -import Logger from 'js-logger'; import React, { Suspense } from 'react'; import { AppSchema } from '../../library/powersync/AppSchema.js'; import { BackendConnector } from '../../library/powersync/BackendConnector.js'; -Logger.useDefaults(); -Logger.setLevel(Logger.DEBUG); +const logger = createBaseLogger(); +logger.useDefaults(); +logger.setLevel(LogLevel.DEBUG); const powerSync = new PowerSyncDatabase({ database: { dbFilename: 'powersync2.db' }, diff --git a/demos/example-electron/vite.renderer.config.ts b/demos/example-electron/vite.renderer.config.ts index 4f4a7d731..42e01d4ce 100644 --- a/demos/example-electron/vite.renderer.config.ts +++ b/demos/example-electron/vite.renderer.config.ts @@ -25,8 +25,7 @@ export default defineConfig((env) => { // Don't optimize these packages as they contain web workers and WASM files. // https://github.com/vitejs/vite/issues/11672#issuecomment-1415820673 exclude: ['@journeyapps/wa-sqlite', '@powersync/web'], - include: [], - // include: ['@powersync/web > js-logger'], // <-- Include `js-logger` when it isn't installed and imported. + include: [] }, plugins: [ // @ts-expect-error there is TS issue that doesn't actually affect the runtime diff --git a/demos/example-nextjs/package.json b/demos/example-nextjs/package.json index 73f05b3b1..9fc5f61c3 100644 --- a/demos/example-nextjs/package.json +++ b/demos/example-nextjs/package.json @@ -20,7 +20,6 @@ "@mui/material": "^5.15.18", "@powersync/react": "workspace:*", "@powersync/web": "workspace:*", - "js-logger": "^1.6.1", "lato-font": "^3.0.0", "lexical": "^0.15.0", "next": "14.2.3", diff --git a/demos/example-nextjs/src/components/providers/SystemProvider.tsx b/demos/example-nextjs/src/components/providers/SystemProvider.tsx index 21ed328e8..5d4d05254 100644 --- a/demos/example-nextjs/src/components/providers/SystemProvider.tsx +++ b/demos/example-nextjs/src/components/providers/SystemProvider.tsx @@ -3,14 +3,13 @@ import { AppSchema } from '@/library/powersync/AppSchema'; import { BackendConnector } from '@/library/powersync/BackendConnector'; import { PowerSyncContext } from '@powersync/react'; -import { PowerSyncDatabase } from '@powersync/web'; +import { createBaseLogger, LogLevel, PowerSyncDatabase } from '@powersync/web'; import { CircularProgress } from '@mui/material'; -import Logger from 'js-logger'; import React, { Suspense } from 'react'; -// eslint-disable-next-line react-hooks/rules-of-hooks -Logger.useDefaults(); -Logger.setLevel(Logger.DEBUG); +const logger = createBaseLogger(); +logger.useDefaults(); +logger.setLevel(LogLevel.DEBUG); const powerSync = new PowerSyncDatabase({ database: { dbFilename: 'powersync2.db' }, diff --git a/demos/example-node/src/main.ts b/demos/example-node/src/main.ts index 6dc6e777f..85216abd1 100644 --- a/demos/example-node/src/main.ts +++ b/demos/example-node/src/main.ts @@ -1,14 +1,14 @@ import repl_factory from 'node:repl'; import { once } from 'node:events'; -import { PowerSyncDatabase, SyncStreamConnectionMethod } from '@powersync/node'; -import { default as Logger } from 'js-logger'; +import { createBaseLogger, createLogger, PowerSyncDatabase, SyncStreamConnectionMethod } from '@powersync/node'; import { AppSchema, DemoConnector } from './powersync.js'; import { exit } from 'node:process'; const main = async () => { - const logger = Logger.get('PowerSyncDemo'); - Logger.useDefaults({ defaultLevel: logger.WARN }); + const baseLogger = createBaseLogger(); + const logger = createLogger('PowerSyncDemo'); + baseLogger.useDefaults({ defaultLevel: logger.WARN }); if (!('BACKEND' in process.env) || !('SYNC_SERVICE' in process.env)) { console.warn( diff --git a/demos/example-vite-encryption/src/index.js b/demos/example-vite-encryption/src/index.js index 1a78af525..209005ba5 100644 --- a/demos/example-vite-encryption/src/index.js +++ b/demos/example-vite-encryption/src/index.js @@ -1,7 +1,6 @@ -import { column, Schema, Table, PowerSyncDatabase } from '@powersync/web'; -import Logger from 'js-logger'; +import { column, Schema, Table, PowerSyncDatabase, createBaseLogger } from '@powersync/web'; -Logger.useDefaults(); +createBaseLogger().useDefaults(); const customers = new Table({ name: column.text }); diff --git a/demos/example-vite-encryption/vite.config.ts b/demos/example-vite-encryption/vite.config.ts index a1f909b03..35cbc75f6 100644 --- a/demos/example-vite-encryption/vite.config.ts +++ b/demos/example-vite-encryption/vite.config.ts @@ -16,8 +16,7 @@ export default defineConfig({ optimizeDeps: { // Don't optimize these packages as they contain web workers and WASM files. // https://github.com/vitejs/vite/issues/11672#issuecomment-1415820673 - exclude: ['@journeyapps/wa-sqlite', '@powersync/web'], - include: ['@powersync/web > js-logger'] + exclude: ['@journeyapps/wa-sqlite', '@powersync/web'] }, plugins: [wasm(), topLevelAwait()], worker: { diff --git a/demos/example-vite/src/index.js b/demos/example-vite/src/index.js index c2e8924cf..e622dd6a6 100644 --- a/demos/example-vite/src/index.js +++ b/demos/example-vite/src/index.js @@ -1,7 +1,6 @@ -import { column, Schema, Table, PowerSyncDatabase } from '@powersync/web'; -import Logger from 'js-logger'; +import { column, Schema, Table, PowerSyncDatabase, createBaseLogger } from '@powersync/web'; -Logger.useDefaults(); +createBaseLogger().useDefaults(); /** * A placeholder connector which doesn't do anything. @@ -19,7 +18,7 @@ class DummyConnector { async uploadData(database) {} } -const customers = new Table({ name: column.text }) +const customers = new Table({ name: column.text }); export const AppSchema = new Schema({ customers }); diff --git a/demos/example-vite/vite.config.ts b/demos/example-vite/vite.config.ts index a1f909b03..35cbc75f6 100644 --- a/demos/example-vite/vite.config.ts +++ b/demos/example-vite/vite.config.ts @@ -16,8 +16,7 @@ export default defineConfig({ optimizeDeps: { // Don't optimize these packages as they contain web workers and WASM files. // https://github.com/vitejs/vite/issues/11672#issuecomment-1415820673 - exclude: ['@journeyapps/wa-sqlite', '@powersync/web'], - include: ['@powersync/web > js-logger'] + exclude: ['@journeyapps/wa-sqlite', '@powersync/web'] }, plugins: [wasm(), topLevelAwait()], worker: { diff --git a/demos/example-webpack/src/index.js b/demos/example-webpack/src/index.js index bc4e0c93d..0ec04b988 100644 --- a/demos/example-webpack/src/index.js +++ b/demos/example-webpack/src/index.js @@ -1,7 +1,6 @@ -import { Schema, Table, PowerSyncDatabase, column } from '@powersync/web'; -import Logger from 'js-logger'; +import { Schema, Table, PowerSyncDatabase, column, createBaseLogger } from '@powersync/web'; -Logger.useDefaults(); +createBaseLogger().useDefaults(); /** * A placeholder connector which doesn't do anything. @@ -19,7 +18,7 @@ class DummyConnector { async uploadData(database) {} } -const customers = new Table({ name: column.text }) +const customers = new Table({ name: column.text }); export const AppSchema = new Schema({ customers }); diff --git a/demos/react-multi-client/package.json b/demos/react-multi-client/package.json index ce789cf73..b5f093ed9 100644 --- a/demos/react-multi-client/package.json +++ b/demos/react-multi-client/package.json @@ -18,7 +18,6 @@ "@webflow/webflow-cli": "^1.6.9", "async-mutex": "^0.5.0", "autoprefixer": "10.4.14", - "js-logger": "^1.6.1", "lodash": "^4.17.21", "postcss": "8.4.27", "react": "^18.2.0", diff --git a/demos/react-multi-client/src/components/providers/SystemProvider.tsx b/demos/react-multi-client/src/components/providers/SystemProvider.tsx index 21f2f244f..0c22ca0ca 100644 --- a/demos/react-multi-client/src/components/providers/SystemProvider.tsx +++ b/demos/react-multi-client/src/components/providers/SystemProvider.tsx @@ -6,10 +6,11 @@ import { PowerSyncContext, usePowerSync as _usePowerSync } from '@powersync/reac import { AppSchema } from '@/definitions/Schema'; import { SupabaseConnector } from '@/library/SupabaseConnector'; import { useSupabase } from './SupabaseProvider'; -import Logger from 'js-logger'; +import { createBaseLogger, LogLevel } from '@powersync/web'; -Logger.useDefaults(); -Logger.setLevel(Logger.DEBUG); +const logger = createBaseLogger(); +logger.useDefaults(); +logger.setLevel(LogLevel.DEBUG); export interface SystemProviderProps { dbFilename: string; @@ -34,7 +35,7 @@ const SystemProvider: React.FC> = (props) powersync.init(); const l = connector.registerListener({ - initialized: () => {}, + initialized: () => { }, sessionStarted: async () => { await powersync.connect(connector); } diff --git a/demos/react-multi-client/vite.config.mts b/demos/react-multi-client/vite.config.mts index 797616c11..ab0b7d202 100644 --- a/demos/react-multi-client/vite.config.mts +++ b/demos/react-multi-client/vite.config.mts @@ -26,7 +26,6 @@ export default defineConfig({ // https://github.com/vitejs/vite/issues/11672#issuecomment-1415820673 exclude: ['@journeyapps/wa-sqlite', '@powersync/web'], include: [] - // include: ['@powersync/web > js-logger'], // <-- Include `js-logger` when it isn't installed and imported. }, plugins: [ wasm(), diff --git a/demos/react-native-supabase-group-chat/src/providers/PowerSync.tsx b/demos/react-native-supabase-group-chat/src/providers/PowerSync.tsx index 67370ddbb..029be4b34 100644 --- a/demos/react-native-supabase-group-chat/src/providers/PowerSync.tsx +++ b/demos/react-native-supabase-group-chat/src/providers/PowerSync.tsx @@ -1,13 +1,12 @@ import '@azure/core-asynciterator-polyfill'; -import { PowerSyncContext, PowerSyncDatabase } from '@powersync/react-native'; -import Logger from 'js-logger'; +import { createBaseLogger, PowerSyncContext, PowerSyncDatabase } from '@powersync/react-native'; import { ReactNode, useEffect, useMemo } from 'react'; import { useAuth } from './AuthProvider'; import { Connector } from '../lib/connector'; import { schema } from '../lib/schema'; -Logger.useDefaults(); +createBaseLogger().useDefaults(); const connector = new Connector(); diff --git a/demos/react-native-supabase-todolist/app/index.tsx b/demos/react-native-supabase-todolist/app/index.tsx index 7624da014..8f80a52e9 100644 --- a/demos/react-native-supabase-todolist/app/index.tsx +++ b/demos/react-native-supabase-todolist/app/index.tsx @@ -3,9 +3,9 @@ import { ActivityIndicator, View } from 'react-native'; import { useSystem } from '../library/powersync/system'; import { router } from 'expo-router'; -import Logger from 'js-logger'; import { ThemeProvider, createTheme } from '@rneui/themed'; +import { createBaseLogger, LogLevel } from '@powersync/react-native'; const theme = createTheme({ mode: 'light' @@ -21,8 +21,10 @@ const App: React.FC = () => { const { supabaseConnector } = useSystem(); React.useEffect(() => { - Logger.useDefaults(); - Logger.setLevel(Logger.DEBUG); + const logger = createBaseLogger(); + logger.useDefaults(); + logger.setLevel(LogLevel.DEBUG); + supabaseConnector.client.auth .getSession() .then(({ data }) => { diff --git a/demos/react-native-supabase-todolist/library/powersync/system.ts b/demos/react-native-supabase-todolist/library/powersync/system.ts index d95650c4b..f9fa43dbf 100644 --- a/demos/react-native-supabase-todolist/library/powersync/system.ts +++ b/demos/react-native-supabase-todolist/library/powersync/system.ts @@ -1,11 +1,10 @@ import '@azure/core-asynciterator-polyfill'; -import { PowerSyncDatabase } from '@powersync/react-native'; +import { createBaseLogger, PowerSyncDatabase } from '@powersync/react-native'; import React from 'react'; import { SupabaseStorageAdapter } from '../storage/SupabaseStorageAdapter'; import { type AttachmentRecord } from '@powersync/attachments'; -import Logger from 'js-logger'; import { KVStorage } from '../storage/KVStorage'; import { AppConfig } from '../supabase/AppConfig'; import { SupabaseConnector } from '../supabase/SupabaseConnector'; @@ -13,7 +12,7 @@ import { AppSchema } from './AppSchema'; import { PhotoAttachmentQueue } from './PhotoAttachmentQueue'; import { configureFts } from '../fts/fts_setup'; -Logger.useDefaults(); +createBaseLogger().useDefaults(); export class System { kvStorage: KVStorage; diff --git a/demos/react-native-supabase-todolist/package.json b/demos/react-native-supabase-todolist/package.json index bc65d6130..7c43cc820 100644 --- a/demos/react-native-supabase-todolist/package.json +++ b/demos/react-native-supabase-todolist/package.json @@ -33,7 +33,6 @@ "expo-secure-store": "~14.0.1", "expo-splash-screen": "~0.29.22", "expo-status-bar": "~2.0.1", - "js-logger": "^1.6.1", "lodash": "^4.17.21", "react": "18.3.1", "react-native": "0.76.9", diff --git a/demos/react-native-web-supabase-todolist/app/index.tsx b/demos/react-native-web-supabase-todolist/app/index.tsx index 3f7b7d22b..6eaaae61c 100644 --- a/demos/react-native-web-supabase-todolist/app/index.tsx +++ b/demos/react-native-web-supabase-todolist/app/index.tsx @@ -3,7 +3,7 @@ import { ActivityIndicator, View } from 'react-native'; import { useSystem } from '../library/powersync/system'; import { router } from 'expo-router'; -import Logger from 'js-logger'; +import { createBaseLogger, LogLevel } from '@powersync/react-native'; /** * This is the entry point when the app loads. @@ -15,8 +15,10 @@ const App: React.FC = () => { const { supabaseConnector } = useSystem(); React.useEffect(() => { - Logger.useDefaults(); - Logger.setLevel(Logger.DEBUG); + const logger = createBaseLogger(); + logger.useDefaults(); + logger.setLevel(LogLevel.DEBUG); + supabaseConnector.client.auth .getSession() .then(({ data }) => { diff --git a/demos/react-native-web-supabase-todolist/library/powersync/system.ts b/demos/react-native-web-supabase-todolist/library/powersync/system.ts index 7d31323f3..7a45e9120 100644 --- a/demos/react-native-web-supabase-todolist/library/powersync/system.ts +++ b/demos/react-native-web-supabase-todolist/library/powersync/system.ts @@ -3,17 +3,16 @@ import '@azure/core-asynciterator-polyfill'; import React from 'react'; import { PowerSyncDatabase as PowerSyncDatabaseNative } from '@powersync/react-native'; import { PowerSyncDatabase as PowerSyncDatabaseWeb, WASQLiteOpenFactory } from '@powersync/web'; -import { AbstractPowerSyncDatabase } from '@powersync/common'; +import { AbstractPowerSyncDatabase, createBaseLogger } from '@powersync/common'; import { SupabaseStorageAdapter } from '../storage/SupabaseStorageAdapter'; import { type AttachmentRecord } from '@powersync/attachments'; -import Logger from 'js-logger'; import { KVStorage } from '../storage/KVStorage'; import { AppConfig } from '../supabase/AppConfig'; import { SupabaseConnector } from '../supabase/SupabaseConnector'; import { AppSchema } from './AppSchema'; import { PhotoAttachmentQueue } from './PhotoAttachmentQueue'; -Logger.useDefaults(); +createBaseLogger().useDefaults(); export class System { kvStorage: KVStorage; diff --git a/demos/react-supabase-todolist-optional-sync/package.json b/demos/react-supabase-todolist-optional-sync/package.json index cf1e04f27..441157828 100644 --- a/demos/react-supabase-todolist-optional-sync/package.json +++ b/demos/react-supabase-todolist-optional-sync/package.json @@ -19,7 +19,6 @@ "@mui/x-data-grid": "^6.19.6", "@supabase/supabase-js": "^2.39.7", "formik": "^2.4.6", - "js-logger": "^1.6.1", "lodash": "^4.17.21", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/demos/react-supabase-todolist-optional-sync/src/components/providers/SystemProvider.tsx b/demos/react-supabase-todolist-optional-sync/src/components/providers/SystemProvider.tsx index b5b4381d2..a77833e3f 100644 --- a/demos/react-supabase-todolist-optional-sync/src/components/providers/SystemProvider.tsx +++ b/demos/react-supabase-todolist-optional-sync/src/components/providers/SystemProvider.tsx @@ -1,9 +1,8 @@ -import { AppSchema, makeSchema, switchToSyncedSchema } from '@/library/powersync/AppSchema'; +import { makeSchema, switchToSyncedSchema } from '@/library/powersync/AppSchema'; import { SupabaseConnector } from '@/library/powersync/SupabaseConnector'; import { CircularProgress } from '@mui/material'; import { PowerSyncContext } from '@powersync/react'; -import { PowerSyncDatabase } from '@powersync/web'; -import Logger from 'js-logger'; +import { createBaseLogger, LogLevel, PowerSyncDatabase } from '@powersync/web'; import React, { Suspense } from 'react'; import { NavigationPanelContextProvider } from '../navigation/NavigationPanelContext'; import { getSyncEnabled } from '@/library/powersync/SyncMode'; @@ -26,15 +25,15 @@ export const SystemProvider = ({ children }: { children: React.ReactNode }) => { const [powerSync] = React.useState(db); React.useEffect(() => { - // Linting thinks this is a hook due to it's name - Logger.useDefaults(); // eslint-disable-line - Logger.setLevel(Logger.DEBUG); + const logger = createBaseLogger(); + logger.useDefaults(); + logger.setLevel(LogLevel.DEBUG); // For console testing purposes (window as any)._powersync = powerSync; powerSync.init(); const l = connector.registerListener({ - initialized: () => {}, + initialized: () => { }, sessionStarted: async () => { var isSyncMode = getSyncEnabled(dbName); diff --git a/demos/react-supabase-todolist-optional-sync/vite.config.mts b/demos/react-supabase-todolist-optional-sync/vite.config.mts index 543956b6e..ab0b7d202 100644 --- a/demos/react-supabase-todolist-optional-sync/vite.config.mts +++ b/demos/react-supabase-todolist-optional-sync/vite.config.mts @@ -25,8 +25,7 @@ export default defineConfig({ // Don't optimize these packages as they contain web workers and WASM files. // https://github.com/vitejs/vite/issues/11672#issuecomment-1415820673 exclude: ['@journeyapps/wa-sqlite', '@powersync/web'], - include: [], - // include: ['@powersync/web > js-logger'], // <-- Include `js-logger` when it isn't installed and imported. + include: [] }, plugins: [ wasm(), diff --git a/demos/react-supabase-todolist/package.json b/demos/react-supabase-todolist/package.json index 8104be01d..62feb516e 100644 --- a/demos/react-supabase-todolist/package.json +++ b/demos/react-supabase-todolist/package.json @@ -19,7 +19,6 @@ "@mui/x-data-grid": "^6.19.6", "@supabase/supabase-js": "^2.39.7", "formik": "^2.4.6", - "js-logger": "^1.6.1", "lodash": "^4.17.21", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/demos/react-supabase-todolist/src/components/providers/SystemProvider.tsx b/demos/react-supabase-todolist/src/components/providers/SystemProvider.tsx index 07b597e15..9bbbb4f11 100644 --- a/demos/react-supabase-todolist/src/components/providers/SystemProvider.tsx +++ b/demos/react-supabase-todolist/src/components/providers/SystemProvider.tsx @@ -3,8 +3,7 @@ import { AppSchema } from '@/library/powersync/AppSchema'; import { SupabaseConnector } from '@/library/powersync/SupabaseConnector'; import { CircularProgress } from '@mui/material'; import { PowerSyncContext } from '@powersync/react'; -import { PowerSyncDatabase } from '@powersync/web'; -import Logger from 'js-logger'; +import { createBaseLogger, LogLevel, PowerSyncDatabase } from '@powersync/web'; import React, { Suspense } from 'react'; import { NavigationPanelContextProvider } from '../navigation/NavigationPanelContext'; @@ -23,15 +22,15 @@ export const SystemProvider = ({ children }: { children: React.ReactNode }) => { const [powerSync] = React.useState(db); React.useEffect(() => { - // Linting thinks this is a hook due to it's name - Logger.useDefaults(); // eslint-disable-line - Logger.setLevel(Logger.DEBUG); + const logger = createBaseLogger(); + logger.useDefaults(); // eslint-disable-line + logger.setLevel(LogLevel.DEBUG); // For console testing purposes (window as any)._powersync = powerSync; powerSync.init(); const l = connector.registerListener({ - initialized: () => {}, + initialized: () => { }, sessionStarted: () => { powerSync.connect(connector); } diff --git a/demos/react-supabase-todolist/vite.config.mts b/demos/react-supabase-todolist/vite.config.mts index 797616c11..ab0b7d202 100644 --- a/demos/react-supabase-todolist/vite.config.mts +++ b/demos/react-supabase-todolist/vite.config.mts @@ -26,7 +26,6 @@ export default defineConfig({ // https://github.com/vitejs/vite/issues/11672#issuecomment-1415820673 exclude: ['@journeyapps/wa-sqlite', '@powersync/web'], include: [] - // include: ['@powersync/web > js-logger'], // <-- Include `js-logger` when it isn't installed and imported. }, plugins: [ wasm(), diff --git a/demos/vue-supabase-todolist/package.json b/demos/vue-supabase-todolist/package.json index 2a85040a5..b0f70ee00 100644 --- a/demos/vue-supabase-todolist/package.json +++ b/demos/vue-supabase-todolist/package.json @@ -17,7 +17,6 @@ "@supabase/supabase-js": "^2.39.7", "@vuelidate/core": "^2.0.3", "@vuelidate/validators": "^2.0.4", - "js-logger": "^1.6.1", "vue": "^3.4.21", "vue-router": "4", "vuetify": "3.6.8" diff --git a/demos/vue-supabase-todolist/src/App.vue b/demos/vue-supabase-todolist/src/App.vue index ac3370a7e..dde5f7bd1 100644 --- a/demos/vue-supabase-todolist/src/App.vue +++ b/demos/vue-supabase-todolist/src/App.vue @@ -1,10 +1,11 @@