@@ -96,7 +96,7 @@ class ConnectionMutex {
96
96
export class SqliteWorkerConnection implements DatabaseConnection {
97
97
constructor (
98
98
private worker : Worker ,
99
- private emit ?: EventEmitter ,
99
+ private mitt ?: EventEmitter ,
100
100
) { }
101
101
102
102
async * streamQuery < R > ( compiledQuery : CompiledQuery ) : AsyncIterableIterator < QueryResult < R > > {
@@ -105,52 +105,52 @@ export class SqliteWorkerConnection implements DatabaseConnection {
105
105
throw new Error ( 'Sqlite worker dialect only supported SELECT queries' )
106
106
}
107
107
this . worker . postMessage ( [ '2' , sql , parameters ] satisfies MainMsg )
108
- let resolver : ( ( value : IteratorResult < { rows : QueryResult < R > [ ] } > ) => void ) | null = null
109
- let rejecter : ( ( reason : any ) => void ) | null = null
110
-
111
- this . emit ! . on ( '2' , ( data , err ) => {
112
- if ( err && rejecter ) {
113
- rejecter ( err )
114
- }
115
- if ( resolver ) {
116
- resolver ( { value : { rows : data ! } , done : false } )
117
- resolver = null
108
+ let done = false
109
+ let resolveFn : ( value : IteratorResult < QueryResult < R > > ) => void
110
+ let rejectFn : ( reason ?: any ) => void
111
+
112
+ const dataListener = ( data : QueryResult < any > [ ] | null , err : unknown ) : void => {
113
+ if ( err ) {
114
+ rejectFn ( err )
115
+ } else {
116
+ resolveFn ( { value : { rows : data as any } , done : false } )
118
117
}
119
- } )
118
+ }
119
+ this . mitt ! . on ( '2' /* data */ , dataListener )
120
120
121
- this . emit ! . on ( '3' , ( _ , err ) => {
122
- if ( err && rejecter ) {
123
- rejecter ( err )
124
- }
125
- if ( resolver ) {
126
- resolver ( { value : undefined , done : true } )
121
+ const endListener = ( _ : null , err : unknown ) : void => {
122
+ if ( err ) {
123
+ rejectFn ( err )
124
+ } else {
125
+ resolveFn ( { value : undefined , done : true } )
127
126
}
128
- } )
127
+ }
128
+ this . mitt ! . on ( '3' /* end */ , endListener )
129
129
130
- return {
131
- [ Symbol . asyncIterator ] ( ) {
132
- return this
133
- } ,
134
- async next ( ) {
135
- return new Promise < IteratorResult < any > > ( ( resolve , reject ) => {
136
- resolver = resolve
137
- rejecter = reject
138
- } )
139
- } ,
140
- async return ( ) {
141
- return { value : undefined , done : true }
142
- } ,
130
+ while ( ! done ) {
131
+ const result = await new Promise < IteratorResult < QueryResult < R > > > ( ( res , rej ) => {
132
+ resolveFn = res
133
+ rejectFn = rej
134
+ } )
135
+
136
+ if ( result . done ) {
137
+ done = true
138
+ this . mitt ?. off ( '2' /* data */ , dataListener )
139
+ this . mitt ?. off ( '3' /* end */ , endListener )
140
+ } else {
141
+ yield result . value
142
+ }
143
143
}
144
144
}
145
145
146
146
async executeQuery < R > ( compiledQuery : CompiledQuery < unknown > ) : Promise < QueryResult < R > > {
147
147
const { parameters, sql } = compiledQuery
148
148
this . worker . postMessage ( [ '0' , sql , parameters ] satisfies MainMsg )
149
149
return new Promise ( ( resolve , reject ) => {
150
- if ( ! this . emit ) {
150
+ if ( ! this . mitt ) {
151
151
reject ( new Error ( 'kysely instance has been destroyed' ) )
152
152
}
153
- this . emit ! . once ( '0' , ( data : QueryResult < any > , err ) => ( data && ! err ) ? resolve ( data ) : reject ( err ) )
153
+ this . mitt ! . once ( '0' , ( data : QueryResult < any > , err ) => ( data && ! err ) ? resolve ( data ) : reject ( err ) )
154
154
} )
155
155
}
156
156
}
0 commit comments