Files
turso/bindings/javascript/sync/packages/wasm/promise.test.ts
Nikita Sivukhin b01cec2ba4 wip
2025-10-29 16:24:05 +04:00

608 lines
26 KiB
TypeScript

import { expect, test } from 'vitest'
import { Database, connect, DatabaseRowMutation, DatabaseRowTransformResult } from './promise-default.js'
const localeCompare = (a, b) => a.x.localeCompare(b.x);
const intCompare = (a, b) => a.x - b.x;
test('checkpoint-and-actions', async () => {
{
const db = await connect({
path: ':memory:',
url: process.env.VITE_TURSO_DB_URL,
longPollTimeoutMs: 100,
});
await db.exec("CREATE TABLE IF NOT EXISTS rows(key TEXT PRIMARY KEY, value INTEGER)");
await db.exec("DELETE FROM rows");
await db.exec("INSERT INTO rows VALUES ('key', 0)");
await db.push();
await db.close();
}
const db1 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
await db1.exec("PRAGMA busy_timeout=100");
console.info('run_info', await db1.prepare("SELECT * FROM sqlite_master").all());
const pull = async function (iterations: number) {
for (let i = 0; i < iterations; i++) {
console.info('pull', i);
try {
await db1.pull();
}
catch (e) { console.error('pull', e); }
await new Promise(resolve => setTimeout(resolve, 0));
}
}
const push = async function (iterations: number) {
for (let i = 0; i < iterations; i++) {
await new Promise(resolve => setTimeout(resolve, 10));
console.info('push', i);
try {
if ((await db1.stats()).operations > 0) {
const start = performance.now();
await db1.push();
console.info('push', performance.now() - start);
}
}
catch (e) { console.error('push', e); }
}
}
const run = async function (iterations: number) {
let rows = 0;
for (let i = 0; i < iterations; i++) {
console.info('run', i, rows);
await db1.prepare("UPDATE rows SET value = value + 1 WHERE key = ?").run('key');
rows += 1;
const { cnt } = await db1.prepare("SELECT value as cnt FROM rows WHERE key = ?").get(['key']);
expect(cnt).toBe(rows);
await new Promise(resolve => setTimeout(resolve, 1));
}
}
await Promise.all([pull(20), push(20), run(1000)]);
})
// test('implicit connect', async () => {
// const db = new Database({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// const defer = db.prepare("SELECT * FROM not_found");
// await expect(async () => await defer.all()).rejects.toThrowError(/no such table: not_found/);
// expect(() => db.prepare("SELECT * FROM not_found")).toThrowError(/no such table: not_found/);
// expect(await db.prepare("SELECT 1 as x").all()).toEqual([{ x: 1 }]);
// })
// test('simple-db', async () => {
// const db = new Database({ path: ':memory:' });
// expect(await db.prepare("SELECT 1 as x").all()).toEqual([{ x: 1 }])
// await db.exec("CREATE TABLE t(x)");
// await db.exec("INSERT INTO t VALUES (1), (2), (3)");
// expect(await db.prepare("SELECT * FROM t").all()).toEqual([{ x: 1 }, { x: 2 }, { x: 3 }])
// await expect(async () => await db.pull()).rejects.toThrowError(/sync is disabled as database was opened without sync support/);
// })
// test('implicit connect', async () => {
// const db = new Database({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// const defer = db.prepare("SELECT * FROM not_found");
// await expect(async () => await defer.all()).rejects.toThrowError(/no such table: not_found/);
// expect(() => db.prepare("SELECT * FROM not_found")).toThrowError(/no such table: not_found/);
// expect(await db.prepare("SELECT 1 as x").all()).toEqual([{ x: 1 }]);
// })
// test('defered sync', async () => {
// {
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db.exec("CREATE TABLE IF NOT EXISTS t(x)");
// await db.exec("DELETE FROM t");
// await db.exec("INSERT INTO t VALUES (100)");
// await db.push();
// await db.close();
// }
// let url = null;
// const db = new Database({ path: ':memory:', url: () => url });
// await db.prepare("CREATE TABLE t(x)").run();
// await db.prepare("INSERT INTO t VALUES (1), (2), (3), (42)").run();
// expect(await db.prepare("SELECT * FROM t").all()).toEqual([{ x: 1 }, { x: 2 }, { x: 3 }, { x: 42 }]);
// await expect(async () => await db.pull()).rejects.toThrow(/url is empty - sync is paused/);
// url = process.env.VITE_TURSO_DB_URL;
// await db.pull();
// expect(await db.prepare("SELECT * FROM t").all()).toEqual([{ x: 100 }, { x: 1 }, { x: 2 }, { x: 3 }, { x: 42 }]);
// })
// test('encryption sync', async () => {
// const KEY = 'l/FWopMfZisTLgBX4A42AergrCrYKjiO3BfkJUwv83I=';
// const URL = 'http://encrypted--a--a.localhost:10000';
// {
// const db = await connect({ path: ':memory:', url: URL, remoteEncryption: { key: KEY, cipher: 'aes256gcm' } });
// await db.exec("CREATE TABLE IF NOT EXISTS t(x)");
// await db.exec("DELETE FROM t");
// await db.push();
// await db.close();
// }
// const db1 = await connect({ path: ':memory:', url: URL, remoteEncryption: { key: KEY, cipher: 'aes256gcm' } });
// const db2 = await connect({ path: ':memory:', url: URL, remoteEncryption: { key: KEY, cipher: 'aes256gcm' } });
// await db1.exec("INSERT INTO t VALUES (1), (2), (3)");
// await db2.exec("INSERT INTO t VALUES (4), (5), (6)");
// expect(await db1.prepare("SELECT * FROM t").all()).toEqual([{ x: 1 }, { x: 2 }, { x: 3 }]);
// expect(await db2.prepare("SELECT * FROM t").all()).toEqual([{ x: 4 }, { x: 5 }, { x: 6 }]);
// await Promise.all([db1.push(), db2.push()]);
// await Promise.all([db1.pull(), db2.pull()]);
// const expected = [{ x: 1 }, { x: 2 }, { x: 3 }, { x: 4 }, { x: 5 }, { x: 6 }];
// expect((await db1.prepare("SELECT * FROM t").all()).sort(intCompare)).toEqual(expected.sort(intCompare));
// expect((await db2.prepare("SELECT * FROM t").all()).sort(intCompare)).toEqual(expected.sort(intCompare));
// });
// test('defered encryption sync', async () => {
// const URL = 'http://encrypted--a--a.localhost:10000';
// const KEY = 'l/FWopMfZisTLgBX4A42AergrCrYKjiO3BfkJUwv83I=';
// let url = null;
// {
// const db = await connect({ path: ':memory:', url: URL, remoteEncryption: { key: KEY, cipher: 'aes256gcm' } });
// await db.exec("CREATE TABLE IF NOT EXISTS t(x)");
// await db.exec("DELETE FROM t");
// await db.exec("INSERT INTO t VALUES (100)");
// await db.push();
// await db.close();
// }
// const db = await connect({ path: ':memory:', url: () => url, remoteEncryption: { key: KEY, cipher: 'aes256gcm' } });
// await db.exec("CREATE TABLE IF NOT EXISTS t(x)");
// await db.exec("INSERT INTO t VALUES (1), (2), (3)");
// expect(await db.prepare("SELECT * FROM t").all()).toEqual([{ x: 1 }, { x: 2 }, { x: 3 }]);
// url = URL;
// await db.pull();
// const expected = [{ x: 100 }, { x: 1 }, { x: 2 }, { x: 3 }];
// expect((await db.prepare("SELECT * FROM t").all())).toEqual(expected);
// });
// test('select-after-push', async () => {
// {
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db.exec("CREATE TABLE IF NOT EXISTS t(x)");
// await db.exec("DELETE FROM t");
// await db.push();
// await db.close();
// }
// {
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db.exec("INSERT INTO t VALUES (1), (2), (3)");
// await db.push();
// }
// {
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// const rows = await db.prepare('SELECT * FROM t').all();
// expect(rows).toEqual([{ x: 1 }, { x: 2 }, { x: 3 }])
// }
// })
// test('select-without-push', async () => {
// {
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db.exec("CREATE TABLE IF NOT EXISTS t(x)");
// await db.exec("DELETE FROM t");
// await db.push();
// await db.close();
// }
// {
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db.exec("INSERT INTO t VALUES (1), (2), (3)");
// }
// {
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// const rows = await db.prepare('SELECT * FROM t').all();
// expect(rows).toEqual([])
// }
// })
// test('merge-non-overlapping-keys', async () => {
// {
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db.exec("CREATE TABLE IF NOT EXISTS q(x TEXT PRIMARY KEY, y)");
// await db.exec("DELETE FROM q");
// await db.push();
// await db.close();
// }
// const db1 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db1.exec("INSERT INTO q VALUES ('k1', 'value1'), ('k2', 'value2')");
// const db2 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db2.exec("INSERT INTO q VALUES ('k3', 'value3'), ('k4', 'value4'), ('k5', 'value5')");
// await Promise.all([db1.push(), db2.push()]);
// await Promise.all([db1.pull(), db2.pull()]);
// const rows1 = await db1.prepare('SELECT * FROM q').all();
// const rows2 = await db1.prepare('SELECT * FROM q').all();
// const expected = [{ x: 'k1', y: 'value1' }, { x: 'k2', y: 'value2' }, { x: 'k3', y: 'value3' }, { x: 'k4', y: 'value4' }, { x: 'k5', y: 'value5' }];
// expect(rows1.sort(localeCompare)).toEqual(expected.sort(localeCompare))
// expect(rows2.sort(localeCompare)).toEqual(expected.sort(localeCompare))
// })
// test('last-push-wins', async () => {
// {
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db.exec("CREATE TABLE IF NOT EXISTS q(x TEXT PRIMARY KEY, y)");
// await db.exec("DELETE FROM q");
// await db.push();
// await db.close();
// }
// const db1 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db1.exec("INSERT INTO q VALUES ('k1', 'value1'), ('k2', 'value2'), ('k4', 'value4')");
// const db2 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db2.exec("INSERT INTO q VALUES ('k1', 'value3'), ('k2', 'value4'), ('k3', 'value5')");
// await db2.push();
// await db1.push();
// await Promise.all([db1.pull(), db2.pull()]);
// const rows1 = await db1.prepare('SELECT * FROM q').all();
// const rows2 = await db1.prepare('SELECT * FROM q').all();
// const expected = [{ x: 'k1', y: 'value1' }, { x: 'k2', y: 'value2' }, { x: 'k3', y: 'value5' }, { x: 'k4', y: 'value4' }];
// expect(rows1.sort(localeCompare)).toEqual(expected.sort(localeCompare))
// expect(rows2.sort(localeCompare)).toEqual(expected.sort(localeCompare))
// })
// test('last-push-wins-with-delete', async () => {
// {
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db.exec("CREATE TABLE IF NOT EXISTS q(x TEXT PRIMARY KEY, y)");
// await db.exec("DELETE FROM q");
// await db.push();
// await db.close();
// }
// const db1 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db1.exec("INSERT INTO q VALUES ('k1', 'value1'), ('k2', 'value2'), ('k4', 'value4')");
// await db1.exec("DELETE FROM q")
// const db2 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db2.exec("INSERT INTO q VALUES ('k1', 'value3'), ('k2', 'value4'), ('k3', 'value5')");
// await db2.push();
// await db1.push();
// await Promise.all([db1.pull(), db2.pull()]);
// const rows1 = await db1.prepare('SELECT * FROM q').all();
// const rows2 = await db1.prepare('SELECT * FROM q').all();
// const expected = [{ x: 'k3', y: 'value5' }];
// expect(rows1).toEqual(expected)
// expect(rows2).toEqual(expected)
// })
// test('constraint-conflict', async () => {
// {
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db.exec("CREATE TABLE IF NOT EXISTS u(x TEXT PRIMARY KEY, y UNIQUE)");
// await db.exec("DELETE FROM u");
// await db.push();
// await db.close();
// }
// const db1 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db1.exec("INSERT INTO u VALUES ('k1', 'value1')");
// const db2 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db2.exec("INSERT INTO u VALUES ('k2', 'value1')");
// await db1.push();
// await expect(async () => await db2.push()).rejects.toThrow('SQLite error: UNIQUE constraint failed: u.y');
// })
// test('checkpoint', async () => {
// {
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db.exec("CREATE TABLE IF NOT EXISTS q(x TEXT PRIMARY KEY, y)");
// await db.exec("DELETE FROM q");
// await db.push();
// await db.close();
// }
// const db1 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// for (let i = 0; i < 1000; i++) {
// await db1.exec(`INSERT INTO q VALUES ('k${i}', 'v${i}')`);
// }
// expect((await db1.stats()).mainWal).toBeGreaterThan(4096 * 1000);
// await db1.checkpoint();
// expect((await db1.stats()).mainWal).toBe(0);
// let revertWal = (await db1.stats()).revertWal;
// expect(revertWal).toBeLessThan(4096 * 1000 / 100);
// for (let i = 0; i < 1000; i++) {
// await db1.exec(`UPDATE q SET y = 'u${i}' WHERE x = 'k${i}'`);
// }
// await db1.checkpoint();
// expect((await db1.stats()).revertWal).toBe(revertWal);
// })
// test('persistence-push', async () => {
// {
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db.exec("CREATE TABLE IF NOT EXISTS q(x TEXT PRIMARY KEY, y)");
// await db.exec("DELETE FROM q");
// await db.push();
// await db.close();
// }
// const path = `test-${(Math.random() * 10000) | 0}.db`;
// {
// const db1 = await connect({ path: path, url: process.env.VITE_TURSO_DB_URL });
// await db1.exec(`INSERT INTO q VALUES ('k1', 'v1')`);
// await db1.exec(`INSERT INTO q VALUES ('k2', 'v2')`);
// await db1.close();
// }
// {
// const db2 = await connect({ path: path, url: process.env.VITE_TURSO_DB_URL });
// await db2.exec(`INSERT INTO q VALUES ('k3', 'v3')`);
// await db2.exec(`INSERT INTO q VALUES ('k4', 'v4')`);
// const stmt = db2.prepare('SELECT * FROM q');
// const rows = await stmt.all();
// const expected = [{ x: 'k1', y: 'v1' }, { x: 'k2', y: 'v2' }, { x: 'k3', y: 'v3' }, { x: 'k4', y: 'v4' }];
// expect(rows).toEqual(expected)
// stmt.close();
// await db2.close();
// }
// {
// const db3 = await connect({ path: path, url: process.env.VITE_TURSO_DB_URL });
// await db3.push();
// await db3.close();
// }
// {
// const db4 = await connect({ path: path, url: process.env.VITE_TURSO_DB_URL });
// const rows = await db4.prepare('SELECT * FROM q').all();
// const expected = [{ x: 'k1', y: 'v1' }, { x: 'k2', y: 'v2' }, { x: 'k3', y: 'v3' }, { x: 'k4', y: 'v4' }];
// expect(rows).toEqual(expected)
// await db4.close();
// }
// })
// test('persistence-offline', async () => {
// {
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db.exec("CREATE TABLE IF NOT EXISTS q(x TEXT PRIMARY KEY, y)");
// await db.exec("DELETE FROM q");
// await db.push();
// await db.close();
// }
// const path = `test-${(Math.random() * 10000) | 0}.db`;
// {
// const db = await connect({ path: path, url: process.env.VITE_TURSO_DB_URL });
// await db.exec(`INSERT INTO q VALUES ('k1', 'v1')`);
// await db.exec(`INSERT INTO q VALUES ('k2', 'v2')`);
// await db.push();
// await db.close();
// }
// {
// const db = await connect({ path: path, url: "https://not-valid-url.localhost" });
// const rows = await db.prepare("SELECT * FROM q").all();
// const expected = [{ x: 'k1', y: 'v1' }, { x: 'k2', y: 'v2' }];
// expect(rows.sort(localeCompare)).toEqual(expected.sort(localeCompare))
// await db.close();
// }
// })
// test('persistence-pull-push', async () => {
// {
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// await db.exec("CREATE TABLE IF NOT EXISTS q(x TEXT PRIMARY KEY, y)");
// await db.exec("DELETE FROM q");
// await db.push();
// await db.close();
// }
// const path1 = `test-${(Math.random() * 10000) | 0}.db`;
// const path2 = `test-${(Math.random() * 10000) | 0}.db`;
// const db1 = await connect({ path: path1, url: process.env.VITE_TURSO_DB_URL });
// await db1.exec(`INSERT INTO q VALUES ('k1', 'v1')`);
// await db1.exec(`INSERT INTO q VALUES ('k2', 'v2')`);
// const stats1 = await db1.stats();
// const db2 = await connect({ path: path2, url: process.env.VITE_TURSO_DB_URL });
// await db2.exec(`INSERT INTO q VALUES ('k3', 'v3')`);
// await db2.exec(`INSERT INTO q VALUES ('k4', 'v4')`);
// await Promise.all([db1.push(), db2.push()]);
// await Promise.all([db1.pull(), db2.pull()]);
// const stats2 = await db1.stats();
// console.info(stats1, stats2);
// expect(stats1.revision).not.toBe(stats2.revision);
// const rows1 = await db1.prepare('SELECT * FROM q').all();
// const rows2 = await db2.prepare('SELECT * FROM q').all();
// const expected = [{ x: 'k1', y: 'v1' }, { x: 'k2', y: 'v2' }, { x: 'k3', y: 'v3' }, { x: 'k4', y: 'v4' }];
// expect(rows1.sort(localeCompare)).toEqual(expected.sort(localeCompare))
// expect(rows2.sort(localeCompare)).toEqual(expected.sort(localeCompare))
// })
// test('pull-push-concurrent', 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");
// await db.push();
// await db.close();
// }
// let pullResolve = null;
// const pullFinish = new Promise(resolve => pullResolve = resolve);
// let pushResolve = null;
// const pushFinish = new Promise(resolve => pushResolve = resolve);
// let stopPull = false;
// let stopPush = false;
// const db = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL });
// let pull = async () => {
// try {
// await db.pull();
// } catch (e) {
// console.error('pull', e);
// } finally {
// if (!stopPull) {
// setTimeout(pull, 0);
// } else {
// pullResolve()
// }
// }
// }
// let push = async () => {
// try {
// if ((await db.stats()).operations > 0) {
// await db.push();
// }
// } catch (e) {
// console.error('push', e);
// } finally {
// if (!stopPush) {
// setTimeout(push, 0);
// } else {
// pushResolve();
// }
// }
// }
// setTimeout(pull, 0);
// setTimeout(push, 0);
// for (let i = 0; i < 1000; i++) {
// await db.exec(`INSERT INTO q VALUES ('k${i}', 'v${i}')`);
// }
// await new Promise(resolve => setTimeout(resolve, 1000));
// stopPush = true;
// await pushFinish;
// stopPull = true;
// await pullFinish;
// console.info(await db.stats());
// })
// test('concurrent-updates', { timeout: 60000 }, async () => {
// {
// 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();
// }
// 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 {
// await db.pull();
// } catch (e) {
// console.error('pull', i, e);
// } finally {
// if (!stop) {
// setTimeout(async () => await pull(db, i), 0);
// }
// }
// }
// async function push(db, i) {
// try {
// await db.push();
// } catch (e) {
// console.error('push', i, e);
// } finally {
// if (!stop) {
// setTimeout(async () => await push(db, i), 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 {
// 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 () => {
// {
// const db = await connect({
// path: ':memory:',
// url: process.env.VITE_TURSO_DB_URL,
// });
// await db.exec("CREATE TABLE IF NOT EXISTS counter(key TEXT PRIMARY KEY, value INTEGER)");
// await db.exec("DELETE FROM counter");
// await db.exec("INSERT INTO counter VALUES ('1', 0)")
// await db.push();
// await db.close();
// }
// const transform = (m: DatabaseRowMutation) => ({
// operation: 'rewrite',
// stmt: {
// sql: `UPDATE counter SET value = value + ? WHERE key = ?`,
// values: [m.after.value - m.before.value, m.after.key]
// }
// } as DatabaseRowTransformResult);
// const db1 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL, transform: transform });
// const db2 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL, transform: transform });
// await db1.exec("UPDATE counter SET value = value + 1 WHERE key = '1'");
// await db2.exec("UPDATE counter SET value = value + 1 WHERE key = '1'");
// await Promise.all([db1.push(), db2.push()]);
// await Promise.all([db1.pull(), db2.pull()]);
// const rows1 = await db1.prepare('SELECT * FROM counter').all();
// const rows2 = await db2.prepare('SELECT * FROM counter').all();
// expect(rows1).toEqual([{ key: '1', value: 2 }]);
// expect(rows2).toEqual([{ key: '1', value: 2 }]);
// })
// test('transform-many', async () => {
// {
// const db = await connect({
// path: ':memory:',
// url: process.env.VITE_TURSO_DB_URL,
// });
// await db.exec("CREATE TABLE IF NOT EXISTS counter(key TEXT PRIMARY KEY, value INTEGER)");
// await db.exec("DELETE FROM counter");
// await db.exec("INSERT INTO counter VALUES ('1', 0)")
// await db.push();
// await db.close();
// }
// const transform = (m: DatabaseRowMutation) => ({
// operation: 'rewrite',
// stmt: {
// sql: `UPDATE counter SET value = value + ? WHERE key = ?`,
// values: [m.after.value - m.before.value, m.after.key]
// }
// } as DatabaseRowTransformResult);
// const db1 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL, transform: transform });
// const db2 = await connect({ path: ':memory:', url: process.env.VITE_TURSO_DB_URL, transform: transform });
// for (let i = 0; i < 1002; i++) {
// await db1.exec("UPDATE counter SET value = value + 1 WHERE key = '1'");
// }
// for (let i = 0; i < 1001; i++) {
// await db2.exec("UPDATE counter SET value = value + 1 WHERE key = '1'");
// }
// let start = performance.now();
// await Promise.all([db1.push(), db2.push()]);
// console.info('push', performance.now() - start);
// start = performance.now();
// await Promise.all([db1.pull(), db2.pull()]);
// console.info('pull', performance.now() - start);
// const rows1 = await db1.prepare('SELECT * FROM counter').all();
// const rows2 = await db2.prepare('SELECT * FROM counter').all();
// expect(rows1).toEqual([{ key: '1', value: 1001 + 1002 }]);
// expect(rows2).toEqual([{ key: '1', value: 1001 + 1002 }]);
// })