From 3dc6eaf6ec3d3fd16af44e2950e6d7f37f941cfe Mon Sep 17 00:00:00 2001 From: niharshah Date: Fri, 31 Jul 2026 17:01:57 +0530 Subject: [PATCH 1/2] fix(server): harden SQLite durability under streaming writes --- .../src/persistence/Layers/Sqlite.test.ts | 19 +++++++++++++++++++ apps/server/src/persistence/Layers/Sqlite.ts | 1 + .../src/persistence/NodeSqliteClient.test.ts | 10 ++++++++++ 3 files changed, 30 insertions(+) create mode 100644 apps/server/src/persistence/Layers/Sqlite.test.ts diff --git a/apps/server/src/persistence/Layers/Sqlite.test.ts b/apps/server/src/persistence/Layers/Sqlite.test.ts new file mode 100644 index 000000000000..a72972916675 --- /dev/null +++ b/apps/server/src/persistence/Layers/Sqlite.test.ts @@ -0,0 +1,19 @@ +import { assert, it } from "@effect/vitest"; +import * as Effect from "effect/Effect"; +import * as SqlClient from "effect/unstable/sql/SqlClient"; + +import { SqlitePersistenceMemory } from "./Sqlite.ts"; + +const layer = it.layer(SqlitePersistenceMemory); + +layer("Sqlite persistence setup", (it) => { + it.effect("uses full synchronous durability", () => + Effect.gen(function* () { + const sql = yield* SqlClient.SqlClient; + + const rows = yield* sql<{ readonly synchronous: number }>`PRAGMA synchronous;`; + + assert.equal(rows[0]?.synchronous, 2); + }), + ); +}); diff --git a/apps/server/src/persistence/Layers/Sqlite.ts b/apps/server/src/persistence/Layers/Sqlite.ts index dfd338b7159f..19f21eb3711c 100644 --- a/apps/server/src/persistence/Layers/Sqlite.ts +++ b/apps/server/src/persistence/Layers/Sqlite.ts @@ -34,6 +34,7 @@ const setup = Layer.effectDiscard( Effect.gen(function* () { const sql = yield* SqlClient.SqlClient; yield* sql`PRAGMA journal_mode = WAL;`; + yield* sql`PRAGMA synchronous = FULL;`; yield* sql`PRAGMA foreign_keys = ON;`; yield* runMigrations(); }), diff --git a/apps/server/src/persistence/NodeSqliteClient.test.ts b/apps/server/src/persistence/NodeSqliteClient.test.ts index b17d3e0eb6a1..c7f4d3bf8786 100644 --- a/apps/server/src/persistence/NodeSqliteClient.test.ts +++ b/apps/server/src/persistence/NodeSqliteClient.test.ts @@ -42,6 +42,16 @@ layer("NodeSqliteClient", (it) => { assert.equal(error.reason.operation, "prepare"); }), ); + + it.effect("uses full synchronous durability", () => + Effect.gen(function* () { + const sql = yield* SqlClient.SqlClient; + + const rows = yield* sql<{ readonly synchronous: number }>`PRAGMA synchronous;`; + + assert.equal(rows[0]?.synchronous, 2); + }), + ); }); it.effect("returns a typed failure when the database cannot be opened", () => From 4f0a46447f1bb35faaa1b9a2ffb8d018154a625c Mon Sep 17 00:00:00 2001 From: niharshah Date: Fri, 31 Jul 2026 17:06:15 +0530 Subject: [PATCH 2/2] fix(server): keep durability assertion with persistence layer --- apps/server/src/persistence/NodeSqliteClient.test.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/apps/server/src/persistence/NodeSqliteClient.test.ts b/apps/server/src/persistence/NodeSqliteClient.test.ts index c7f4d3bf8786..b17d3e0eb6a1 100644 --- a/apps/server/src/persistence/NodeSqliteClient.test.ts +++ b/apps/server/src/persistence/NodeSqliteClient.test.ts @@ -42,16 +42,6 @@ layer("NodeSqliteClient", (it) => { assert.equal(error.reason.operation, "prepare"); }), ); - - it.effect("uses full synchronous durability", () => - Effect.gen(function* () { - const sql = yield* SqlClient.SqlClient; - - const rows = yield* sql<{ readonly synchronous: number }>`PRAGMA synchronous;`; - - assert.equal(rows[0]?.synchronous, 2); - }), - ); }); it.effect("returns a typed failure when the database cannot be opened", () =>