11import * as Comlink from 'comlink' ;
22import { vfsRequiresDedicatedWorkers , WASQLiteVFS } from '../../db/adapters/wa-sqlite/vfs.js' ;
33import { OpenWorkerConnection } from '../../db/adapters/wa-sqlite/DatabaseClient.js' ;
4+ import type { ILogger } from '@powersync/common' ;
5+ import { logWorkerErrors } from '../errors.js' ;
46
57/**
68 * Opens a shared or dedicated worker which exposes opening of database connections
@@ -9,39 +11,45 @@ export function openWorkerDatabasePort(
911 workerIdentifier : string ,
1012 multipleTabs = true ,
1113 worker : string | URL = '' ,
12- vfs ?: WASQLiteVFS
14+ vfs ?: WASQLiteVFS ,
15+ logger ?: ILogger
1316) {
1417 const needsDedicated = vfs && vfsRequiresDedicatedWorkers ( vfs ) ;
18+ let resolvedWorker : Worker | SharedWorker ;
1519
1620 if ( worker ) {
17- return ! needsDedicated && multipleTabs
18- ? new SharedWorker ( `${ worker } ` , {
19- /* @vite -ignore */
20- name : `shared-DB-worker-${ workerIdentifier } `
21- } ) . port
22- : new Worker ( `${ worker } ` , {
23- /* @vite -ignore */
24- name : `DB-worker-${ workerIdentifier } `
25- } ) ;
21+ resolvedWorker =
22+ ! needsDedicated && multipleTabs
23+ ? new SharedWorker ( `${ worker } ` , {
24+ /* @vite -ignore */
25+ name : `shared-DB-worker-${ workerIdentifier } `
26+ } )
27+ : new Worker ( `${ worker } ` , {
28+ /* @vite -ignore */
29+ name : `DB-worker-${ workerIdentifier } `
30+ } ) ;
2631 } else {
2732 /**
2833 * Webpack V5 can bundle the worker automatically if the full Worker constructor syntax is used
2934 * https://webpack.js.org/guides/web-workers/
3035 * This enables multi tab support by default, but falls back if SharedWorker is not available
3136 * (in the case of Android)
3237 */
33- return ! needsDedicated && multipleTabs
34- ? new SharedWorker ( new URL ( './WASQLiteDB.worker.js' , import . meta. url ) , {
35- /* @vite -ignore */
36- name : `shared-DB-worker-${ workerIdentifier } ` ,
37- type : 'module'
38- } ) . port
39- : new Worker ( new URL ( './WASQLiteDB.worker.js' , import . meta. url ) , {
40- /* @vite -ignore */
41- name : `DB-worker-${ workerIdentifier } ` ,
42- type : 'module'
43- } ) ;
38+ resolvedWorker =
39+ ! needsDedicated && multipleTabs
40+ ? new SharedWorker ( new URL ( './WASQLiteDB.worker.js' , import . meta. url ) , {
41+ /* @vite -ignore */
42+ name : `shared-DB-worker-${ workerIdentifier } ` ,
43+ type : 'module'
44+ } )
45+ : new Worker ( new URL ( './WASQLiteDB.worker.js' , import . meta. url ) , {
46+ /* @vite -ignore */
47+ name : `DB-worker-${ workerIdentifier } ` ,
48+ type : 'module'
49+ } ) ;
4450 }
51+
52+ return resolveWorkerDatabasePortFactory ( ( ) => resolvedWorker , logger ) ;
4553}
4654
4755/**
@@ -52,8 +60,12 @@ export function getWorkerDatabaseOpener(workerIdentifier: string, multipleTabs =
5260 return Comlink . wrap < OpenWorkerConnection > ( openWorkerDatabasePort ( workerIdentifier , multipleTabs , worker ) ) ;
5361}
5462
55- export function resolveWorkerDatabasePortFactory ( worker : ( ) => Worker | SharedWorker ) {
63+ export function resolveWorkerDatabasePortFactory ( worker : ( ) => Worker | SharedWorker , logger ?: ILogger ) {
5664 const workerInstance = worker ( ) ;
65+ if ( logger ) {
66+ logWorkerErrors ( workerInstance , logger ) ;
67+ }
68+
5769 return isSharedWorker ( workerInstance ) ? workerInstance . port : workerInstance ;
5870}
5971
0 commit comments