@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.
- package/dist/SqliteClient.d.ts +9 -2
- package/dist/SqliteClient.d.ts.map +1 -1
- package/dist/SqliteClient.js +13 -3
- package/dist/SqliteClient.js.map +1 -1
- package/package.json +4 -4
- package/src/SqliteClient.ts +23 -4
package/dist/SqliteClient.d.ts
CHANGED
|
@@ -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
|
|
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":"
|
|
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"}
|
package/dist/SqliteClient.js
CHANGED
|
@@ -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
|
|
7
|
-
*
|
|
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
|
|
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
|
}), {
|
package/dist/SqliteClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteClient.js","names":[],"sources":["../src/SqliteClient.ts"],"sourcesContent":[null],"mappings":"AAAA
|
|
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.
|
|
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.
|
|
52
|
-
"effect": "^4.0.0-beta.
|
|
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.
|
|
55
|
+
"effect": "^4.0.0-beta.107"
|
|
56
56
|
},
|
|
57
57
|
"scripts": {
|
|
58
58
|
"codegen": "effect-utils codegen",
|
package/src/SqliteClient.ts
CHANGED
|
@@ -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
|
|
7
|
-
*
|
|
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
|
|
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"]
|