Skip to content

Commit 2d1c004

Browse files
committed
HACK
1 parent 51f5cdb commit 2d1c004

2 files changed

Lines changed: 40 additions & 38 deletions

File tree

index.d.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,14 @@ export declare class Database {
3939
export declare class Statement {
4040
columns(): unknown[]
4141
iterate(params?: unknown | undefined | null): object
42-
iterateSync(params?: unknown | undefined | null): object
42+
iterateSync(params?: unknown | undefined | null): RowsIterator
4343
run(params?: unknown | undefined | null): RunResult
4444
pluck(pluck?: boolean | undefined | null): this
4545
raw(raw?: boolean | undefined | null): this
4646
get(params?: unknown | undefined | null): unknown
4747
safeIntegers(toggle?: boolean | undefined | null): this
4848
interrupt(): void
4949
}
50-
export declare class RowsIterator { }
50+
export declare class RowsIterator {
51+
next(): object
52+
}

src/lib.rs

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@ impl Statement {
614614
&self,
615615
env: Env,
616616
params: Option<napi::JsUnknown>,
617-
) -> Result<napi::JsObject> {
617+
) -> Result<RowsIterator> {
618618
let rt = runtime()?;
619619
let safe_ints = self.safe_ints.load(Ordering::SeqCst);
620620
let raw = self.raw.load(Ordering::SeqCst);
@@ -766,7 +766,12 @@ impl Statement {
766766
}
767767

768768
#[napi]
769-
pub struct RowsIterator {}
769+
pub struct RowsIterator {
770+
rows: Arc<tokio::sync::Mutex<libsql::Rows>>,
771+
safe_ints: bool,
772+
raw: bool,
773+
pluck: bool,
774+
}
770775

771776
#[napi]
772777
impl RowsIterator {
@@ -776,42 +781,37 @@ impl RowsIterator {
776781
safe_ints: bool,
777782
raw: bool,
778783
pluck: bool,
779-
) -> Result<napi::JsObject> {
780-
let mut iter = env.create_object()?;
781-
let next_fn: JsFunction = env.create_function_from_closure("next", move |ctx| {
782-
let rt = runtime()?;
783-
let rows = rows.clone();
784-
rt.block_on(async move {
785-
let mut rows = rows.lock().await;
786-
let next_row = rows.next().await.map_err(Error::from)?;
787-
let mut result = ctx.env.create_object()?;
788-
match next_row {
789-
Some(row) => {
790-
let value = map_row(&ctx.env, &rows, &row, safe_ints, raw, pluck)?;
791-
result.set_named_property("value", value)?;
792-
result.set_named_property("done", ctx.env.get_boolean(false)?)?;
793-
}
794-
None => {
795-
result.set_named_property("done", ctx.env.get_boolean(true)?)?;
796-
}
797-
}
798-
Ok(result)
799-
})
800-
})?;
801-
iter.set_named_property("next", next_fn)?;
802-
// Create iterator function
803-
let iterator_fn: JsFunction = env.create_function_from_closure("iterator", move |ctx| {
804-
Ok(ctx.this::<napi::JsObject>())
805-
})?;
806-
// Get Symbol.iterator
807-
let global = env.get_global()?;
808-
let symbol_ctor = global.get_named_property::<JsFunction>("Symbol")?;
809-
let symbol_ctor_obj = symbol_ctor.coerce_to_object()?;
810-
let symbol_iterator = symbol_ctor_obj.get_named_property::<napi::JsSymbol>("iterator")?;
811-
// Attach [Symbol.iterator]
812-
iter.set_property(symbol_iterator, iterator_fn)?;
784+
) -> Result<Self> {
785+
let iter = RowsIterator {
786+
rows,
787+
safe_ints,
788+
raw,
789+
pluck,
790+
};
813791
Ok(iter)
814792
}
793+
794+
#[napi]
795+
pub fn next(&self, env: Env) -> Result<napi::JsObject> {
796+
let rt = runtime()?;
797+
let rows = self.rows.clone();
798+
rt.block_on(async move {
799+
let mut rows = rows.lock().await;
800+
let next_row = rows.next().await.map_err(Error::from)?;
801+
let mut result = env.create_object()?;
802+
match next_row {
803+
Some(row) => {
804+
let value = map_row(&env, &rows, &row, self.safe_ints, self.raw, self.pluck)?;
805+
result.set_named_property("value", value)?;
806+
result.set_named_property("done", env.get_boolean(false)?)?;
807+
}
808+
None => {
809+
result.set_named_property("done", env.get_boolean(true)?)?;
810+
}
811+
}
812+
Ok(result)
813+
})
814+
}
815815
}
816816

817817
fn runtime() -> Result<&'static Runtime> {

0 commit comments

Comments
 (0)