@effect/sql-sqlite-bun 4.0.0-beta.106 → 4.0.0-beta.107

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
1
  import * as Config from "effect/Config";
2
2
  import * as Context from "effect/Context";
3
+ import * as Duration from "effect/Duration";
3
4
  import * as Effect from "effect/Effect";
4
5
  import * as Layer from "effect/Layer";
5
6
  import * as Scope from "effect/Scope";
@@ -46,7 +47,7 @@ export interface SqliteClient extends Client.SqlClient {
46
47
  */
47
48
  export declare const SqliteClient: Context.Service<SqliteClient, SqliteClient>;
48
49
  /**
49
- * Configuration for a Bun SQLite client, including filename, open mode flags, WAL behavior, span attributes, and query/result name transforms.
50
+ * Configuration for a Bun SQLite client, including filename, open mode flags, WAL and busy timeout behavior, span attributes, and query/result name transforms.
50
51
  *
51
52
  * @category models
52
53
  * @since 4.0.0
@@ -57,12 +58,18 @@ export interface SqliteClientConfig {
57
58
  readonly create?: boolean | undefined;
58
59
  readonly readwrite?: boolean | undefined;
59
60
  readonly disableWAL?: boolean | undefined;
61
+ /**
62
+ * How long SQLite waits when the database is busy. Defaults to 5 seconds.
63
+ * `Duration.infinity` is clamped to SQLite's maximum timeout.
64
+ * Waiting blocks the event loop because `bun:sqlite` is synchronous.
65
+ */
66
+ readonly busyTimeout?: Duration.Input | undefined;
60
67
  readonly spanAttributes?: Record<string, unknown> | undefined;
61
68
  readonly transformResultNames?: ((str: string) => string) | undefined;
62
69
  readonly transformQueryNames?: ((str: string) => string) | undefined;
63
70
  }
64
71
  /**
65
- * Creates a scoped Bun SQLite client for a database file, enabling WAL by default and serializing access. Streaming queries are not implemented.
72
+ * Creates a scoped Bun SQLite client for a database file, enabling WAL and a 5-second busy timeout by default. Explicit transactions on writable connections take the write lock for their duration, even when they only read; clients opened with `readonly: true` are unaffected. Streaming queries are not implemented.
66
73
  *
67
74
  * @category constructors
68
75
  * @since 4.0.0
@@ -1 +1 @@
1
- {"version":3,"file":"SqliteClient.d.ts","sourceRoot":"","sources":["../src/SqliteClient.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAGrC,OAAO,KAAK,UAAU,MAAM,uCAAuC,CAAA;AACnE,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAEvD,OAAO,EAAuB,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAQ5E;;;;;GAKG;AACH,eAAO,MAAM,MAAM,EAAE,MAA+C,CAAA;AAEpE;;;;;GAKG;AACH,MAAM,MAAM,MAAM,GAAG,sCAAsC,CAAA;AAE3D;;;;;GAKG;AACH,MAAM,WAAW,YAAa,SAAQ,MAAM,CAAC,SAAS;IACpD,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IACpD,QAAQ,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAEvE,8BAA8B;IAC9B,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAA;CAC7B;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,6CAAiE,CAAA;AAE1F;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAEzC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;IAE7D,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAA;IACrE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAA;CACrE;AAOD;;;;;GAKG;AACH,eAAO,MAAM,IAAI,YACN,kBAAkB,KAC1B,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CA6HrE,CAAA;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,WAAW,WACd,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,KACtC,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAUzB,CAAA;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,KAAK,WACR,kBAAkB,KACzB,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,CAML,CAAA"}
1
+ {"version":3,"file":"SqliteClient.d.ts","sourceRoot":"","sources":["../src/SqliteClient.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAGrC,OAAO,KAAK,UAAU,MAAM,uCAAuC,CAAA;AACnE,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAEvD,OAAO,EAAuB,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAS5E;;;;;GAKG;AACH,eAAO,MAAM,MAAM,EAAE,MAA+C,CAAA;AAEpE;;;;;GAKG;AACH,MAAM,MAAM,MAAM,GAAG,sCAAsC,CAAA;AAE3D;;;;;GAKG;AACH,MAAM,WAAW,YAAa,SAAQ,MAAM,CAAC,SAAS;IACpD,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IACpD,QAAQ,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAEvE,8BAA8B;IAC9B,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAA;CAC7B;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,6CAAiE,CAAA;AAE1F;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACzC;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IAEjD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;IAE7D,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAA;IACrE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAA;CACrE;AAOD;;;;;GAKG;AACH,eAAO,MAAM,IAAI,YACN,kBAAkB,KAC1B,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CAmIrE,CAAA;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,WAAW,WACd,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,KACtC,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAUzB,CAAA;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,KAAK,WACR,kBAAkB,KACzB,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,CAML,CAAA"}
@@ -3,14 +3,20 @@
3
3
  *
4
4
  * This module opens a SQLite database and exposes it as both `SqliteClient` and
5
5
  * the generic Effect SQL client. It serializes access to the database, enables
6
- * WAL mode unless disabled, and supports database export and extension loading.
7
- * Streaming queries and `updateValues` are not supported by this driver.
6
+ * WAL mode unless disabled, and waits up to five seconds for busy databases by
7
+ * default. Explicit transactions on writable connections use `BEGIN IMMEDIATE`
8
+ * to avoid read-to-write lock upgrades, which serializes them behind other
9
+ * writers even when they only read. Clients opened with `readonly: true` are
10
+ * unaffected. Busy waits block the event loop because `bun:sqlite` is
11
+ * synchronous. Database export and extension loading are supported; streaming
12
+ * queries and `updateValues` are not.
8
13
  *
9
14
  * @since 4.0.0
10
15
  */
11
16
  import { Database } from "bun:sqlite";
12
17
  import * as Config from "effect/Config";
13
18
  import * as Context from "effect/Context";
19
+ import * as Duration from "effect/Duration";
14
20
  import * as Effect from "effect/Effect";
15
21
  import * as Fiber from "effect/Fiber";
16
22
  import { identity } from "effect/Function";
@@ -23,6 +29,7 @@ import * as Client from "effect/unstable/sql/SqlClient";
23
29
  import { classifySqliteError, SqlError } from "effect/unstable/sql/SqlError";
24
30
  import * as Statement from "effect/unstable/sql/Statement";
25
31
  const ATTR_DB_SYSTEM_NAME = "db.system.name";
32
+ const MAX_BUSY_TIMEOUT = 2_147_483_647;
26
33
  const classifyError = (cause, message, operation) => classifySqliteError(cause, {
27
34
  message,
28
35
  operation
@@ -46,7 +53,7 @@ export const TypeId = "~@effect/sql-sqlite-bun/SqliteClient";
46
53
  */
47
54
  export const SqliteClient = /*#__PURE__*/Context.Service("@effect/sql-sqlite-bun/Client");
48
55
  /**
49
- * Creates a scoped Bun SQLite client for a database file, enabling WAL by default and serializing access. Streaming queries are not implemented.
56
+ * Creates a scoped Bun SQLite client for a database file, enabling WAL and a 5-second busy timeout by default. Explicit transactions on writable connections take the write lock for their duration, even when they only read; clients opened with `readonly: true` are unaffected. Streaming queries are not implemented.
50
57
  *
51
58
  * @category constructors
52
59
  * @since 4.0.0
@@ -62,6 +69,8 @@ export const make = options => Effect.gen(function* () {
62
69
  create: readonly ? false : options.create ?? true
63
70
  });
64
71
  yield* Effect.addFinalizer(() => Effect.sync(() => db.close()));
72
+ const busyTimeout = Math.min(MAX_BUSY_TIMEOUT, Math.max(0, Math.round(Duration.toMillis(options.busyTimeout ?? Duration.seconds(5)))));
73
+ db.run(`PRAGMA busy_timeout = ${busyTimeout};`);
65
74
  if (options.disableWAL !== true && !readonly) {
66
75
  db.run("PRAGMA journal_mode = WAL;");
67
76
  }
@@ -136,6 +145,7 @@ export const make = options => Effect.gen(function* () {
136
145
  acquirer,
137
146
  compiler,
138
147
  transactionAcquirer,
148
+ beginTransaction: "BEGIN IMMEDIATE",
139
149
  spanAttributes: [...(options.spanAttributes ? Object.entries(options.spanAttributes) : []), [ATTR_DB_SYSTEM_NAME, "sqlite"]],
140
150
  transformRows
141
151
  }), {
@@ -1 +1 @@
1
- {"version":3,"file":"SqliteClient.js","names":[],"sources":["../src/SqliteClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SqliteClient.js","names":[],"sources":["../src/SqliteClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect/sql-sqlite-bun",
3
- "version": "4.0.0-beta.106",
3
+ "version": "4.0.0-beta.107",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "A SQLite toolkit for Effect",
@@ -48,11 +48,11 @@
48
48
  },
49
49
  "devDependencies": {
50
50
  "@types/bun": "^1.3.14",
51
- "@effect/platform-bun": "^4.0.0-beta.106",
52
- "effect": "^4.0.0-beta.106"
51
+ "@effect/platform-bun": "^4.0.0-beta.107",
52
+ "effect": "^4.0.0-beta.107"
53
53
  },
54
54
  "peerDependencies": {
55
- "effect": "^4.0.0-beta.106"
55
+ "effect": "^4.0.0-beta.107"
56
56
  },
57
57
  "scripts": {
58
58
  "codegen": "effect-utils codegen",
@@ -3,14 +3,20 @@
3
3
  *
4
4
  * This module opens a SQLite database and exposes it as both `SqliteClient` and
5
5
  * the generic Effect SQL client. It serializes access to the database, enables
6
- * WAL mode unless disabled, and supports database export and extension loading.
7
- * Streaming queries and `updateValues` are not supported by this driver.
6
+ * WAL mode unless disabled, and waits up to five seconds for busy databases by
7
+ * default. Explicit transactions on writable connections use `BEGIN IMMEDIATE`
8
+ * to avoid read-to-write lock upgrades, which serializes them behind other
9
+ * writers even when they only read. Clients opened with `readonly: true` are
10
+ * unaffected. Busy waits block the event loop because `bun:sqlite` is
11
+ * synchronous. Database export and extension loading are supported; streaming
12
+ * queries and `updateValues` are not.
8
13
  *
9
14
  * @since 4.0.0
10
15
  */
11
16
  import { Database } from "bun:sqlite"
12
17
  import * as Config from "effect/Config"
13
18
  import * as Context from "effect/Context"
19
+ import * as Duration from "effect/Duration"
14
20
  import * as Effect from "effect/Effect"
15
21
  import * as Fiber from "effect/Fiber"
16
22
  import { identity } from "effect/Function"
@@ -25,6 +31,7 @@ import { classifySqliteError, SqlError } from "effect/unstable/sql/SqlError"
25
31
  import * as Statement from "effect/unstable/sql/Statement"
26
32
 
27
33
  const ATTR_DB_SYSTEM_NAME = "db.system.name"
34
+ const MAX_BUSY_TIMEOUT = 2_147_483_647
28
35
 
29
36
  const classifyError = (cause: unknown, message: string, operation: string) =>
30
37
  classifySqliteError(cause, { message, operation })
@@ -74,7 +81,7 @@ export interface SqliteClient extends Client.SqlClient {
74
81
  export const SqliteClient = Context.Service<SqliteClient>("@effect/sql-sqlite-bun/Client")
75
82
 
76
83
  /**
77
- * Configuration for a Bun SQLite client, including filename, open mode flags, WAL behavior, span attributes, and query/result name transforms.
84
+ * Configuration for a Bun SQLite client, including filename, open mode flags, WAL and busy timeout behavior, span attributes, and query/result name transforms.
78
85
  *
79
86
  * @category models
80
87
  * @since 4.0.0
@@ -85,6 +92,12 @@ export interface SqliteClientConfig {
85
92
  readonly create?: boolean | undefined
86
93
  readonly readwrite?: boolean | undefined
87
94
  readonly disableWAL?: boolean | undefined
95
+ /**
96
+ * How long SQLite waits when the database is busy. Defaults to 5 seconds.
97
+ * `Duration.infinity` is clamped to SQLite's maximum timeout.
98
+ * Waiting blocks the event loop because `bun:sqlite` is synchronous.
99
+ */
100
+ readonly busyTimeout?: Duration.Input | undefined
88
101
 
89
102
  readonly spanAttributes?: Record<string, unknown> | undefined
90
103
 
@@ -98,7 +111,7 @@ interface SqliteConnection extends Connection {
98
111
  }
99
112
 
100
113
  /**
101
- * Creates a scoped Bun SQLite client for a database file, enabling WAL by default and serializing access. Streaming queries are not implemented.
114
+ * Creates a scoped Bun SQLite client for a database file, enabling WAL and a 5-second busy timeout by default. Explicit transactions on writable connections take the write lock for their duration, even when they only read; clients opened with `readonly: true` are unaffected. Streaming queries are not implemented.
102
115
  *
103
116
  * @category constructors
104
117
  * @since 4.0.0
@@ -122,6 +135,11 @@ export const make = (
122
135
  create: readonly ? false : options.create ?? true
123
136
  } as any)
124
137
  yield* Effect.addFinalizer(() => Effect.sync(() => db.close()))
138
+ const busyTimeout = Math.min(
139
+ MAX_BUSY_TIMEOUT,
140
+ Math.max(0, Math.round(Duration.toMillis(options.busyTimeout ?? Duration.seconds(5))))
141
+ )
142
+ db.run(`PRAGMA busy_timeout = ${busyTimeout};`)
125
143
 
126
144
  if (options.disableWAL !== true && !readonly) {
127
145
  db.run("PRAGMA journal_mode = WAL;")
@@ -217,6 +235,7 @@ export const make = (
217
235
  acquirer,
218
236
  compiler,
219
237
  transactionAcquirer,
238
+ beginTransaction: "BEGIN IMMEDIATE",
220
239
  spanAttributes: [
221
240
  ...(options.spanAttributes ? Object.entries(options.spanAttributes) : []),
222
241
  [ATTR_DB_SYSTEM_NAME, "sqlite"]