1- import { describe , expect , it } from 'vitest' ;
21import { AbstractPowerSyncDatabase } from '@powersync/common' ;
32import {
43 PowerSyncDatabase ,
54 WASQLiteDBAdapter ,
6- WASQLitePowerSyncDatabaseOpenFactory ,
7- WASQLiteOpenFactory
5+ WASQLiteOpenFactory ,
6+ WASQLitePowerSyncDatabaseOpenFactory
87} from '@powersync/web' ;
8+ import { afterAll , beforeAll , describe , expect , it , vi } from 'vitest' ;
99import { testSchema } from './utils/testDb' ;
1010
1111const testId = '2290de4f-0488-4e50-abed-f8e8eb1d0b42' ;
@@ -18,6 +18,45 @@ export const basicTest = async (db: AbstractPowerSyncDatabase) => {
1818} ;
1919
2020describe ( 'Open Methods' , ( ) => {
21+ let originalSharedWorker : typeof SharedWorker ;
22+ let originalWorker : typeof Worker ;
23+
24+ const sharedWorkerProxyHandler = {
25+ construct ( target : typeof SharedWorker , args : any [ ] ) {
26+ const [ url , options ] = args ;
27+
28+ // Call the original constructor
29+ const instance = new target ( url , options ) ;
30+ return instance ;
31+ }
32+ } ;
33+ const workerProxyHandler = {
34+ construct ( target : typeof Worker , args : any [ ] ) {
35+ const [ url , options ] = args ;
36+
37+ // Call the original constructor
38+ const instance = new target ( url , options ) ;
39+ return instance ;
40+ }
41+ } ;
42+
43+ beforeAll ( ( ) => {
44+ // Store the original SharedWorker constructor
45+ originalSharedWorker = SharedWorker ;
46+ originalWorker = Worker ;
47+
48+ // Create a proxy to intercept the worker constructors
49+ // The vi.SpyOn does not work well with constructors
50+ window . SharedWorker = new Proxy ( SharedWorker , sharedWorkerProxyHandler ) ;
51+ window . Worker = new Proxy ( Worker , workerProxyHandler ) ;
52+ } ) ;
53+
54+ afterAll ( ( ) => {
55+ // Restore Worker
56+ window . SharedWorker = originalSharedWorker ;
57+ window . Worker = originalWorker ;
58+ } ) ;
59+
2160 it ( 'Should open PowerSync clients from old factory methods' , async ( ) => {
2261 const db = new WASQLitePowerSyncDatabaseOpenFactory ( {
2362 dbFilename : `test-legacy.db` ,
@@ -46,4 +85,46 @@ describe('Open Methods', () => {
4685
4786 await basicTest ( db ) ;
4887 } ) ;
88+
89+ it ( 'Should use shared worker for multiple tabs' , async ( ) => {
90+ const sharedSpy = vi . spyOn ( sharedWorkerProxyHandler , 'construct' ) ;
91+
92+ const db = new PowerSyncDatabase ( { database : { dbFilename : 'options-test.db' } , schema : testSchema } ) ;
93+
94+ await basicTest ( db ) ;
95+
96+ expect ( sharedSpy ) . toBeCalledTimes ( 1 ) ;
97+ } ) ;
98+
99+ it ( 'Should use dedicated worker when multiple tabs disabled' , async ( ) => {
100+ const sharedSpy = vi . spyOn ( sharedWorkerProxyHandler , 'construct' ) ;
101+ const dedicatedSpy = vi . spyOn ( workerProxyHandler , 'construct' ) ;
102+
103+ const db = new PowerSyncDatabase ( {
104+ database : { dbFilename : 'options-test.db' } ,
105+ schema : testSchema ,
106+ flags : { enableMultiTabs : false }
107+ } ) ;
108+
109+ await basicTest ( db ) ;
110+
111+ expect ( sharedSpy ) . toBeCalledTimes ( 0 ) ;
112+ expect ( dedicatedSpy ) . toBeCalledTimes ( 1 ) ;
113+ } ) ;
114+
115+ it ( 'Should not use workers when specified' , async ( ) => {
116+ const sharedSpy = vi . spyOn ( sharedWorkerProxyHandler , 'construct' ) ;
117+ const dedicatedSpy = vi . spyOn ( workerProxyHandler , 'construct' ) ;
118+
119+ const db = new PowerSyncDatabase ( {
120+ database : { dbFilename : 'options-test.db' } ,
121+ schema : testSchema ,
122+ flags : { useWebWorker : false }
123+ } ) ;
124+
125+ await basicTest ( db ) ;
126+
127+ expect ( sharedSpy ) . toBeCalledTimes ( 0 ) ;
128+ expect ( dedicatedSpy ) . toBeCalledTimes ( 0 ) ;
129+ } ) ;
49130} ) ;
0 commit comments