From 1d3c823c7b83443144c5234751119aee005b65dc Mon Sep 17 00:00:00 2001 From: Nikita Sivukhin Date: Thu, 18 Sep 2025 01:35:09 +0400 Subject: [PATCH] wip --- .../javascript/packages/common/promise.ts | 38 ++++------- .../packages/native/promise.test.ts | 2 +- bindings/javascript/src/lib.rs | 13 +++- bindings/javascript/sync/packages/browser/a | Bin 57344 -> 0 bytes .../javascript/sync/packages/browser/a-shm | Bin 32768 -> 0 bytes .../sync/packages/browser/package.json | 2 +- .../sync/packages/browser/promise.test.ts | 61 ++++++++++++------ .../sync/packages/native/index.d.ts | 16 ----- .../javascript/sync/packages/native/index.js | 3 - .../sync/packages/native/package.json | 2 +- bindings/javascript/sync/src/lib.rs | 4 +- 11 files changed, 72 insertions(+), 69 deletions(-) delete mode 100755 bindings/javascript/sync/packages/browser/a delete mode 100755 bindings/javascript/sync/packages/browser/a-shm diff --git a/bindings/javascript/packages/common/promise.ts b/bindings/javascript/packages/common/promise.ts index 8dbcf5058..88ccb802c 100644 --- a/bindings/javascript/packages/common/promise.ts +++ b/bindings/javascript/packages/common/promise.ts @@ -115,22 +115,17 @@ class Database { const db = this; const wrapTxn = (mode) => { return async (...bindParameters) => { - await this.execLock.acquire(); + await db.exec("BEGIN " + mode); + db._inTransaction = true; try { - await db.exec("BEGIN " + mode); - db._inTransaction = true; - try { - const result = await fn(...bindParameters); - await db.exec("COMMIT"); - db._inTransaction = false; - return result; - } catch (err) { - await db.exec("ROLLBACK"); - db._inTransaction = false; - throw err; - } - } finally { - this.execLock.release(); + const result = await fn(...bindParameters); + await db.exec("COMMIT"); + db._inTransaction = false; + return result; + } catch (err) { + await db.exec("ROLLBACK"); + db._inTransaction = false; + throw err; } }; }; @@ -203,18 +198,11 @@ class Database { throw new TypeError("The database connection is not open"); } - await this.execLock.acquire(); + const stmt = this.prepare(sql); try { - const stmt = this.prepare(sql); - try { - await stmt.run(); - } finally { - stmt.close(); - } - } catch (err) { - throw convertError(err); + await stmt.run(); } finally { - this.execLock.release(); + stmt.close(); } } diff --git a/bindings/javascript/packages/native/promise.test.ts b/bindings/javascript/packages/native/promise.test.ts index 5819c8f39..a554154cd 100644 --- a/bindings/javascript/packages/native/promise.test.ts +++ b/bindings/javascript/packages/native/promise.test.ts @@ -22,7 +22,7 @@ test('drizzle-orm', async () => { } }) -test('in-memory db', async () => { +test('in-memory-db-async', async () => { const db = await connect(":memory:"); await db.exec("CREATE TABLE t(x)"); await db.exec("INSERT INTO t VALUES (1), (2), (3)"); diff --git a/bindings/javascript/src/lib.rs b/bindings/javascript/src/lib.rs index 3a9970680..ff910b7f2 100644 --- a/bindings/javascript/src/lib.rs +++ b/bindings/javascript/src/lib.rs @@ -10,9 +10,9 @@ //! - Iterating through query results //! - Managing the I/O event loop -// #[cfg(feature = "browser")] +#[cfg(feature = "browser")] pub mod browser; -// #[cfg(feature = "browser")] +#[cfg(feature = "browser")] use crate::browser::opfs; use napi::bindgen_prelude::*; @@ -62,6 +62,8 @@ pub(crate) fn init_tracing(level_filter: Option) { return; }; let level_filter = match level_filter.as_ref() { + "error" => LevelFilter::ERROR, + "warn" => LevelFilter::WARN, "info" => LevelFilter::INFO, "debug" => LevelFilter::DEBUG, "trace" => LevelFilter::TRACE, @@ -596,7 +598,12 @@ impl Statement { /// Finalizes the statement. #[napi] pub fn finalize(&self) -> Result<()> { - self.stmt.borrow_mut().take(); + match self.stmt.try_borrow_mut() { + Ok(mut stmt) => { + stmt.take(); + } + Err(err) => tracing::error!("borrow error: {:?}", err), + } Ok(()) } } diff --git a/bindings/javascript/sync/packages/browser/a b/bindings/javascript/sync/packages/browser/a deleted file mode 100755 index 8f5630c076b124960766842e96d6e1c9609bce89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57344 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 X`wJoW7eekYgxp^UxxWxL?JxWX%{~pb diff --git a/bindings/javascript/sync/packages/browser/a-shm b/bindings/javascript/sync/packages/browser/a-shm deleted file mode 100755 index 7c251555d016a9c5a07e151b6fff76239b1cde71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 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 N1Uv#Bf&VK6{s;Wz7XknP diff --git a/bindings/javascript/sync/packages/browser/package.json b/bindings/javascript/sync/packages/browser/package.json index efddc0a70..e09740154 100644 --- a/bindings/javascript/sync/packages/browser/package.json +++ b/bindings/javascript/sync/packages/browser/package.json @@ -42,7 +42,7 @@ "tsc-build": "npm exec tsc && cp sync.wasm32-wasi.wasm ./dist/sync.wasm32-wasi.wasm && WASM_FILE=sync.wasm32-wasi.wasm JS_FILE=./dist/wasm-inline.js node ../../../scripts/inline-wasm-base64.js && npm run bundle", "bundle": "vite build", "build": "npm run napi-build && npm run tsc-build", - "test": "VITE_TURSO_DB_URL=http://c--a--a.localhost:10000 CI=1 vitest --testTimeout 30000 --browser=chromium --run && VITE_TURSO_DB_URL=http://c--a--a.localhost:10000 CI=1 vitest --testTimeout 30000 --browser=firefox --run" + "test": "VITE_TURSO_DB_URL=http://f--a--a.localhost:10000 CI=1 vitest --testTimeout 30000 --browser=chromium --run && VITE_TURSO_DB_URL=http://f--a--a.localhost:10000 CI=1 vitest --testTimeout 30000 --browser=firefox --run" }, "napi": { "binaryName": "sync", diff --git a/bindings/javascript/sync/packages/browser/promise.test.ts b/bindings/javascript/sync/packages/browser/promise.test.ts index fb60ff61b..ff271d0e6 100644 --- a/bindings/javascript/sync/packages/browser/promise.test.ts +++ b/bindings/javascript/sync/packages/browser/promise.test.ts @@ -316,47 +316,72 @@ test('pull-push-concurrent', async () => { console.info(await db.stats()); }) -test('concurrent-updates', async () => { +test('concurrent-updates', { timeout: 60000 }, async () => { { - const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL, longPollTimeoutMs: 5000 }); - await db.exec("CREATE TABLE IF NOT EXISTS q(x TEXT PRIMARY KEY, y)"); - await db.exec("DELETE FROM q"); + const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL, longPollTimeoutMs: 10 }); + await db.exec("CREATE TABLE IF NOT EXISTS three(x TEXT PRIMARY KEY, y, z)"); + await db.exec("DELETE FROM three"); await db.push(); await db.close(); } - const db1 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL }); - const db2 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL }); - async function pull(db) { + let stop = false; + const dbs = []; + for (let i = 0; i < 8; i++) { + dbs.push(await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL })); + } + async function pull(db, i) { try { + console.info('pull', i); await db.pull(); } catch (e) { - // ignore + console.error('pull', i, e); } finally { - setTimeout(async () => await pull(db), 0); + if (!stop) { + setTimeout(async () => await pull(db, i), 0); + } } } - async function push(db) { + async function push(db, i) { try { + console.info('push', i); await db.push(); } catch (e) { - // ignore + console.error('push', i, e); } finally { - setTimeout(async () => await push(db), 0); + if (!stop) { + setTimeout(async () => await push(db, i), 0); + } } } - setTimeout(async () => await pull(db1), 0) - setTimeout(async () => await pull(db2), 0) - setTimeout(async () => await push(db1), 0) - setTimeout(async () => await push(db2), 0) + for (let i = 0; i < dbs.length; i++) { + setTimeout(async () => await pull(dbs[i], i), 0) + setTimeout(async () => await push(dbs[i], i), 0) + } for (let i = 0; i < 1000; i++) { try { - await db1.exec(`INSERT INTO q VALUES ('1', 0) ON CONFLICT DO UPDATE SET y = randomblob(128)`); - await db2.exec(`INSERT INTO q VALUES ('2', 0) ON CONFLICT DO UPDATE SET y = randomblob(128)`); + const tasks = []; + for (let s = 0; s < dbs.length; s++) { + tasks.push(dbs[s].exec(`INSERT INTO three VALUES ('${s}', 0, randomblob(128)) ON CONFLICT DO UPDATE SET y = y + 1, z = randomblob(128)`)); + } + await Promise.all(tasks); } catch (e) { // ignore } await new Promise(resolve => setTimeout(resolve, 1)); } + stop = true; + await Promise.all(dbs.map(db => db.push())); + await Promise.all(dbs.map(db => db.pull())); + let results = []; + for (let i = 0; i < dbs.length; i++) { + results.push(await dbs[i].prepare('SELECT x, y FROM three').all()); + } + for (let i = 0; i < dbs.length; i++) { + expect(results[i]).toEqual(results[0]); + for (let s = 0; s < dbs.length; s++) { + expect(results[i][s].y).toBeGreaterThan(500); + } + } }) test('transform', async () => { diff --git a/bindings/javascript/sync/packages/native/index.d.ts b/bindings/javascript/sync/packages/native/index.d.ts index 4d1b45fa9..af73101f3 100644 --- a/bindings/javascript/sync/packages/native/index.d.ts +++ b/bindings/javascript/sync/packages/native/index.d.ts @@ -73,16 +73,6 @@ export declare class Database { ioLoopAsync(): Promise } -export declare class Opfs { - constructor() - connectDb(path: string, opts?: DatabaseOpts | undefined | null): Promise - complete(completionNo: number, result: number): void -} - -export declare class OpfsFile { - -} - /** A prepared statement. */ export declare class Statement { reset(): void @@ -139,12 +129,6 @@ export declare class Statement { export interface DatabaseOpts { tracing?: string } - -/** - * turso-db in the the browser requires explicit thread pool initialization - * so, we just put no-op task on the thread pool and force emnapi to allocate web worker - */ -export declare function initThreadPool(): Promise export declare class GeneratorHolder { resumeSync(error?: string | undefined | null): GeneratorResponse resumeAsync(error?: string | undefined | null): Promise diff --git a/bindings/javascript/sync/packages/native/index.js b/bindings/javascript/sync/packages/native/index.js index 12e351d61..cd543a959 100644 --- a/bindings/javascript/sync/packages/native/index.js +++ b/bindings/javascript/sync/packages/native/index.js @@ -510,10 +510,7 @@ if (!nativeBinding) { const { Database, Statement, GeneratorHolder, JsDataCompletion, JsProtocolIo, JsProtocolRequestBytes, SyncEngine, SyncEngineChanges, DatabaseChangeTypeJs, SyncEngineProtocolVersion } = nativeBinding export { Database } -export { Opfs } -export { OpfsFile } export { Statement } -export { initThreadPool } export { GeneratorHolder } export { JsDataCompletion } export { JsProtocolIo } diff --git a/bindings/javascript/sync/packages/native/package.json b/bindings/javascript/sync/packages/native/package.json index c0c01081c..c7c52414f 100644 --- a/bindings/javascript/sync/packages/native/package.json +++ b/bindings/javascript/sync/packages/native/package.json @@ -31,7 +31,7 @@ "napi-artifacts": "napi artifacts --output-dir .", "tsc-build": "npm exec tsc", "build": "npm run napi-build && npm run tsc-build", - "test": "VITE_TURSO_DB_URL=http://c--a--a.localhost:10000 vitest --run", + "test": "VITE_TURSO_DB_URL=http://d--a--a.localhost:10000 vitest --run", "prepublishOnly": "npm run napi-dirs && npm run napi-artifacts && napi prepublish -t npm" }, "napi": { diff --git a/bindings/javascript/sync/src/lib.rs b/bindings/javascript/sync/src/lib.rs index 13427f501..3223b0795 100644 --- a/bindings/javascript/sync/src/lib.rs +++ b/bindings/javascript/sync/src/lib.rs @@ -6,7 +6,7 @@ pub mod js_protocol_io; use std::{ collections::HashMap, - sync::{Arc, Mutex, MutexGuard, OnceLock, RwLock, RwLockReadGuard}, + sync::{Arc, Mutex, OnceLock, RwLock, RwLockReadGuard}, }; use napi::bindgen_prelude::{AsyncTask, Either5, Null}; @@ -149,6 +149,8 @@ impl SyncEngine { pub fn new(opts: SyncEngineOpts) -> napi::Result { // helpful for local debugging match opts.tracing.as_deref() { + Some("error") => init_tracing(LevelFilter::ERROR), + Some("warn") => init_tracing(LevelFilter::WARN), Some("info") => init_tracing(LevelFilter::INFO), Some("debug") => init_tracing(LevelFilter::DEBUG), Some("trace") => init_tracing(LevelFilter::TRACE),