@@ -2,7 +2,7 @@ import { Worker } from 'node:worker_threads'
2
2
import { join } from 'node:path'
3
3
import { EventEmitter } from 'node:events'
4
4
import type { DatabaseConnection , Driver , QueryResult } from 'kysely'
5
- import { CompiledQuery } from 'kysely'
5
+ import { CompiledQuery , SelectQueryNode } from 'kysely'
6
6
import type { MainMsg , SqliteWorkerDialectConfig , WorkerMsg } from './type'
7
7
8
8
export class SqliteWorkerDriver implements Driver {
@@ -100,8 +100,48 @@ export class SqliteWorkerConnection implements DatabaseConnection {
100
100
private emit ?: EventEmitter ,
101
101
) { }
102
102
103
- async * streamQuery < R > ( ) : AsyncIterableIterator < QueryResult < R > > {
104
- throw new Error ( 'sqlite-worker driver doesn\'t support streaming' )
103
+ async * streamQuery < R > ( compiledQuery : CompiledQuery ) : AsyncIterableIterator < QueryResult < R > > {
104
+ const { parameters, sql, query } = compiledQuery
105
+ if ( ! SelectQueryNode . is ( query ) ) {
106
+ throw new Error ( 'WaSqlite dialect only supported SELECT queries' )
107
+ }
108
+ this . worker . postMessage ( [ '2' , sql , parameters ] satisfies MainMsg )
109
+ let resolver : ( ( value : IteratorResult < { rows : QueryResult < R > [ ] } > ) => void ) | null = null
110
+ let rejecter : ( ( reason : any ) => void ) | null = null
111
+
112
+ this . emit ! . on ( '2' , ( data , err ) => {
113
+ if ( err && rejecter ) {
114
+ rejecter ( err )
115
+ }
116
+ if ( resolver ) {
117
+ resolver ( { value : { rows : data ! } , done : false } )
118
+ resolver = null
119
+ }
120
+ } )
121
+
122
+ this . emit ! . on ( '3' , ( _ , err ) => {
123
+ if ( err && rejecter ) {
124
+ rejecter ( err )
125
+ }
126
+ if ( resolver ) {
127
+ resolver ( { value : undefined , done : true } )
128
+ }
129
+ } )
130
+
131
+ return {
132
+ [ Symbol . asyncIterator ] ( ) {
133
+ return this
134
+ } ,
135
+ async next ( ) {
136
+ return new Promise < IteratorResult < any > > ( ( resolve , reject ) => {
137
+ resolver = resolve
138
+ rejecter = reject
139
+ } )
140
+ } ,
141
+ async return ( ) {
142
+ return { value : undefined , done : true }
143
+ } ,
144
+ }
105
145
}
106
146
107
147
async executeQuery < R > ( compiledQuery : CompiledQuery < unknown > ) : Promise < QueryResult < R > > {
0 commit comments