11import {
22 AbstractPowerSyncDatabase ,
3+ compilableQueryWatch ,
4+ CompilableQueryWatchHandler ,
35 QueryResult ,
4- runOnSchemaChange ,
5- SQLWatchOptions ,
6- WatchHandler
6+ SQLWatchOptions
77} from '@powersync/common' ;
88import { Query } from 'drizzle-orm' ;
99import { DefaultLogger } from 'drizzle-orm/logger' ;
@@ -18,9 +18,10 @@ import { SQLiteTransaction } from 'drizzle-orm/sqlite-core';
1818import { BaseSQLiteDatabase } from 'drizzle-orm/sqlite-core/db' ;
1919import { SQLiteAsyncDialect } from 'drizzle-orm/sqlite-core/dialect' ;
2020import type { DrizzleConfig } from 'drizzle-orm/utils' ;
21+ import { toCompilableQuery } from './../utils/compilableQuery' ;
2122import { PowerSyncSQLiteSession , PowerSyncSQLiteTransactionConfig } from './sqlite-session' ;
2223
23- type WatchQuery = { toSQL ( ) : Query ; execute ( ) : Promise < any > } ;
24+ type WatchQuery < T > = { toSQL ( ) : Query ; execute ( ) : Promise < T > } ;
2425
2526export interface PowerSyncSQLiteDatabase < TSchema extends Record < string , unknown > = Record < string , never > >
2627 extends BaseSQLiteDatabase < 'async' , QueryResult , TSchema > {
@@ -31,7 +32,7 @@ export interface PowerSyncSQLiteDatabase<TSchema extends Record<string, unknown>
3132 config ?: PowerSyncSQLiteTransactionConfig
3233 ) : Promise < T > ;
3334
34- watch ( query : WatchQuery , handler ?: WatchHandler , options ?: SQLWatchOptions ) : void ;
35+ watch < T > ( query : WatchQuery < T > , handler ?: CompilableQueryWatchHandler < T > , options ?: SQLWatchOptions ) : void ;
3536}
3637
3738export function wrapPowerSyncWithDrizzle < TSchema extends Record < string , unknown > = Record < string , never > > (
@@ -60,50 +61,10 @@ export function wrapPowerSyncWithDrizzle<TSchema extends Record<string, unknown>
6061 logger
6162 } ) ;
6263
63- const watch = ( query : WatchQuery , handler ?: WatchHandler , options ?: SQLWatchOptions ) : void => {
64- const { onResult, onError = ( e : Error ) => { } } = handler ?? { } ;
65- if ( ! onResult ) {
66- throw new Error ( 'onResult is required' ) ;
67- }
68-
69- const watchQuery = async ( abortSignal : AbortSignal ) => {
70- try {
71- const toSql = query . toSQL ( ) ;
72- const resolvedTables = await db . resolveTables ( toSql . sql , toSql . params , options ) ;
73-
74- // Fetch initial data
75- const result = await query . execute ( ) ;
76- onResult ( result ) ;
77-
78- db . onChangeWithCallback (
79- {
80- onChange : async ( ) => {
81- try {
82- const result = await query . execute ( ) ;
83- onResult ( result ) ;
84- } catch ( error : any ) {
85- onError ( error ) ;
86- }
87- } ,
88- onError
89- } ,
90- {
91- ...( options ?? { } ) ,
92- tables : resolvedTables ,
93- // Override the abort signal since we intercept it
94- signal : abortSignal
95- }
96- ) ;
97- } catch ( error : any ) {
98- onError ( error ) ;
99- }
100- } ;
101-
102- runOnSchemaChange ( watchQuery , db , options ) ;
103- } ;
104-
10564 const baseDatabase = new BaseSQLiteDatabase ( 'async' , dialect , session , schema ) as PowerSyncSQLiteDatabase < TSchema > ;
10665 return Object . assign ( baseDatabase , {
107- watch : ( query : WatchQuery , handler ?: WatchHandler , options ?: SQLWatchOptions ) => watch ( query , handler , options )
66+ watch : < T > ( query : WatchQuery < T > , handler : CompilableQueryWatchHandler < T > , options ?: SQLWatchOptions ) => {
67+ compilableQueryWatch ( db , toCompilableQuery ( query ) , handler , options ) ;
68+ }
10869 } ) ;
10970}
0 commit comments