@effect/sql-mysql2 4.0.0-beta.7 → 4.0.0-beta.71

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,44 +1,85 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * MySQL adapter for Effect SQL, backed by the `mysql2` driver.
3
+ *
4
+ * This module provides constructors and layers for a {@link MysqlClient} and
5
+ * the generic Effect SQL client service. Use it in server applications,
6
+ * background workers, migrations, and tests that need MySQL query compilation,
7
+ * scoped pool management, streaming queries, and consistent `SqlError`
8
+ * classification for mysql2 driver failures.
9
+ *
10
+ * **Mental model**
11
+ *
12
+ * {@link make} allocates a mysql2 pool inside the current scope, verifies it
13
+ * with `SELECT 1`, and closes it when the scope is released. Regular queries
14
+ * use the shared pool, transactions acquire a dedicated pooled connection for
15
+ * their lifetime, and streams stay tied to mysql2 stream resources until they
16
+ * are consumed or closed.
17
+ *
18
+ * **Common tasks**
19
+ *
20
+ * Use {@link layer} when configuration is already available, or
21
+ * {@link layerConfig} when it should be read through `Config`. Pass `url` for a
22
+ * connection URI, or pass `host`, `port`, `database`, `username`, and
23
+ * `password` for discrete connection settings. Use `poolConfig` for additional
24
+ * mysql2 pool options when configuring discrete fields.
25
+ *
26
+ * **Gotchas**
27
+ *
28
+ * When `url` is supplied it takes precedence over the discrete connection
29
+ * fields and does not merge in `poolConfig`. Long-running transactions and
30
+ * streams occupy pool capacity, so tune `maxConnections` and `connectionTTL`
31
+ * for those workloads.
32
+ *
33
+ * @since 4.0.0
3
34
  */
4
35
  import * as Config from "effect/Config";
36
+ import * as Context from "effect/Context";
5
37
  import * as Duration from "effect/Duration";
6
38
  import * as Effect from "effect/Effect";
7
39
  import * as Layer from "effect/Layer";
8
40
  import * as Redacted from "effect/Redacted";
9
41
  import type { Scope } from "effect/Scope";
10
- import * as ServiceMap from "effect/ServiceMap";
11
42
  import * as Reactivity from "effect/unstable/reactivity/Reactivity";
12
43
  import * as Client from "effect/unstable/sql/SqlClient";
13
44
  import { SqlError } from "effect/unstable/sql/SqlError";
14
45
  import * as Statement from "effect/unstable/sql/Statement";
15
46
  import * as Mysql from "mysql2";
16
47
  /**
17
- * @category type ids
18
- * @since 1.0.0
48
+ * Runtime type identifier used to mark `MysqlClient` values.
49
+ *
50
+ * @category type IDs
51
+ * @since 4.0.0
19
52
  */
20
53
  export declare const TypeId: TypeId;
21
54
  /**
22
- * @category type ids
23
- * @since 1.0.0
55
+ * Type-level identifier used to mark `MysqlClient` values.
56
+ *
57
+ * @category type IDs
58
+ * @since 4.0.0
24
59
  */
25
60
  export type TypeId = "~@effect/sql-mysql2/MysqlClient";
26
61
  /**
62
+ * mysql2-backed SQL client service, extending `SqlClient` with its runtime type marker and client configuration.
63
+ *
27
64
  * @category models
28
- * @since 1.0.0
65
+ * @since 4.0.0
29
66
  */
30
67
  export interface MysqlClient extends Client.SqlClient {
31
68
  readonly [TypeId]: TypeId;
32
69
  readonly config: MysqlClientConfig;
33
70
  }
34
71
  /**
72
+ * Context tag used to access the `MysqlClient` service.
73
+ *
35
74
  * @category tags
36
- * @since 1.0.0
75
+ * @since 4.0.0
37
76
  */
38
- export declare const MysqlClient: ServiceMap.Service<MysqlClient, MysqlClient>;
77
+ export declare const MysqlClient: Context.Service<MysqlClient, MysqlClient>;
39
78
  /**
79
+ * Configuration for a mysql2 client, including connection URI or connection fields, pool options, span attributes, and query/result name transforms.
80
+ *
40
81
  * @category models
41
- * @since 1.0.0
82
+ * @since 4.0.0
42
83
  */
43
84
  export interface MysqlClientConfig {
44
85
  /**
@@ -58,23 +99,31 @@ export interface MysqlClientConfig {
58
99
  readonly transformQueryNames?: ((str: string) => string) | undefined;
59
100
  }
60
101
  /**
102
+ * Creates a scoped MySQL client backed by a managed mysql2 pool, verifying connectivity and supporting streaming queries through mysql2 query streams.
103
+ *
61
104
  * @category constructors
62
- * @since 1.0.0
105
+ * @since 4.0.0
63
106
  */
64
107
  export declare const make: (options: MysqlClientConfig) => Effect.Effect<MysqlClient, SqlError, Scope | Reactivity.Reactivity>;
65
108
  /**
109
+ * Creates a layer from a `Config`-wrapped MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
110
+ *
66
111
  * @category layers
67
- * @since 1.0.0
112
+ * @since 4.0.0
68
113
  */
69
114
  export declare const layerConfig: (config: Config.Wrap<MysqlClientConfig>) => Layer.Layer<MysqlClient | Client.SqlClient, Config.ConfigError | SqlError>;
70
115
  /**
116
+ * Creates a layer from a concrete MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
117
+ *
71
118
  * @category layers
72
- * @since 1.0.0
119
+ * @since 4.0.0
73
120
  */
74
121
  export declare const layer: (config: MysqlClientConfig) => Layer.Layer<MysqlClient | Client.SqlClient, Config.ConfigError | SqlError>;
75
122
  /**
123
+ * Creates the MySQL statement compiler, using `?` placeholders and backtick-escaped identifiers.
124
+ *
76
125
  * @category compiler
77
- * @since 1.0.0
126
+ * @since 4.0.0
78
127
  */
79
128
  export declare const makeCompiler: (transform?: (_: string) => string) => Statement.Compiler;
80
129
  //# sourceMappingURL=MysqlClient.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MysqlClient.d.ts","sourceRoot":"","sources":["../src/MysqlClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MysqlClient.d.ts","sourceRoot":"","sources":["../src/MysqlClient.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,47 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * MySQL adapter for Effect SQL, backed by the `mysql2` driver.
3
+ *
4
+ * This module provides constructors and layers for a {@link MysqlClient} and
5
+ * the generic Effect SQL client service. Use it in server applications,
6
+ * background workers, migrations, and tests that need MySQL query compilation,
7
+ * scoped pool management, streaming queries, and consistent `SqlError`
8
+ * classification for mysql2 driver failures.
9
+ *
10
+ * **Mental model**
11
+ *
12
+ * {@link make} allocates a mysql2 pool inside the current scope, verifies it
13
+ * with `SELECT 1`, and closes it when the scope is released. Regular queries
14
+ * use the shared pool, transactions acquire a dedicated pooled connection for
15
+ * their lifetime, and streams stay tied to mysql2 stream resources until they
16
+ * are consumed or closed.
17
+ *
18
+ * **Common tasks**
19
+ *
20
+ * Use {@link layer} when configuration is already available, or
21
+ * {@link layerConfig} when it should be read through `Config`. Pass `url` for a
22
+ * connection URI, or pass `host`, `port`, `database`, `username`, and
23
+ * `password` for discrete connection settings. Use `poolConfig` for additional
24
+ * mysql2 pool options when configuring discrete fields.
25
+ *
26
+ * **Gotchas**
27
+ *
28
+ * When `url` is supplied it takes precedence over the discrete connection
29
+ * fields and does not merge in `poolConfig`. Long-running transactions and
30
+ * streams occupy pool capacity, so tune `maxConnections` and `connectionTTL`
31
+ * for those workloads.
32
+ *
33
+ * @since 4.0.0
3
34
  */
4
35
  import * as Config from "effect/Config";
36
+ import * as Context from "effect/Context";
5
37
  import * as Duration from "effect/Duration";
6
38
  import * as Effect from "effect/Effect";
7
39
  import * as Layer from "effect/Layer";
8
40
  import * as Redacted from "effect/Redacted";
9
- import * as ServiceMap from "effect/ServiceMap";
10
41
  import * as Stream from "effect/Stream";
11
42
  import * as Reactivity from "effect/unstable/reactivity/Reactivity";
12
43
  import * as Client from "effect/unstable/sql/SqlClient";
13
- import { SqlError } from "effect/unstable/sql/SqlError";
44
+ import { AuthenticationError, AuthorizationError, ConnectionError, ConstraintError, DeadlockError, LockTimeoutError, SqlError, SqlSyntaxError, StatementTimeoutError, UniqueViolation, UnknownError } from "effect/unstable/sql/SqlError";
14
45
  import { asyncPauseResume } from "effect/unstable/sql/SqlStream";
15
46
  import * as Statement from "effect/unstable/sql/Statement";
16
47
  import * as Mysql from "mysql2";
@@ -18,19 +49,109 @@ const ATTR_DB_SYSTEM_NAME = "db.system.name";
18
49
  const ATTR_DB_NAMESPACE = "db.namespace";
19
50
  const ATTR_SERVER_ADDRESS = "server.address";
20
51
  const ATTR_SERVER_PORT = "server.port";
52
+ const mysqlErrnoFromCause = cause => {
53
+ if (typeof cause !== "object" || cause === null || !("errno" in cause)) {
54
+ return undefined;
55
+ }
56
+ const errno = cause.errno;
57
+ return typeof errno === "number" ? errno : undefined;
58
+ };
59
+ const mysqlConnectionErrorCodes = /*#__PURE__*/new Set([1040, 1042, 1043, 1129, 1130, 1203]);
60
+ const mysqlAuthorizationErrorCodes = /*#__PURE__*/new Set([1044, 1142, 1143, 1227]);
61
+ const mysqlSyntaxErrorCodes = /*#__PURE__*/new Set([1054, 1064, 1146]);
62
+ const mysqlConstraintErrorCodes = /*#__PURE__*/new Set([1022, 1048, 1169, 1216, 1217, 1451, 1452, 1557]);
63
+ const UNKNOWN_CONSTRAINT = "unknown";
64
+ const normalizeConstraintIdentifier = identifier => {
65
+ if (typeof identifier !== "string") {
66
+ return UNKNOWN_CONSTRAINT;
67
+ }
68
+ const trimmed = identifier.trim();
69
+ return trimmed.length === 0 ? UNKNOWN_CONSTRAINT : trimmed;
70
+ };
71
+ const mysqlCauseProperty = (cause, property) => {
72
+ if (typeof cause !== "object" || cause === null || !(property in cause)) {
73
+ return undefined;
74
+ }
75
+ return cause[property];
76
+ };
77
+ const mysqlDuplicateEntryConstraintFromMessage = message => {
78
+ if (typeof message !== "string") {
79
+ return UNKNOWN_CONSTRAINT;
80
+ }
81
+ const match = /\bfor key\s+(?:'([^']*)'|\x60([^\x60]*)\x60|([^\s'\x60]+))/i.exec(message);
82
+ return match === null ? UNKNOWN_CONSTRAINT : normalizeConstraintIdentifier(match[1] ?? match[2] ?? match[3]);
83
+ };
84
+ const mysqlDuplicateEntryConstraintFromCause = cause => {
85
+ const constraint = normalizeConstraintIdentifier(mysqlCauseProperty(cause, "constraint"));
86
+ if (constraint !== UNKNOWN_CONSTRAINT) {
87
+ return constraint;
88
+ }
89
+ const sqlMessageConstraint = mysqlDuplicateEntryConstraintFromMessage(mysqlCauseProperty(cause, "sqlMessage"));
90
+ if (sqlMessageConstraint !== UNKNOWN_CONSTRAINT) {
91
+ return sqlMessageConstraint;
92
+ }
93
+ return mysqlDuplicateEntryConstraintFromMessage(mysqlCauseProperty(cause, "message"));
94
+ };
95
+ const classifyError = (cause, message, operation) => {
96
+ const props = {
97
+ cause,
98
+ message,
99
+ operation
100
+ };
101
+ const errno = mysqlErrnoFromCause(cause);
102
+ if (errno !== undefined) {
103
+ if (mysqlConnectionErrorCodes.has(errno)) {
104
+ return new ConnectionError(props);
105
+ }
106
+ if (errno === 1045) {
107
+ return new AuthenticationError(props);
108
+ }
109
+ if (mysqlAuthorizationErrorCodes.has(errno)) {
110
+ return new AuthorizationError(props);
111
+ }
112
+ if (mysqlSyntaxErrorCodes.has(errno)) {
113
+ return new SqlSyntaxError(props);
114
+ }
115
+ if (errno === 1062) {
116
+ return new UniqueViolation({
117
+ ...props,
118
+ constraint: mysqlDuplicateEntryConstraintFromCause(cause)
119
+ });
120
+ }
121
+ if (mysqlConstraintErrorCodes.has(errno)) {
122
+ return new ConstraintError(props);
123
+ }
124
+ if (errno === 1213) {
125
+ return new DeadlockError(props);
126
+ }
127
+ if (errno === 1205) {
128
+ return new LockTimeoutError(props);
129
+ }
130
+ if (errno === 3024) {
131
+ return new StatementTimeoutError(props);
132
+ }
133
+ }
134
+ return new UnknownError(props);
135
+ };
21
136
  /**
22
- * @category type ids
23
- * @since 1.0.0
137
+ * Runtime type identifier used to mark `MysqlClient` values.
138
+ *
139
+ * @category type IDs
140
+ * @since 4.0.0
24
141
  */
25
142
  export const TypeId = "~@effect/sql-mysql2/MysqlClient";
26
143
  /**
144
+ * Context tag used to access the `MysqlClient` service.
145
+ *
27
146
  * @category tags
28
- * @since 1.0.0
147
+ * @since 4.0.0
29
148
  */
30
- export const MysqlClient = /*#__PURE__*/ServiceMap.Service("@effect/sql-mysql2/MysqlClient");
149
+ export const MysqlClient = /*#__PURE__*/Context.Service("@effect/sql-mysql2/MysqlClient");
31
150
  /**
151
+ * Creates a scoped MySQL client backed by a managed mysql2 pool, verifying connectivity and supporting streaming queries through mysql2 query streams.
152
+ *
32
153
  * @category constructors
33
- * @since 1.0.0
154
+ * @since 4.0.0
34
155
  */
35
156
  export const make = options => Effect.gen(function* () {
36
157
  const compiler = makeCompiler(options.transformQueryNames);
@@ -42,7 +163,7 @@ export const make = options => Effect.gen(function* () {
42
163
  }
43
164
  runRaw(sql, values, rowsAsArray = false, method = "execute") {
44
165
  return Effect.callback(resume => {
45
- ;
166
+ const operation = method === "query" ? "executeUnprepared" : "execute";
46
167
  this.conn[method]({
47
168
  sql,
48
169
  values,
@@ -50,8 +171,7 @@ export const make = options => Effect.gen(function* () {
50
171
  }, (cause, results, _fields) => {
51
172
  if (cause) {
52
173
  resume(Effect.fail(new SqlError({
53
- cause,
54
- message: "Failed to execute statement"
174
+ reason: classifyError(cause, "Failed to execute statement", operation)
55
175
  })));
56
176
  } else {
57
177
  resume(Effect.succeed(results));
@@ -102,8 +222,7 @@ export const make = options => Effect.gen(function* () {
102
222
  pool.query("SELECT 1", cause => {
103
223
  if (cause) {
104
224
  resume(Effect.fail(new SqlError({
105
- cause,
106
- message: "MysqlClient: Failed to connect"
225
+ reason: classifyError(cause, "MysqlClient: Failed to connect", "connect")
107
226
  })));
108
227
  } else {
109
228
  resume(Effect.void);
@@ -113,9 +232,12 @@ export const make = options => Effect.gen(function* () {
113
232
  pool.end(() => resume(Effect.void));
114
233
  })).pipe(Effect.timeoutOrElse({
115
234
  duration: Duration.seconds(5),
116
- onTimeout: () => Effect.fail(new SqlError({
117
- message: "MysqlClient: Connection timeout",
118
- cause: new Error("connection timeout")
235
+ orElse: () => Effect.fail(new SqlError({
236
+ reason: new ConnectionError({
237
+ message: "MysqlClient: Connection timeout",
238
+ cause: new Error("connection timeout"),
239
+ operation: "connect"
240
+ })
119
241
  }))
120
242
  }));
121
243
  const poolConnection = new ConnectionImpl(pool);
@@ -123,8 +245,7 @@ export const make = options => Effect.gen(function* () {
123
245
  pool.getConnection((cause, conn) => {
124
246
  if (cause) {
125
247
  resume(Effect.fail(new SqlError({
126
- cause,
127
- message: "Failed to acquire connection"
248
+ reason: classifyError(cause, "Failed to acquire connection", "acquireConnection")
128
249
  })));
129
250
  } else {
130
251
  resume(Effect.succeed(conn));
@@ -148,18 +269,24 @@ export const make = options => Effect.gen(function* () {
148
269
  });
149
270
  });
150
271
  /**
272
+ * Creates a layer from a `Config`-wrapped MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
273
+ *
151
274
  * @category layers
152
- * @since 1.0.0
275
+ * @since 4.0.0
153
276
  */
154
- export const layerConfig = config => Layer.effectServices(Config.unwrap(config).asEffect().pipe(Effect.flatMap(make), Effect.map(client => ServiceMap.make(MysqlClient, client).pipe(ServiceMap.add(Client.SqlClient, client))))).pipe(Layer.provide(Reactivity.layer));
277
+ export const layerConfig = config => Layer.effectContext(Config.unwrap(config).pipe(Effect.flatMap(make), Effect.map(client => Context.make(MysqlClient, client).pipe(Context.add(Client.SqlClient, client))))).pipe(Layer.provide(Reactivity.layer));
155
278
  /**
279
+ * Creates a layer from a concrete MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
280
+ *
156
281
  * @category layers
157
- * @since 1.0.0
282
+ * @since 4.0.0
158
283
  */
159
- export const layer = config => Layer.effectServices(Effect.map(make(config), client => ServiceMap.make(MysqlClient, client).pipe(ServiceMap.add(Client.SqlClient, client)))).pipe(Layer.provide(Reactivity.layer));
284
+ export const layer = config => Layer.effectContext(Effect.map(make(config), client => Context.make(MysqlClient, client).pipe(Context.add(Client.SqlClient, client)))).pipe(Layer.provide(Reactivity.layer));
160
285
  /**
286
+ * Creates the MySQL statement compiler, using `?` placeholders and backtick-escaped identifiers.
287
+ *
161
288
  * @category compiler
162
- * @since 1.0.0
289
+ * @since 4.0.0
163
290
  */
164
291
  export const makeCompiler = transform => Statement.makeCompiler({
165
292
  dialect: "mysql",
@@ -184,8 +311,7 @@ function queryStream(conn, sql, params) {
184
311
  let buffer = [];
185
312
  let taskPending = false;
186
313
  query.on("error", cause => emit.fail(new SqlError({
187
- cause,
188
- message: "Failed to stream statement"
314
+ reason: classifyError(cause, "Failed to stream statement", "stream")
189
315
  })));
190
316
  query.on("data", row => {
191
317
  buffer.push(row);
@@ -1 +1 @@
1
- {"version":3,"file":"MysqlClient.js","names":["Config","Duration","Effect","Layer","Redacted","ServiceMap","Stream","Reactivity","Client","SqlError","asyncPauseResume","Statement","Mysql","ATTR_DB_SYSTEM_NAME","ATTR_DB_NAMESPACE","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","TypeId","MysqlClient","Service","make","options","gen","compiler","makeCompiler","transformQueryNames","transformRows","transformResultNames","defaultTransforms","array","undefined","ConnectionImpl","conn","constructor","runRaw","sql","values","rowsAsArray","method","callback","resume","cause","results","_fields","fail","message","succeed","run","pipe","map","Array","isArray","execute","params","executeRaw","executeValues","executeUnprepared","executeStream","stream","queryStream","mapArray","_","pool","url","createPool","uri","value","multipleStatements","supportBigNumbers","connectionLimit","maxConnections","idleTimeout","connectionTTL","toMillis","fromInputUnsafe","poolConfig","host","port","database","user","username","password","acquireRelease","query","void","end","timeoutOrElse","duration","seconds","onTimeout","Error","poolConnection","acquireConn","getConnection","sync","release","transactionAcquirer","spanAttributes","Object","entries","push","assign","acquirer","config","layerConfig","effectServices","unwrap","asEffect","flatMap","client","add","SqlClient","provide","layer","transform","dialect","placeholder","onIdentifier","withoutTransform","escape","onCustom","onRecordUpdate","defaultEscape","fnUntraced","emit","addFinalizer","destroy","buffer","taskPending","on","row","queueMicrotask","items","length","onPause","pause","onResume"],"sources":["../src/MysqlClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MysqlClient.js","names":["Config","Context","Duration","Effect","Layer","Redacted","Stream","Reactivity","Client","AuthenticationError","AuthorizationError","ConnectionError","ConstraintError","DeadlockError","LockTimeoutError","SqlError","SqlSyntaxError","StatementTimeoutError","UniqueViolation","UnknownError","asyncPauseResume","Statement","Mysql","ATTR_DB_SYSTEM_NAME","ATTR_DB_NAMESPACE","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","mysqlErrnoFromCause","cause","undefined","errno","mysqlConnectionErrorCodes","Set","mysqlAuthorizationErrorCodes","mysqlSyntaxErrorCodes","mysqlConstraintErrorCodes","UNKNOWN_CONSTRAINT","normalizeConstraintIdentifier","identifier","trimmed","trim","length","mysqlCauseProperty","property","mysqlDuplicateEntryConstraintFromMessage","message","match","exec","mysqlDuplicateEntryConstraintFromCause","constraint","sqlMessageConstraint","classifyError","operation","props","has","TypeId","MysqlClient","Service","make","options","gen","compiler","makeCompiler","transformQueryNames","transformRows","transformResultNames","defaultTransforms","array","ConnectionImpl","conn","constructor","runRaw","sql","values","rowsAsArray","method","callback","resume","results","_fields","fail","reason","succeed","run","pipe","map","Array","isArray","execute","params","executeRaw","executeValues","executeUnprepared","executeStream","stream","queryStream","mapArray","_","pool","url","createPool","uri","value","multipleStatements","supportBigNumbers","connectionLimit","maxConnections","idleTimeout","connectionTTL","toMillis","fromInputUnsafe","poolConfig","host","port","database","user","username","password","acquireRelease","query","void","end","timeoutOrElse","duration","seconds","orElse","Error","poolConnection","acquireConn","getConnection","sync","release","transactionAcquirer","spanAttributes","Object","entries","push","assign","acquirer","config","layerConfig","effectContext","unwrap","flatMap","client","add","SqlClient","provide","layer","transform","dialect","placeholder","onIdentifier","withoutTransform","escape","onCustom","onRecordUpdate","defaultEscape","fnUntraced","emit","addFinalizer","destroy","buffer","taskPending","on","row","queueMicrotask","items","onPause","pause","onResume"],"sources":["../src/MysqlClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,35 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * MySQL adapter for the shared Effect SQL migration runner.
3
+ *
4
+ * This module re-exports the shared `Migrator` loaders and error types, then
5
+ * provides `run` and `layer` helpers that apply ordered migrations through the
6
+ * current mysql2-backed `SqlClient`. Use it during application startup,
7
+ * deployment, or integration tests when MySQL schema changes must be applied
8
+ * before dependent services start reading or writing data.
9
+ *
10
+ * **Mental model**
11
+ *
12
+ * Migrations are loaded with the shared `<id>_<name>` convention and recorded in
13
+ * `effect_sql_migrations` by default. The runner reads the latest recorded id
14
+ * and applies only migrations with larger ids, returning the ids and names that
15
+ * were applied in the current run.
16
+ *
17
+ * **Common tasks**
18
+ *
19
+ * - Call `run` when an effect should explicitly migrate a MySQL database.
20
+ * - Use `layer` when schema setup should happen while building a layer graph.
21
+ * - Reuse the shared `Migrator` loaders from this module for file-based or
22
+ * in-memory migration definitions.
23
+ *
24
+ * **Gotchas**
25
+ *
26
+ * MySQL DDL can cause implicit commits, and this adapter relies on migration
27
+ * table constraints to detect concurrent runners. Coordinate startup runners and
28
+ * write migrations to tolerate MySQL's transactional semantics. Schema dump
29
+ * support is not enabled in this adapter, so `schemaDirectory` does not emit a
30
+ * MySQL dump.
31
+ *
32
+ * @since 4.0.0
3
33
  */
4
34
  import type * as Effect from "effect/Effect";
5
35
  import * as Layer from "effect/Layer";
@@ -7,17 +37,21 @@ import * as Migrator from "effect/unstable/sql/Migrator";
7
37
  import type * as Client from "effect/unstable/sql/SqlClient";
8
38
  import type { SqlError } from "effect/unstable/sql/SqlError";
9
39
  /**
10
- * @since 1.0.0
40
+ * @since 4.0.0
11
41
  */
12
42
  export * from "effect/unstable/sql/Migrator";
13
43
  /**
14
- * @category constructor
15
- * @since 1.0.0
44
+ * Runs SQL migrations using the configured `SqlClient`, returning the migrations that were applied.
45
+ *
46
+ * @category constructors
47
+ * @since 4.0.0
16
48
  */
17
49
  export declare const run: <R2 = never>({ loader, schemaDirectory, table }: Migrator.MigratorOptions<R2>) => Effect.Effect<ReadonlyArray<readonly [id: number, name: string]>, Migrator.MigrationError | SqlError, Client.SqlClient | R2>;
18
50
  /**
51
+ * Creates a layer that runs the configured SQL migrations during layer construction.
52
+ *
19
53
  * @category layers
20
- * @since 1.0.0
54
+ * @since 4.0.0
21
55
  */
22
56
  export declare const layer: <R>(options: Migrator.MigratorOptions<R>) => Layer.Layer<never, Migrator.MigrationError | SqlError, Client.SqlClient | R>;
23
57
  //# sourceMappingURL=MysqlMigrator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MysqlMigrator.d.ts","sourceRoot":"","sources":["../src/MysqlMigrator.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,8BAA8B,CAAA;AACxD,OAAO,KAAK,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAE5D;;GAEG;AACH,cAAc,8BAA8B,CAAA;AAE5C;;;GAGG;AACH,eAAO,MAAM,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,EAC3B,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAC7D,MAAM,CAAC,MAAM,CAChB,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAClD,QAAQ,CAAC,cAAc,GAAG,QAAQ,EAClC,MAAM,CAAC,SAAS,GAAG,EAAE,CAsDrB,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,KAAK,GAAI,CAAC,EACrB,SAAS,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,KACnC,KAAK,CAAC,KAAK,CACZ,KAAK,EACL,QAAQ,CAAC,cAAc,GAAG,QAAQ,EAClC,MAAM,CAAC,SAAS,GAAG,CAAC,CACgB,CAAA"}
1
+ {"version":3,"file":"MysqlMigrator.d.ts","sourceRoot":"","sources":["../src/MysqlMigrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,8BAA8B,CAAA;AACxD,OAAO,KAAK,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAE5D;;GAEG;AACH,cAAc,8BAA8B,CAAA;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,EAC3B,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAC7D,MAAM,CAAC,MAAM,CAChB,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAClD,QAAQ,CAAC,cAAc,GAAG,QAAQ,EAClC,MAAM,CAAC,SAAS,GAAG,EAAE,CAsDrB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAAI,CAAC,EACrB,SAAS,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,KACnC,KAAK,CAAC,KAAK,CACZ,KAAK,EACL,QAAQ,CAAC,cAAc,GAAG,QAAQ,EAClC,MAAM,CAAC,SAAS,GAAG,CAAC,CACgB,CAAA"}
@@ -1,12 +1,14 @@
1
1
  import * as Layer from "effect/Layer";
2
2
  import * as Migrator from "effect/unstable/sql/Migrator";
3
3
  /**
4
- * @since 1.0.0
4
+ * @since 4.0.0
5
5
  */
6
6
  export * from "effect/unstable/sql/Migrator";
7
7
  /**
8
- * @category constructor
9
- * @since 1.0.0
8
+ * Runs SQL migrations using the configured `SqlClient`, returning the migrations that were applied.
9
+ *
10
+ * @category constructors
11
+ * @since 4.0.0
10
12
  */
11
13
  export const run = /*#__PURE__*/Migrator.make({
12
14
  // TODO: re-add when Command module is available
@@ -63,8 +65,10 @@ export const run = /*#__PURE__*/Migrator.make({
63
65
  // }
64
66
  });
65
67
  /**
68
+ * Creates a layer that runs the configured SQL migrations during layer construction.
69
+ *
66
70
  * @category layers
67
- * @since 1.0.0
71
+ * @since 4.0.0
68
72
  */
69
73
  export const layer = options => Layer.effectDiscard(run(options));
70
74
  //# sourceMappingURL=MysqlMigrator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MysqlMigrator.js","names":["Layer","Migrator","run","make","layer","options","effectDiscard"],"sources":["../src/MysqlMigrator.ts"],"sourcesContent":[null],"mappings":"AAIA,OAAO,KAAKA,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,QAAQ,MAAM,8BAA8B;AAIxD;;;AAGA,cAAc,8BAA8B;AAE5C;;;;AAIA,OAAO,MAAMC,GAAG,gBAMZD,QAAQ,CAACE,IAAI,CAAC;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA,CACD,CAAC;AAEF;;;;AAIA,OAAO,MAAMC,KAAK,GAChBC,OAAoC,IAKjCL,KAAK,CAACM,aAAa,CAACJ,GAAG,CAACG,OAAO,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"MysqlMigrator.js","names":["Layer","Migrator","run","make","layer","options","effectDiscard"],"sources":["../src/MysqlMigrator.ts"],"sourcesContent":[null],"mappings":"AAkCA,OAAO,KAAKA,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,QAAQ,MAAM,8BAA8B;AAIxD;;;AAGA,cAAc,8BAA8B;AAE5C;;;;;;AAMA,OAAO,MAAMC,GAAG,gBAMZD,QAAQ,CAACE,IAAI,CAAC;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA,CACD,CAAC;AAEF;;;;;;AAMA,OAAO,MAAMC,KAAK,GAChBC,OAAoC,IAKjCL,KAAK,CAACM,aAAa,CAACJ,GAAG,CAACG,OAAO,CAAC,CAAC","ignoreList":[]}
package/dist/index.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * @since 4.0.0
3
3
  */
4
4
  /**
5
- * @since 1.0.0
5
+ * @since 4.0.0
6
6
  */
7
7
  export * as MysqlClient from "./MysqlClient.ts";
8
8
  /**
9
- * @since 1.0.0
9
+ * @since 4.0.0
10
10
  */
11
11
  export * as MysqlMigrator from "./MysqlMigrator.ts";
12
12
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,13 +1,13 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * @since 4.0.0
3
3
  */
4
4
  // @barrel: Auto-generated exports. Do not edit manually.
5
5
  /**
6
- * @since 1.0.0
6
+ * @since 4.0.0
7
7
  */
8
8
  export * as MysqlClient from "./MysqlClient.js";
9
9
  /**
10
- * @since 1.0.0
10
+ * @since 4.0.0
11
11
  */
12
12
  export * as MysqlMigrator from "./MysqlMigrator.js";
13
13
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect/sql-mysql2",
3
- "version": "4.0.0-beta.7",
3
+ "version": "4.0.0-beta.71",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "A MySQL toolkit for Effect",
@@ -43,14 +43,14 @@
43
43
  "provenance": true
44
44
  },
45
45
  "devDependencies": {
46
- "@testcontainers/mysql": "^11.11.0",
47
- "effect": "^4.0.0-beta.7"
46
+ "@testcontainers/mysql": "^11.14.0",
47
+ "effect": "^4.0.0-beta.71"
48
48
  },
49
49
  "peerDependencies": {
50
- "effect": "^4.0.0-beta.7"
50
+ "effect": "^4.0.0-beta.71"
51
51
  },
52
52
  "dependencies": {
53
- "mysql2": "^3.16.2"
53
+ "mysql2": "^3.22.3"
54
54
  },
55
55
  "scripts": {
56
56
  "codegen": "effect-utils codegen",
@@ -1,18 +1,61 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * MySQL adapter for Effect SQL, backed by the `mysql2` driver.
3
+ *
4
+ * This module provides constructors and layers for a {@link MysqlClient} and
5
+ * the generic Effect SQL client service. Use it in server applications,
6
+ * background workers, migrations, and tests that need MySQL query compilation,
7
+ * scoped pool management, streaming queries, and consistent `SqlError`
8
+ * classification for mysql2 driver failures.
9
+ *
10
+ * **Mental model**
11
+ *
12
+ * {@link make} allocates a mysql2 pool inside the current scope, verifies it
13
+ * with `SELECT 1`, and closes it when the scope is released. Regular queries
14
+ * use the shared pool, transactions acquire a dedicated pooled connection for
15
+ * their lifetime, and streams stay tied to mysql2 stream resources until they
16
+ * are consumed or closed.
17
+ *
18
+ * **Common tasks**
19
+ *
20
+ * Use {@link layer} when configuration is already available, or
21
+ * {@link layerConfig} when it should be read through `Config`. Pass `url` for a
22
+ * connection URI, or pass `host`, `port`, `database`, `username`, and
23
+ * `password` for discrete connection settings. Use `poolConfig` for additional
24
+ * mysql2 pool options when configuring discrete fields.
25
+ *
26
+ * **Gotchas**
27
+ *
28
+ * When `url` is supplied it takes precedence over the discrete connection
29
+ * fields and does not merge in `poolConfig`. Long-running transactions and
30
+ * streams occupy pool capacity, so tune `maxConnections` and `connectionTTL`
31
+ * for those workloads.
32
+ *
33
+ * @since 4.0.0
3
34
  */
4
35
  import * as Config from "effect/Config"
36
+ import * as Context from "effect/Context"
5
37
  import * as Duration from "effect/Duration"
6
38
  import * as Effect from "effect/Effect"
7
39
  import * as Layer from "effect/Layer"
8
40
  import * as Redacted from "effect/Redacted"
9
41
  import type { Scope } from "effect/Scope"
10
- import * as ServiceMap from "effect/ServiceMap"
11
42
  import * as Stream from "effect/Stream"
12
43
  import * as Reactivity from "effect/unstable/reactivity/Reactivity"
13
44
  import * as Client from "effect/unstable/sql/SqlClient"
14
45
  import type { Connection } from "effect/unstable/sql/SqlConnection"
15
- import { SqlError } from "effect/unstable/sql/SqlError"
46
+ import {
47
+ AuthenticationError,
48
+ AuthorizationError,
49
+ ConnectionError,
50
+ ConstraintError,
51
+ DeadlockError,
52
+ LockTimeoutError,
53
+ SqlError,
54
+ SqlSyntaxError,
55
+ StatementTimeoutError,
56
+ UniqueViolation,
57
+ UnknownError
58
+ } from "effect/unstable/sql/SqlError"
16
59
  import { asyncPauseResume } from "effect/unstable/sql/SqlStream"
17
60
  import * as Statement from "effect/unstable/sql/Statement"
18
61
  import * as Mysql from "mysql2"
@@ -22,21 +65,118 @@ const ATTR_DB_NAMESPACE = "db.namespace"
22
65
  const ATTR_SERVER_ADDRESS = "server.address"
23
66
  const ATTR_SERVER_PORT = "server.port"
24
67
 
68
+ const mysqlErrnoFromCause = (cause: unknown): number | undefined => {
69
+ if (typeof cause !== "object" || cause === null || !("errno" in cause)) {
70
+ return undefined
71
+ }
72
+ const errno = cause.errno
73
+ return typeof errno === "number" ? errno : undefined
74
+ }
75
+
76
+ const mysqlConnectionErrorCodes = new Set([1040, 1042, 1043, 1129, 1130, 1203])
77
+ const mysqlAuthorizationErrorCodes = new Set([1044, 1142, 1143, 1227])
78
+ const mysqlSyntaxErrorCodes = new Set([1054, 1064, 1146])
79
+ const mysqlConstraintErrorCodes = new Set([1022, 1048, 1169, 1216, 1217, 1451, 1452, 1557])
80
+
81
+ const UNKNOWN_CONSTRAINT = "unknown"
82
+
83
+ const normalizeConstraintIdentifier = (identifier: unknown): string => {
84
+ if (typeof identifier !== "string") {
85
+ return UNKNOWN_CONSTRAINT
86
+ }
87
+ const trimmed = identifier.trim()
88
+ return trimmed.length === 0 ? UNKNOWN_CONSTRAINT : trimmed
89
+ }
90
+
91
+ const mysqlCauseProperty = (cause: unknown, property: "constraint" | "message" | "sqlMessage"): unknown => {
92
+ if (typeof cause !== "object" || cause === null || !(property in cause)) {
93
+ return undefined
94
+ }
95
+ return (cause as Record<string, unknown>)[property]
96
+ }
97
+
98
+ const mysqlDuplicateEntryConstraintFromMessage = (message: unknown): string => {
99
+ if (typeof message !== "string") {
100
+ return UNKNOWN_CONSTRAINT
101
+ }
102
+ const match = /\bfor key\s+(?:'([^']*)'|\x60([^\x60]*)\x60|([^\s'\x60]+))/i.exec(message)
103
+ return match === null ?
104
+ UNKNOWN_CONSTRAINT :
105
+ normalizeConstraintIdentifier(match[1] ?? match[2] ?? match[3])
106
+ }
107
+
108
+ const mysqlDuplicateEntryConstraintFromCause = (cause: unknown): string => {
109
+ const constraint = normalizeConstraintIdentifier(mysqlCauseProperty(cause, "constraint"))
110
+ if (constraint !== UNKNOWN_CONSTRAINT) {
111
+ return constraint
112
+ }
113
+ const sqlMessageConstraint = mysqlDuplicateEntryConstraintFromMessage(mysqlCauseProperty(cause, "sqlMessage"))
114
+ if (sqlMessageConstraint !== UNKNOWN_CONSTRAINT) {
115
+ return sqlMessageConstraint
116
+ }
117
+ return mysqlDuplicateEntryConstraintFromMessage(mysqlCauseProperty(cause, "message"))
118
+ }
119
+
120
+ const classifyError = (
121
+ cause: unknown,
122
+ message: string,
123
+ operation: string
124
+ ) => {
125
+ const props = { cause, message, operation }
126
+ const errno = mysqlErrnoFromCause(cause)
127
+ if (errno !== undefined) {
128
+ if (mysqlConnectionErrorCodes.has(errno)) {
129
+ return new ConnectionError(props)
130
+ }
131
+ if (errno === 1045) {
132
+ return new AuthenticationError(props)
133
+ }
134
+ if (mysqlAuthorizationErrorCodes.has(errno)) {
135
+ return new AuthorizationError(props)
136
+ }
137
+ if (mysqlSyntaxErrorCodes.has(errno)) {
138
+ return new SqlSyntaxError(props)
139
+ }
140
+ if (errno === 1062) {
141
+ return new UniqueViolation({ ...props, constraint: mysqlDuplicateEntryConstraintFromCause(cause) })
142
+ }
143
+ if (mysqlConstraintErrorCodes.has(errno)) {
144
+ return new ConstraintError(props)
145
+ }
146
+ if (errno === 1213) {
147
+ return new DeadlockError(props)
148
+ }
149
+ if (errno === 1205) {
150
+ return new LockTimeoutError(props)
151
+ }
152
+ if (errno === 3024) {
153
+ return new StatementTimeoutError(props)
154
+ }
155
+ }
156
+ return new UnknownError(props)
157
+ }
158
+
25
159
  /**
26
- * @category type ids
27
- * @since 1.0.0
160
+ * Runtime type identifier used to mark `MysqlClient` values.
161
+ *
162
+ * @category type IDs
163
+ * @since 4.0.0
28
164
  */
29
165
  export const TypeId: TypeId = "~@effect/sql-mysql2/MysqlClient"
30
166
 
31
167
  /**
32
- * @category type ids
33
- * @since 1.0.0
168
+ * Type-level identifier used to mark `MysqlClient` values.
169
+ *
170
+ * @category type IDs
171
+ * @since 4.0.0
34
172
  */
35
173
  export type TypeId = "~@effect/sql-mysql2/MysqlClient"
36
174
 
37
175
  /**
176
+ * mysql2-backed SQL client service, extending `SqlClient` with its runtime type marker and client configuration.
177
+ *
38
178
  * @category models
39
- * @since 1.0.0
179
+ * @since 4.0.0
40
180
  */
41
181
  export interface MysqlClient extends Client.SqlClient {
42
182
  readonly [TypeId]: TypeId
@@ -44,14 +184,18 @@ export interface MysqlClient extends Client.SqlClient {
44
184
  }
45
185
 
46
186
  /**
187
+ * Context tag used to access the `MysqlClient` service.
188
+ *
47
189
  * @category tags
48
- * @since 1.0.0
190
+ * @since 4.0.0
49
191
  */
50
- export const MysqlClient = ServiceMap.Service<MysqlClient>("@effect/sql-mysql2/MysqlClient")
192
+ export const MysqlClient = Context.Service<MysqlClient>("@effect/sql-mysql2/MysqlClient")
51
193
 
52
194
  /**
195
+ * Configuration for a mysql2 client, including connection URI or connection fields, pool options, span attributes, and query/result name transforms.
196
+ *
53
197
  * @category models
54
- * @since 1.0.0
198
+ * @since 4.0.0
55
199
  */
56
200
  export interface MysqlClientConfig {
57
201
  /**
@@ -77,8 +221,10 @@ export interface MysqlClientConfig {
77
221
  }
78
222
 
79
223
  /**
224
+ * Creates a scoped MySQL client backed by a managed mysql2 pool, verifying connectivity and supporting streaming queries through mysql2 query streams.
225
+ *
80
226
  * @category constructors
81
- * @since 1.0.0
227
+ * @since 4.0.0
82
228
  */
83
229
  export const make = (
84
230
  options: MysqlClientConfig
@@ -104,13 +250,16 @@ export const make = (
104
250
  method: "execute" | "query" = "execute"
105
251
  ) {
106
252
  return Effect.callback<unknown, SqlError>((resume) => {
253
+ const operation = method === "query" ? "executeUnprepared" : "execute"
107
254
  ;(this.conn as any)[method]({
108
255
  sql,
109
256
  values,
110
257
  rowsAsArray
111
258
  }, (cause: unknown | null, results: unknown, _fields: any) => {
112
259
  if (cause) {
113
- resume(Effect.fail(new SqlError({ cause, message: "Failed to execute statement" })))
260
+ resume(
261
+ Effect.fail(new SqlError({ reason: classifyError(cause, "Failed to execute statement", operation) }))
262
+ )
114
263
  } else {
115
264
  resume(Effect.succeed(results))
116
265
  }
@@ -198,8 +347,7 @@ export const make = (
198
347
  if (cause) {
199
348
  resume(Effect.fail(
200
349
  new SqlError({
201
- cause,
202
- message: "MysqlClient: Failed to connect"
350
+ reason: classifyError(cause, "MysqlClient: Failed to connect", "connect")
203
351
  })
204
352
  ))
205
353
  } else {
@@ -214,11 +362,14 @@ export const make = (
214
362
  ).pipe(
215
363
  Effect.timeoutOrElse({
216
364
  duration: Duration.seconds(5),
217
- onTimeout: () =>
365
+ orElse: () =>
218
366
  Effect.fail(
219
367
  new SqlError({
220
- message: "MysqlClient: Connection timeout",
221
- cause: new Error("connection timeout")
368
+ reason: new ConnectionError({
369
+ message: "MysqlClient: Connection timeout",
370
+ cause: new Error("connection timeout"),
371
+ operation: "connect"
372
+ })
222
373
  })
223
374
  )
224
375
  })
@@ -230,7 +381,13 @@ export const make = (
230
381
  Effect.callback<Mysql.PoolConnection, SqlError>((resume) => {
231
382
  pool.getConnection((cause, conn) => {
232
383
  if (cause) {
233
- resume(Effect.fail(new SqlError({ cause, message: "Failed to acquire connection" })))
384
+ resume(
385
+ Effect.fail(
386
+ new SqlError({
387
+ reason: classifyError(cause, "Failed to acquire connection", "acquireConnection")
388
+ })
389
+ )
390
+ )
234
391
  } else {
235
392
  resume(Effect.succeed(conn))
236
393
  }
@@ -268,40 +425,46 @@ export const make = (
268
425
  })
269
426
 
270
427
  /**
428
+ * Creates a layer from a `Config`-wrapped MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
429
+ *
271
430
  * @category layers
272
- * @since 1.0.0
431
+ * @since 4.0.0
273
432
  */
274
433
  export const layerConfig = (
275
434
  config: Config.Wrap<MysqlClientConfig>
276
435
  ): Layer.Layer<MysqlClient | Client.SqlClient, Config.ConfigError | SqlError> =>
277
- Layer.effectServices(
278
- Config.unwrap(config).asEffect().pipe(
436
+ Layer.effectContext(
437
+ Config.unwrap(config).pipe(
279
438
  Effect.flatMap(make),
280
439
  Effect.map((client) =>
281
- ServiceMap.make(MysqlClient, client).pipe(
282
- ServiceMap.add(Client.SqlClient, client)
440
+ Context.make(MysqlClient, client).pipe(
441
+ Context.add(Client.SqlClient, client)
283
442
  )
284
443
  )
285
444
  )
286
445
  ).pipe(Layer.provide(Reactivity.layer))
287
446
 
288
447
  /**
448
+ * Creates a layer from a concrete MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
449
+ *
289
450
  * @category layers
290
- * @since 1.0.0
451
+ * @since 4.0.0
291
452
  */
292
453
  export const layer = (
293
454
  config: MysqlClientConfig
294
455
  ): Layer.Layer<MysqlClient | Client.SqlClient, Config.ConfigError | SqlError> =>
295
- Layer.effectServices(
456
+ Layer.effectContext(
296
457
  Effect.map(make(config), (client) =>
297
- ServiceMap.make(MysqlClient, client).pipe(
298
- ServiceMap.add(Client.SqlClient, client)
458
+ Context.make(MysqlClient, client).pipe(
459
+ Context.add(Client.SqlClient, client)
299
460
  ))
300
461
  ).pipe(Layer.provide(Reactivity.layer))
301
462
 
302
463
  /**
464
+ * Creates the MySQL statement compiler, using `?` placeholders and backtick-escaped identifiers.
465
+ *
303
466
  * @category compiler
304
- * @since 1.0.0
467
+ * @since 4.0.0
305
468
  */
306
469
  export const makeCompiler = (transform?: (_: string) => string) =>
307
470
  Statement.makeCompiler({
@@ -331,11 +494,15 @@ function queryStream(
331
494
  ) {
332
495
  return asyncPauseResume<any, SqlError>(Effect.fnUntraced(function*(emit) {
333
496
  const query = (conn as any).query(sql, params).stream()
334
- yield* Effect.addFinalizer(() => Effect.sync(() => query.destroy()))
497
+ yield* Effect.addFinalizer(() => Effect.sync(() => query.destroy() as void))
335
498
 
336
499
  let buffer: Array<any> = []
337
500
  let taskPending = false
338
- query.on("error", (cause: unknown) => emit.fail(new SqlError({ cause, message: "Failed to stream statement" })))
501
+ query.on(
502
+ "error",
503
+ (cause: unknown) =>
504
+ emit.fail(new SqlError({ reason: classifyError(cause, "Failed to stream statement", "stream") }))
505
+ )
339
506
  query.on("data", (row: any) => {
340
507
  buffer.push(row)
341
508
  if (!taskPending) {
@@ -1,5 +1,35 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * MySQL adapter for the shared Effect SQL migration runner.
3
+ *
4
+ * This module re-exports the shared `Migrator` loaders and error types, then
5
+ * provides `run` and `layer` helpers that apply ordered migrations through the
6
+ * current mysql2-backed `SqlClient`. Use it during application startup,
7
+ * deployment, or integration tests when MySQL schema changes must be applied
8
+ * before dependent services start reading or writing data.
9
+ *
10
+ * **Mental model**
11
+ *
12
+ * Migrations are loaded with the shared `<id>_<name>` convention and recorded in
13
+ * `effect_sql_migrations` by default. The runner reads the latest recorded id
14
+ * and applies only migrations with larger ids, returning the ids and names that
15
+ * were applied in the current run.
16
+ *
17
+ * **Common tasks**
18
+ *
19
+ * - Call `run` when an effect should explicitly migrate a MySQL database.
20
+ * - Use `layer` when schema setup should happen while building a layer graph.
21
+ * - Reuse the shared `Migrator` loaders from this module for file-based or
22
+ * in-memory migration definitions.
23
+ *
24
+ * **Gotchas**
25
+ *
26
+ * MySQL DDL can cause implicit commits, and this adapter relies on migration
27
+ * table constraints to detect concurrent runners. Coordinate startup runners and
28
+ * write migrations to tolerate MySQL's transactional semantics. Schema dump
29
+ * support is not enabled in this adapter, so `schemaDirectory` does not emit a
30
+ * MySQL dump.
31
+ *
32
+ * @since 4.0.0
3
33
  */
4
34
  import type * as Effect from "effect/Effect"
5
35
  import * as Layer from "effect/Layer"
@@ -8,13 +38,15 @@ import type * as Client from "effect/unstable/sql/SqlClient"
8
38
  import type { SqlError } from "effect/unstable/sql/SqlError"
9
39
 
10
40
  /**
11
- * @since 1.0.0
41
+ * @since 4.0.0
12
42
  */
13
43
  export * from "effect/unstable/sql/Migrator"
14
44
 
15
45
  /**
16
- * @category constructor
17
- * @since 1.0.0
46
+ * Runs SQL migrations using the configured `SqlClient`, returning the migrations that were applied.
47
+ *
48
+ * @category constructors
49
+ * @since 4.0.0
18
50
  */
19
51
  export const run: <R2 = never>(
20
52
  { loader, schemaDirectory, table }: Migrator.MigratorOptions<R2>
@@ -78,8 +110,10 @@ export const run: <R2 = never>(
78
110
  })
79
111
 
80
112
  /**
113
+ * Creates a layer that runs the configured SQL migrations during layer construction.
114
+ *
81
115
  * @category layers
82
- * @since 1.0.0
116
+ * @since 4.0.0
83
117
  */
84
118
  export const layer = <R>(
85
119
  options: Migrator.MigratorOptions<R>
package/src/index.ts CHANGED
@@ -1,15 +1,15 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * @since 4.0.0
3
3
  */
4
4
 
5
5
  // @barrel: Auto-generated exports. Do not edit manually.
6
6
 
7
7
  /**
8
- * @since 1.0.0
8
+ * @since 4.0.0
9
9
  */
10
10
  export * as MysqlClient from "./MysqlClient.ts"
11
11
 
12
12
  /**
13
- * @since 1.0.0
13
+ * @since 4.0.0
14
14
  */
15
15
  export * as MysqlMigrator from "./MysqlMigrator.ts"