@@ -6,7 +6,6 @@ import {ElectricDatabase, electrify} from 'electric-sql/wa-sqlite';
66import {
77 QueryResult ,
88 SQLWatchOptions ,
9- Schema ,
109 WatchOnChangeEvent ,
1110} from '@journeyapps/powersync-sdk-common' ;
1211import initWasm , { DB } from '@vlcn.io/crsqlite-wasm' ;
@@ -25,7 +24,11 @@ export type SqliteWasmDb = [sqlite3: any, db: any];
2524const electricSchema = new DbSchema ( { } , [ ] ) ;
2625type Electric = ElectricClient < typeof electricSchema > ;
2726
28- const powerSyncSchema = new Schema ( [ ] ) ;
27+ type AbstractPowerSyncDatabase = {
28+ execute ( sql : string , args : any [ ] ) : Promise < QueryResult > ;
29+ close ( ) : Promise < void > ;
30+ onChange ( options : SQLWatchOptions ) : AsyncIterable < WatchOnChangeEvent > ;
31+ } ;
2932
3033type Dump = { [ name : string ] : [ sql : string , rows : { [ column : string ] : any } [ ] ] } ;
3134
@@ -50,71 +53,54 @@ type SqliteVariant<Database> = [
5053
5154const escapeId = ( str : string ) => `"${ str . replace ( / " / g, '""' ) } "` ;
5255
53- // Mock for PowerSync
54- type AbstractPowerSyncDatabase = {
55- execute ( sql : string , args : any [ ] ) : Promise < QueryResult > ;
56- close ( ) : Promise < void > ;
57- onChange ( options : SQLWatchOptions ) : AsyncIterable < WatchOnChangeEvent > ;
58- } ;
59-
60- class WaSqlitePowerSyncDatabaseOpenFactory {
61- public dbFilename : string ;
62- public db : sqlite3 . Database ;
63-
64- constructor ( { schema : _ , dbFilename} : { schema : Schema ; dbFilename : string } ) {
65- this . dbFilename = dbFilename ;
66- this . db = new sqlite3 . Database ( this . dbFilename ) ;
67- }
68-
69- getInstance ( ) : AbstractPowerSyncDatabase {
70- const db = this . db ;
71-
72- const instance : AbstractPowerSyncDatabase = {
73- execute : ( sql , args ) =>
74- new Promise ( ( resolve , reject ) => {
75- return db . all ( sql , args , ( error , rows : { [ id : string ] : any } [ ] ) =>
76- error
77- ? reject ( error )
78- : resolve ( {
79- rows : {
80- _array : rows . map ( ( row : { [ id : string ] : any } ) => ( {
81- ...row ,
82- } ) ) ,
83- length : rows . length ,
84- item : ( ) => null ,
85- } ,
86- rowsAffected : 0 ,
87- } ) ,
88- ) ;
89- } ) ,
90- close : ( ) =>
91- new Promise ( ( resolve ) => {
92- db . close ( ) ;
93- resolve ( ) ;
94- } ) ,
95- onChange : ( { signal} = { } ) => ( {
96- async * [ Symbol . asyncIterator ] ( ) {
97- signal ?. addEventListener ( 'abort' , ( ) =>
98- db . removeAllListeners ( 'change' ) ,
99- ) ;
100- while ( ! signal ?. aborted ) {
101- const nextChange = await new Promise < WatchOnChangeEvent > (
102- ( resolve ) => {
103- const observer = ( _ : any , _2 : any , tableName : string ) => {
104- db . removeAllListeners ( 'change' ) ;
105- resolve ( { changedTables : [ tableName ] } ) ;
106- } ;
107- db . addListener ( 'change' , observer ) ;
108- } ,
109- ) ;
110- yield nextChange ;
111- }
112- } ,
56+ const getPowerSyncDatabase = (
57+ dbFilename : string ,
58+ ) : AbstractPowerSyncDatabase => {
59+ const db = new sqlite3 . Database ( dbFilename ) ;
60+ return {
61+ execute : ( sql , args ) =>
62+ new Promise ( ( resolve , reject ) => {
63+ return db . all ( sql , args , ( error , rows : { [ id : string ] : any } [ ] ) =>
64+ error
65+ ? reject ( error )
66+ : resolve ( {
67+ rows : {
68+ _array : rows . map ( ( row : { [ id : string ] : any } ) => ( {
69+ ...row ,
70+ } ) ) ,
71+ length : rows . length ,
72+ item : ( ) => null ,
73+ } ,
74+ rowsAffected : 0 ,
75+ } ) ,
76+ ) ;
77+ } ) ,
78+ close : ( ) =>
79+ new Promise ( ( resolve ) => {
80+ db . close ( ) ;
81+ resolve ( ) ;
11382 } ) ,
114- } ;
115- return instance ;
116- }
117- }
83+ onChange : ( { signal} = { } ) => ( {
84+ async * [ Symbol . asyncIterator ] ( ) {
85+ signal ?. addEventListener ( 'abort' , ( ) =>
86+ db . removeAllListeners ( 'change' ) ,
87+ ) ;
88+ while ( ! signal ?. aborted ) {
89+ const nextChange = await new Promise < WatchOnChangeEvent > (
90+ ( resolve ) => {
91+ const observer = ( _ : any , _2 : any , tableName : string ) => {
92+ db . removeAllListeners ( 'change' ) ;
93+ resolve ( { changedTables : [ tableName ] } ) ;
94+ } ;
95+ db . addListener ( 'change' , observer ) ;
96+ } ,
97+ ) ;
98+ yield nextChange ;
99+ }
100+ } ,
101+ } ) ,
102+ } ;
103+ } ;
118104
119105export const VARIANTS : { [ name : string ] : SqliteVariant < any > } = {
120106 libSql : [
@@ -173,13 +159,8 @@ export const VARIANTS: {[name: string]: SqliteVariant<any>} = {
173159 1000 ,
174160 ] ,
175161 powerSync : [
176- async ( ) : Promise < AbstractPowerSyncDatabase > => {
177- const factory = new WaSqlitePowerSyncDatabaseOpenFactory ( {
178- schema : powerSyncSchema ,
179- dbFilename : ':memory:' ,
180- } ) ;
181- return factory . getInstance ( ) ;
182- } ,
162+ async ( ) : Promise < AbstractPowerSyncDatabase > =>
163+ getPowerSyncDatabase ( ':memory:' ) ,
183164 [ 'getPowerSync' , ( powerSync : AbstractPowerSyncDatabase ) => powerSync ] ,
184165 (
185166 store : Store ,
0 commit comments