@yielded/auth-persistence-drizzle 0.1.0-beta.1 → 0.1.0-beta.13

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.
Files changed (228) hide show
  1. package/dist/D1.d.mts +23 -18
  2. package/dist/D1.mjs +10 -4
  3. package/dist/D1.mjs.map +1 -1
  4. package/dist/Libsql.d.mts +58 -53
  5. package/dist/Libsql.mjs +20 -15
  6. package/dist/Libsql.mjs.map +1 -1
  7. package/dist/Mysql2.d.mts +58 -46
  8. package/dist/Mysql2.mjs +13 -6
  9. package/dist/Mysql2.mjs.map +1 -1
  10. package/dist/Pglite.d.mts +52 -41
  11. package/dist/Pglite.mjs +12 -7
  12. package/dist/Pglite.mjs.map +1 -1
  13. package/dist/Postgres.d.mts +59 -48
  14. package/dist/Postgres.mjs +12 -7
  15. package/dist/Postgres.mjs.map +1 -1
  16. package/dist/SqliteBun.d.mts +67 -62
  17. package/dist/SqliteBun.mjs +20 -14
  18. package/dist/SqliteBun.mjs.map +1 -1
  19. package/dist/SqliteDo.d.mts +58 -52
  20. package/dist/SqliteDo.mjs +26 -14
  21. package/dist/SqliteDo.mjs.map +1 -1
  22. package/dist/SqliteNode.d.mts +58 -53
  23. package/dist/SqliteNode.mjs +20 -14
  24. package/dist/SqliteNode.mjs.map +1 -1
  25. package/dist/SqliteWasm.d.mts +58 -53
  26. package/dist/SqliteWasm.mjs +20 -14
  27. package/dist/SqliteWasm.mjs.map +1 -1
  28. package/dist/drizzle/d1-database.d.mts +11 -0
  29. package/dist/drizzle/d1-database.mjs +8 -0
  30. package/dist/drizzle/d1-database.mjs.map +1 -0
  31. package/dist/drizzle/d1-emails.d.mts +8 -7
  32. package/dist/drizzle/d1-emails.mjs +7 -4
  33. package/dist/drizzle/d1-emails.mjs.map +1 -1
  34. package/dist/drizzle/d1-identity.mjs +12 -9
  35. package/dist/drizzle/d1-identity.mjs.map +1 -1
  36. package/dist/drizzle/d1-oauth.d.mts +10 -9
  37. package/dist/drizzle/d1-oauth.mjs +7 -4
  38. package/dist/drizzle/d1-oauth.mjs.map +1 -1
  39. package/dist/drizzle/d1-passkey.d.mts +3 -14
  40. package/dist/drizzle/d1-passkey.mjs +2 -1
  41. package/dist/drizzle/d1-passkey.mjs.map +1 -1
  42. package/dist/drizzle/d1-password-prepared.d.mts +4 -3
  43. package/dist/drizzle/d1-password-prepared.mjs +3 -1
  44. package/dist/drizzle/d1-password-prepared.mjs.map +1 -1
  45. package/dist/drizzle/d1-passwords.d.mts +6 -5
  46. package/dist/drizzle/d1-passwords.mjs +11 -7
  47. package/dist/drizzle/d1-passwords.mjs.map +1 -1
  48. package/dist/drizzle/d1-phone.d.mts +3 -4
  49. package/dist/drizzle/d1-phone.mjs +2 -1
  50. package/dist/drizzle/d1-phone.mjs.map +1 -1
  51. package/dist/drizzle/d1-planning.d.mts +1 -1
  52. package/dist/drizzle/d1-proofs.d.mts +4 -3
  53. package/dist/drizzle/d1-proofs.mjs +3 -1
  54. package/dist/drizzle/d1-proofs.mjs.map +1 -1
  55. package/dist/drizzle/d1-sessions.d.mts +11 -10
  56. package/dist/drizzle/d1-sessions.mjs +15 -9
  57. package/dist/drizzle/d1-sessions.mjs.map +1 -1
  58. package/dist/drizzle/d1-totp.d.mts +3 -4
  59. package/dist/drizzle/d1-totp.mjs +2 -1
  60. package/dist/drizzle/d1-totp.mjs.map +1 -1
  61. package/dist/drizzle/email-registration.mjs +2 -1
  62. package/dist/drizzle/email-registration.mjs.map +1 -1
  63. package/dist/drizzle/email-target.d.mts +7 -6
  64. package/dist/drizzle/email-target.mjs +10 -10
  65. package/dist/drizzle/email-target.mjs.map +1 -1
  66. package/dist/drizzle/mysql-database.d.mts +8 -0
  67. package/dist/drizzle/mysql-database.mjs +8 -0
  68. package/dist/drizzle/mysql-database.mjs.map +1 -0
  69. package/dist/drizzle/mysql-emails.d.mts +7 -6
  70. package/dist/drizzle/mysql-emails.mjs +12 -8
  71. package/dist/drizzle/mysql-emails.mjs.map +1 -1
  72. package/dist/drizzle/mysql-identity.mjs +12 -9
  73. package/dist/drizzle/mysql-identity.mjs.map +1 -1
  74. package/dist/drizzle/mysql-password-prepared.d.mts +3 -2
  75. package/dist/drizzle/mysql-password-prepared.mjs +6 -2
  76. package/dist/drizzle/mysql-password-prepared.mjs.map +1 -1
  77. package/dist/drizzle/mysql-passwords.d.mts +6 -4
  78. package/dist/drizzle/mysql-passwords.mjs +11 -7
  79. package/dist/drizzle/mysql-passwords.mjs.map +1 -1
  80. package/dist/drizzle/mysql-proofs.d.mts +3 -2
  81. package/dist/drizzle/mysql-proofs.mjs +8 -4
  82. package/dist/drizzle/mysql-proofs.mjs.map +1 -1
  83. package/dist/drizzle/mysql-sessions.d.mts +11 -10
  84. package/dist/drizzle/mysql-sessions.mjs +16 -12
  85. package/dist/drizzle/mysql-sessions.mjs.map +1 -1
  86. package/dist/drizzle/native-database.mjs +10 -0
  87. package/dist/drizzle/native-database.mjs.map +1 -0
  88. package/dist/drizzle/oauth-connected-drivers.mjs +7 -5
  89. package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -1
  90. package/dist/drizzle/oauth-connected-settlement.mjs +3 -2
  91. package/dist/drizzle/oauth-connected-settlement.mjs.map +1 -1
  92. package/dist/drizzle/oauth-connected-sign-in.mjs +4 -3
  93. package/dist/drizzle/oauth-connected-sign-in.mjs.map +1 -1
  94. package/dist/drizzle/oauth-connected-target.d.mts +6 -7
  95. package/dist/drizzle/oauth-connected-target.mjs +4 -5
  96. package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
  97. package/dist/drizzle/oauth-drivers.mjs +8 -6
  98. package/dist/drizzle/oauth-drivers.mjs.map +1 -1
  99. package/dist/drizzle/oauth-target.d.mts +12 -11
  100. package/dist/drizzle/oauth-target.mjs +13 -12
  101. package/dist/drizzle/oauth-target.mjs.map +1 -1
  102. package/dist/drizzle/passkey-drivers.mjs +8 -6
  103. package/dist/drizzle/passkey-drivers.mjs.map +1 -1
  104. package/dist/drizzle/passkey-write-drivers.mjs +5 -3
  105. package/dist/drizzle/passkey-write-drivers.mjs.map +1 -1
  106. package/dist/drizzle/passkey-write-target.d.mts +1 -1
  107. package/dist/drizzle/password-prepared-sql.mjs +2 -1
  108. package/dist/drizzle/password-prepared-sql.mjs.map +1 -1
  109. package/dist/drizzle/password-prepared-target.d.mts +3 -2
  110. package/dist/drizzle/password-prepared-target.mjs +4 -3
  111. package/dist/drizzle/password-prepared-target.mjs.map +1 -1
  112. package/dist/drizzle/password-registration.mjs +2 -1
  113. package/dist/drizzle/password-registration.mjs.map +1 -1
  114. package/dist/drizzle/password-target.d.mts +5 -4
  115. package/dist/drizzle/password-target.mjs +8 -8
  116. package/dist/drizzle/password-target.mjs.map +1 -1
  117. package/dist/drizzle/pg-database.d.mts +9 -0
  118. package/dist/drizzle/pg-database.mjs +8 -0
  119. package/dist/drizzle/pg-database.mjs.map +1 -0
  120. package/dist/drizzle/pg-emails.d.mts +7 -6
  121. package/dist/drizzle/pg-emails.mjs +12 -8
  122. package/dist/drizzle/pg-emails.mjs.map +1 -1
  123. package/dist/drizzle/pg-identity.mjs +12 -9
  124. package/dist/drizzle/pg-identity.mjs.map +1 -1
  125. package/dist/drizzle/pg-password-prepared.d.mts +3 -2
  126. package/dist/drizzle/pg-password-prepared.mjs +6 -2
  127. package/dist/drizzle/pg-password-prepared.mjs.map +1 -1
  128. package/dist/drizzle/pg-passwords.d.mts +6 -4
  129. package/dist/drizzle/pg-passwords.mjs +11 -7
  130. package/dist/drizzle/pg-passwords.mjs.map +1 -1
  131. package/dist/drizzle/pg-proofs.d.mts +3 -2
  132. package/dist/drizzle/pg-proofs.mjs +8 -4
  133. package/dist/drizzle/pg-proofs.mjs.map +1 -1
  134. package/dist/drizzle/pg-sessions.d.mts +11 -10
  135. package/dist/drizzle/pg-sessions.mjs +16 -12
  136. package/dist/drizzle/pg-sessions.mjs.map +1 -1
  137. package/dist/drizzle/phone-target.d.mts +4 -3
  138. package/dist/drizzle/phone-target.mjs +12 -11
  139. package/dist/drizzle/phone-target.mjs.map +1 -1
  140. package/dist/drizzle/proof-target.d.mts +3 -2
  141. package/dist/drizzle/proof-target.mjs +5 -5
  142. package/dist/drizzle/proof-target.mjs.map +1 -1
  143. package/dist/drizzle/session-sql.d.mts +1 -0
  144. package/dist/drizzle/session-target.d.mts +10 -8
  145. package/dist/drizzle/session-target.mjs +11 -11
  146. package/dist/drizzle/session-target.mjs.map +1 -1
  147. package/dist/drizzle/sqlite-emails.mjs +9 -5
  148. package/dist/drizzle/sqlite-emails.mjs.map +1 -1
  149. package/dist/drizzle/sqlite-identity.mjs +14 -11
  150. package/dist/drizzle/sqlite-identity.mjs.map +1 -1
  151. package/dist/drizzle/sqlite-password-prepared.mjs +7 -3
  152. package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -1
  153. package/dist/drizzle/sqlite-passwords.mjs +10 -6
  154. package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
  155. package/dist/drizzle/sqlite-proofs.mjs +7 -3
  156. package/dist/drizzle/sqlite-proofs.mjs.map +1 -1
  157. package/dist/drizzle/sqlite-sessions.mjs +16 -12
  158. package/dist/drizzle/sqlite-sessions.mjs.map +1 -1
  159. package/dist/drizzle/standalone-guard.d.mts +2 -0
  160. package/dist/drizzle/standalone-guard.mjs +8 -4
  161. package/dist/drizzle/standalone-guard.mjs.map +1 -1
  162. package/dist/drizzle/totp-target.d.mts +4 -3
  163. package/dist/drizzle/totp-target.mjs +31 -28
  164. package/dist/drizzle/totp-target.mjs.map +1 -1
  165. package/package.json +1 -1
  166. package/src/D1.ts +37 -10
  167. package/src/Libsql.ts +45 -17
  168. package/src/Mysql2.ts +39 -13
  169. package/src/Pglite.ts +47 -13
  170. package/src/Postgres.ts +47 -13
  171. package/src/SqliteBun.ts +58 -30
  172. package/src/SqliteDo.ts +61 -19
  173. package/src/SqliteNode.ts +55 -28
  174. package/src/SqliteWasm.ts +55 -28
  175. package/src/drizzle/d1-database.ts +10 -0
  176. package/src/drizzle/d1-emails.ts +84 -84
  177. package/src/drizzle/d1-identity.ts +17 -20
  178. package/src/drizzle/d1-oauth.ts +19 -8
  179. package/src/drizzle/d1-passkey.ts +5 -1
  180. package/src/drizzle/d1-password-prepared.ts +38 -37
  181. package/src/drizzle/d1-passwords.ts +118 -108
  182. package/src/drizzle/d1-phone.ts +5 -1
  183. package/src/drizzle/d1-proofs.ts +29 -30
  184. package/src/drizzle/d1-sessions.ts +51 -38
  185. package/src/drizzle/d1-totp.ts +5 -1
  186. package/src/drizzle/email-registration.ts +6 -2
  187. package/src/drizzle/email-target.ts +17 -19
  188. package/src/drizzle/mysql-database.ts +8 -0
  189. package/src/drizzle/mysql-emails.ts +28 -16
  190. package/src/drizzle/mysql-identity.ts +18 -21
  191. package/src/drizzle/mysql-password-prepared.ts +10 -8
  192. package/src/drizzle/mysql-passwords.ts +21 -9
  193. package/src/drizzle/mysql-proofs.ts +16 -5
  194. package/src/drizzle/mysql-sessions.ts +40 -17
  195. package/src/drizzle/native-database.ts +22 -0
  196. package/src/drizzle/oauth-connected-drivers.ts +18 -6
  197. package/src/drizzle/oauth-connected-settlement.ts +5 -3
  198. package/src/drizzle/oauth-connected-sign-in.ts +7 -3
  199. package/src/drizzle/oauth-connected-target.ts +16 -17
  200. package/src/drizzle/oauth-drivers.ts +26 -10
  201. package/src/drizzle/oauth-target.ts +30 -42
  202. package/src/drizzle/passkey-drivers.ts +21 -13
  203. package/src/drizzle/passkey-write-drivers.ts +11 -6
  204. package/src/drizzle/password-prepared-sql.ts +2 -4
  205. package/src/drizzle/password-prepared-target.ts +9 -6
  206. package/src/drizzle/password-registration.ts +7 -8
  207. package/src/drizzle/password-target.ts +19 -18
  208. package/src/drizzle/pg-database.ts +10 -0
  209. package/src/drizzle/pg-emails.ts +28 -16
  210. package/src/drizzle/pg-identity.ts +18 -22
  211. package/src/drizzle/pg-password-prepared.ts +10 -8
  212. package/src/drizzle/pg-passwords.ts +21 -9
  213. package/src/drizzle/pg-proofs.ts +16 -5
  214. package/src/drizzle/pg-sessions.ts +40 -17
  215. package/src/drizzle/phone-target.ts +22 -17
  216. package/src/drizzle/proof-target.ts +9 -12
  217. package/src/drizzle/session-target.ts +32 -50
  218. package/src/drizzle/sqlite-emails.ts +30 -13
  219. package/src/drizzle/sqlite-identity.ts +22 -42
  220. package/src/drizzle/sqlite-password-prepared.ts +23 -9
  221. package/src/drizzle/sqlite-passwords.ts +29 -15
  222. package/src/drizzle/sqlite-proofs.ts +28 -5
  223. package/src/drizzle/sqlite-sessions.ts +49 -23
  224. package/src/drizzle/standalone-guard.ts +18 -6
  225. package/src/drizzle/totp-target.ts +61 -60
  226. package/dist/drizzle/d1-identity.d.mts +0 -30
  227. package/dist/drizzle/mysql-identity.d.mts +0 -21
  228. package/dist/drizzle/pg-identity.d.mts +0 -22
@@ -15,6 +15,7 @@ import {
15
15
  type EmailRegistrationConfiguration,
16
16
  } from "./email-registration";
17
17
  import {
18
+ CurrentEmailSql,
18
19
  makeSqlEmailAddressPersistence,
19
20
  makeSqlEmailSignInTargets,
20
21
  type EmailSqlConfiguration,
@@ -22,7 +23,7 @@ import {
22
23
  type EmailSqlQuery,
23
24
  } from "./email-sql";
24
25
  import type { ProofTargetConfiguration } from "./proof-target";
25
- import { sqlClientStandaloneGuard } from "./standalone-guard";
26
+ import { sqlClientStandaloneGuard, type TransactionService } from "./standalone-guard";
26
27
 
27
28
  export interface EmailTargetConfiguration {
28
29
  readonly mode: "interactive" | "synchronous";
@@ -46,9 +47,9 @@ export type EmailCoordinatorError<E> =
46
47
  | SqlError.SqlError;
47
48
 
48
49
  export const sqlClientEmailStandaloneGuard = (
49
- database: unknown,
50
+ service: TransactionService | undefined,
50
51
  ): Effect.Effect<void, EmailUnavailable> =>
51
- sqlClientStandaloneGuard(database, () => EmailUnavailable.make({}));
52
+ sqlClientStandaloneGuard(service, () => EmailUnavailable.make({}));
52
53
 
53
54
  const proofConfiguration = (configuration: EmailTargetConfiguration, coordinated = false) => ({
54
55
  mode: configuration.proof.mode,
@@ -93,13 +94,12 @@ const registrationOptions = (
93
94
  });
94
95
 
95
96
  export const makeTargetEmailSignInServices = (
96
- database: any,
97
97
  mapping: any,
98
98
  configuration: EmailTargetConfiguration,
99
99
  ) =>
100
100
  Effect.gen(function* () {
101
101
  return {
102
- emailSignInTargets: yield* makeSqlEmailSignInTargets(database, mapping, {
102
+ emailSignInTargets: yield* makeSqlEmailSignInTargets(mapping, {
103
103
  mode: configuration.mode,
104
104
  locking: false,
105
105
  standaloneGuard: configuration.standaloneGuard,
@@ -108,7 +108,6 @@ export const makeTargetEmailSignInServices = (
108
108
  });
109
109
 
110
110
  export const makeTargetEmailAddressServices = (
111
- database: any,
112
111
  mapping: any,
113
112
  proofMapping: any,
114
113
  configuration: EmailTargetConfiguration,
@@ -116,7 +115,6 @@ export const makeTargetEmailAddressServices = (
116
115
  Effect.gen(function* () {
117
116
  return {
118
117
  emailAddressPersistence: yield* makeSqlEmailAddressPersistence(
119
- database,
120
118
  mapping,
121
119
  addressOptions(configuration, proofMapping),
122
120
  ),
@@ -124,7 +122,6 @@ export const makeTargetEmailAddressServices = (
124
122
  });
125
123
 
126
124
  export const makeTargetEmailRegistrationServices = <Registration>(
127
- database: any,
128
125
  mapping: any,
129
126
  proofMapping: any,
130
127
  configuration: EmailTargetConfiguration,
@@ -132,7 +129,6 @@ export const makeTargetEmailRegistrationServices = <Registration>(
132
129
  Effect.gen(function* () {
133
130
  return {
134
131
  registrationAuthority: yield* makeSqlEmailRegistrationAuthority<Registration>(
135
- database,
136
132
  mapping,
137
133
  registrationOptions(configuration, proofMapping),
138
134
  ),
@@ -161,9 +157,10 @@ export const coordinateTargetEmailAddress = <Transaction, A, E, R>(
161
157
  Effect.gen(function* () {
162
158
  return yield* owner(transaction, {
163
159
  emailAddressPersistence: yield* makeSqlEmailAddressPersistence(
164
- transaction as unknown as EmailSqlDatabase,
165
160
  mapping,
166
161
  addressOptions(configuration, proofMapping, true),
162
+ ).pipe(
163
+ Effect.provideService(CurrentEmailSql, transaction as unknown as EmailSqlDatabase),
167
164
  ),
168
165
  });
169
166
  }),
@@ -196,9 +193,10 @@ export const coordinateTargetEmailRegistration = <Registration, Transaction, A,
196
193
  Effect.gen(function* () {
197
194
  return yield* owner(transaction, {
198
195
  registrationAuthority: yield* makeSqlEmailRegistrationAuthority<Registration>(
199
- transaction as unknown as EmailSqlDatabase,
200
196
  mapping,
201
197
  registrationOptions(configuration, proofMapping, true),
198
+ ).pipe(
199
+ Effect.provideService(CurrentEmailSql, transaction as unknown as EmailSqlDatabase),
202
200
  ),
203
201
  });
204
202
  }),
@@ -209,19 +207,19 @@ export const coordinateTargetEmailRegistration = <Registration, Transaction, A,
209
207
  return result.value;
210
208
  });
211
209
 
212
- export const emailSignInTargetsLayer = (
213
- services: Effect.Effect<{ readonly emailSignInTargets: EmailSignInTargets["Service"] }>,
210
+ export const emailSignInTargetsLayer = <E, R>(
211
+ services: Effect.Effect<{ readonly emailSignInTargets: EmailSignInTargets["Service"] }, E, R>,
214
212
  ) =>
215
213
  Layer.effect(
216
214
  EmailSignInTargets,
217
215
  Effect.map(services, (value) => value.emailSignInTargets),
218
216
  );
219
217
 
220
- export const emailAddressPersistenceLayer = (
218
+ export const emailAddressPersistenceLayer = <E, R>(
221
219
  services: Effect.Effect<
222
220
  { readonly emailAddressPersistence: EmailAddressPersistence["Service"] },
223
- never,
224
- LifecycleHooks
221
+ E,
222
+ R
225
223
  >,
226
224
  ) =>
227
225
  Layer.effect(
@@ -229,12 +227,12 @@ export const emailAddressPersistenceLayer = (
229
227
  Effect.map(services, (value) => value.emailAddressPersistence),
230
228
  );
231
229
 
232
- export const emailRegistrationLayer = <Id, Registration>(
230
+ export const emailRegistrationLayer = <Id, Registration, E, R>(
233
231
  tag: Context.Key<Id, EmailRegistrationAuthority<Registration>>,
234
232
  services: Effect.Effect<
235
233
  { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },
236
- never,
237
- LifecycleHooks
234
+ E,
235
+ R
238
236
  >,
239
237
  ) =>
240
238
  Layer.effect(
@@ -0,0 +1,8 @@
1
+ import type { AnyRelations } from "drizzle-orm";
2
+ import type { EffectMysql2Database } from "drizzle-orm/effect-mysql2";
3
+ import { Context } from "effect";
4
+
5
+ /** Application-owned MySQL database used to construct persistence services. */
6
+ export class Database extends Context.Service<Database, EffectMysql2Database<AnyRelations>>()(
7
+ "effect-auth/persistence-drizzle/Mysql2/Database",
8
+ ) {}
@@ -13,6 +13,7 @@ import type {
13
13
  EmailSignInMapping,
14
14
  } from "./email-model";
15
15
  import type { EmailRegistrationAuthority } from "./email-registration";
16
+ import { CurrentEmailSql } from "./email-sql";
16
17
  import type { EmailSqlQuery } from "./email-sql";
17
18
  import {
18
19
  coordinateTargetEmailAddress,
@@ -22,9 +23,16 @@ import {
22
23
  makeTargetEmailSignInServices,
23
24
  sqlClientEmailStandaloneGuard,
24
25
  } from "./email-target";
26
+ import { Database as DatabaseService } from "./mysql-database";
27
+ import { nativeDatabase } from "./native-database";
25
28
  import type { ProofPersistenceMapping } from "./proof-model";
26
29
  import type { ProofSqlQuery } from "./proof-sql";
27
30
  import { sqlClientProofStandaloneGuard } from "./proof-target";
31
+ import {
32
+ type TransactionService,
33
+ acquireTransactionService,
34
+ transactionService,
35
+ } from "./standalone-guard";
28
36
  import type { SuppliedService } from "./SuppliedService";
29
37
 
30
38
  type Database = EffectMysql2Database<AnyRelations>;
@@ -44,15 +52,15 @@ type ProofMapping = ProofPersistenceMapping<
44
52
  any
45
53
  >;
46
54
 
47
- const configuration = (database: Database) => ({
55
+ const configuration = (service: TransactionService | undefined) => ({
48
56
  mode: "interactive" as const,
49
57
  locking: true,
50
- standaloneGuard: sqlClientEmailStandaloneGuard(database),
58
+ standaloneGuard: sqlClientEmailStandaloneGuard(service),
51
59
  generatedSubjectRows: (query: EmailSqlQuery) => query.$returningId(),
52
60
  proof: {
53
61
  mode: "interactive" as const,
54
62
  locking: true,
55
- standaloneGuard: sqlClientProofStandaloneGuard(database),
63
+ standaloneGuard: sqlClientProofStandaloneGuard(service),
56
64
  insertIfAbsent: (query: ProofSqlQuery, selfKey: string, selfValue: unknown) =>
57
65
  query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),
58
66
  },
@@ -64,9 +72,12 @@ export const makeMysqlEmailSignInServices = <
64
72
  C extends AnyMySqlTable,
65
73
  NativeId,
66
74
  >(
67
- database: Database,
68
75
  mapping: EmailSignInMapping<S, I, C, NativeId>,
69
- ) => makeTargetEmailSignInServices(database, mapping, configuration(database));
76
+ ) =>
77
+ Effect.flatMap(
78
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
79
+ (configuration) => makeTargetEmailSignInServices(mapping, configuration),
80
+ ).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(DatabaseService)));
70
81
 
71
82
  export const makeMysqlEmailAddressServices = <
72
83
  S extends AnyMySqlTable,
@@ -76,10 +87,13 @@ export const makeMysqlEmailAddressServices = <
76
87
  M extends AnyMySqlTable,
77
88
  NativeId,
78
89
  >(
79
- database: Database,
80
90
  mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>,
81
91
  proofMapping: ProofMapping,
82
- ) => makeTargetEmailAddressServices(database, mapping, proofMapping, configuration(database));
92
+ ) =>
93
+ Effect.flatMap(
94
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
95
+ (configuration) => makeTargetEmailAddressServices(mapping, proofMapping, configuration),
96
+ ).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(DatabaseService)));
83
97
 
84
98
  export function coordinateMysqlEmailAddress<
85
99
  D extends Database,
@@ -170,7 +184,7 @@ export function coordinateMysqlEmailAddress<
170
184
  database,
171
185
  options.mapping,
172
186
  options.proofMapping,
173
- configuration(database),
187
+ configuration(transactionService(database)),
174
188
  (
175
189
  transaction: TransactionOf<D>,
176
190
  services: { readonly emailAddressPersistence: EmailAddressPersistence["Service"] },
@@ -195,16 +209,14 @@ export const makeMysqlEmailRegistrationServices = <
195
209
  Rq extends AnyMySqlTable,
196
210
  NativeId,
197
211
  >(
198
- database: Database,
199
212
  mapping: EmailRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,
200
213
  proofMapping: ProofMapping,
201
214
  ) =>
202
- makeTargetEmailRegistrationServices<Registration>(
203
- database,
204
- mapping,
205
- proofMapping,
206
- configuration(database),
207
- );
215
+ Effect.flatMap(
216
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
217
+ (configuration) =>
218
+ makeTargetEmailRegistrationServices<Registration>(mapping, proofMapping, configuration),
219
+ ).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(DatabaseService)));
208
220
 
209
221
  export function coordinateMysqlEmailRegistration<
210
222
  TargetId,
@@ -304,7 +316,7 @@ export function coordinateMysqlEmailRegistration<
304
316
  database,
305
317
  options.mapping,
306
318
  options.proofMapping,
307
- configuration(database),
319
+ configuration(transactionService(database)),
308
320
  (
309
321
  transaction: TransactionOf<D>,
310
322
  services: { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },
@@ -10,7 +10,7 @@ import {
10
10
  import { reportPersistenceFailure } from "@yielded/auth/Persistence";
11
11
  import type { SubjectId } from "@yielded/auth/Schema";
12
12
  /* oxlint-disable no-explicit-any -- Drizzle generic query types are narrowed at this technology boundary. */
13
- import { and, eq, type AnyRelations } from "drizzle-orm";
13
+ import { and, eq } from "drizzle-orm";
14
14
  import type { EffectMysql2Database } from "drizzle-orm/effect-mysql2";
15
15
  import type { AnyMySqlTable, MySqlColumn } from "drizzle-orm/mysql-core";
16
16
  import { Cause, Effect, Schema } from "effect";
@@ -24,8 +24,8 @@ import {
24
24
  type IdentityTables,
25
25
  type SubjectProvisioningTables,
26
26
  } from "./model";
27
+ import { Database as DatabaseService } from "./mysql-database";
27
28
 
28
- type Database = EffectMysql2Database<AnyRelations>;
29
29
  type RuntimeDatabase = EffectMysql2Database<any>;
30
30
  const unavailable = () => IdentityUnavailable.make();
31
31
  const isIdentityFailure = Schema.is(Schema.Union([IdentityConflict, IdentityUnavailable]));
@@ -39,15 +39,14 @@ const mapUnavailable = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
39
39
  ),
40
40
  );
41
41
 
42
- export const makeMysqlSubjectProvisioningServices = <
42
+ export const makeMysqlSubjectProvisioningServices = Effect.fnUntraced(function* <
43
43
  Subject extends AnyMySqlTable,
44
44
  Identifier extends AnyMySqlTable,
45
45
  Request extends AnyMySqlTable,
46
46
  NativeId,
47
- >(
48
- database: Database,
49
- mapping: SubjectProvisioningTables<Subject, Identifier, Request, NativeId>,
50
- ) => {
47
+ >(mapping: SubjectProvisioningTables<Subject, Identifier, Request, NativeId>) {
48
+ const database = yield* DatabaseService;
49
+
51
50
  const db = database as RuntimeDatabase;
52
51
  const requestTable = mapping.provisioningRequest.table;
53
52
 
@@ -190,16 +189,15 @@ export const makeMysqlSubjectProvisioningServices = <
190
189
  }, mapUnavailable);
191
190
 
192
191
  return { subjectProvisioner: SubjectProvisioner.of({ provision }) } as const;
193
- };
192
+ });
194
193
 
195
- export const makeMysqlExternalIdentityServices = <
194
+ export const makeMysqlExternalIdentityServices = Effect.fnUntraced(function* <
196
195
  Subject extends AnyMySqlTable,
197
196
  External extends AnyMySqlTable,
198
197
  NativeId,
199
- >(
200
- database: Database,
201
- mapping: ExternalIdentityTables<Subject, External, NativeId>,
202
- ) => {
198
+ >(mapping: ExternalIdentityTables<Subject, External, NativeId>) {
199
+ const database = yield* DatabaseService;
200
+
203
201
  const db = database as RuntimeDatabase;
204
202
  const externalTable = mapping.externalIdentity.table;
205
203
 
@@ -307,18 +305,17 @@ export const makeMysqlExternalIdentityServices = <
307
305
  }, mapUnavailable);
308
306
 
309
307
  return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) } as const;
310
- };
308
+ });
311
309
 
312
- export const makeMysqlIdentityServices = <
310
+ export const makeMysqlIdentityServices = Effect.fnUntraced(function* <
313
311
  Subject extends AnyMySqlTable,
314
312
  Identifier extends AnyMySqlTable,
315
313
  External extends AnyMySqlTable,
316
314
  Request extends AnyMySqlTable,
317
315
  NativeId,
318
- >(
319
- database: Database,
320
- mapping: IdentityTables<Subject, Identifier, External, Request, NativeId>,
321
- ) => ({
322
- ...makeMysqlSubjectProvisioningServices(database, mapping),
323
- ...makeMysqlExternalIdentityServices(database, mapping),
316
+ >(mapping: IdentityTables<Subject, Identifier, External, Request, NativeId>) {
317
+ return {
318
+ ...(yield* makeMysqlSubjectProvisioningServices(mapping)),
319
+ ...(yield* makeMysqlExternalIdentityServices(mapping)),
320
+ };
324
321
  });
@@ -6,7 +6,9 @@ import type { AnyMySqlTable } from "drizzle-orm/mysql-core";
6
6
  import { Effect, Context } from "effect";
7
7
  import type { SqlError } from "effect/sql/SqlError";
8
8
 
9
+ import { Database as DatabaseService } from "./mysql-database";
9
10
  import { mysqlPasswordConfiguration as configuration } from "./mysql-passwords";
11
+ import { nativeDatabase } from "./native-database";
10
12
  import type {
11
13
  PasswordPreparedPersistenceMapping,
12
14
  PasswordPreparedProofMapping,
@@ -15,6 +17,8 @@ import {
15
17
  makeTargetPasswordPreparedPersistenceServices,
16
18
  coordinateTargetPasswordPreparedPersistence,
17
19
  } from "./password-prepared-target";
20
+ import { CurrentPasswordSql } from "./password-sql";
21
+ import { acquireTransactionService, transactionService } from "./standalone-guard";
18
22
  import type { SuppliedService } from "./SuppliedService";
19
23
  type Database = EffectMysql2Database<AnyRelations>;
20
24
  type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
@@ -39,16 +43,14 @@ export const makeMySqlPasswordPreparedPersistenceServices = <
39
43
  PCr extends AnyMySqlTable = AnyMySqlTable,
40
44
  PNativeId = unknown,
41
45
  >(
42
- database: Database,
43
46
  mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, A, RS, CE, M, T, B, NativeId>,
44
47
  proofMapping?: PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>,
45
48
  ) =>
46
- makeTargetPasswordPreparedPersistenceServices(
47
- database,
48
- mapping,
49
- configuration(database),
50
- proofMapping,
51
- );
49
+ Effect.flatMap(
50
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
51
+ (configuration) =>
52
+ makeTargetPasswordPreparedPersistenceServices(mapping, configuration, proofMapping),
53
+ ).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)));
52
54
 
53
55
  export function coordinateMySqlPasswordPreparedPersistence<
54
56
  TargetId,
@@ -186,7 +188,7 @@ export function coordinateMySqlPasswordPreparedPersistence<
186
188
  coordinateTargetPasswordPreparedPersistence<TransactionOf<D>, Out, E, Exclude<R, TargetId>>(
187
189
  database,
188
190
  options.mapping,
189
- configuration(database),
191
+ configuration(transactionService(database)),
190
192
  options.proofMapping,
191
193
  (
192
194
  transaction: TransactionOf<D>,
@@ -7,8 +7,11 @@ import type { AnyMySqlTable } from "drizzle-orm/mysql-core";
7
7
  import { Effect, Context } from "effect";
8
8
  import type { SqlError } from "effect/sql/SqlError";
9
9
 
10
+ import { Database as DatabaseService } from "./mysql-database";
11
+ import { nativeDatabase } from "./native-database";
10
12
  import type { PasswordPersistenceMapping, PasswordRegistrationMapping } from "./password-model";
11
13
  import type { PasswordRegistrationAuthority } from "./password-registration";
14
+ import { CurrentPasswordSql } from "./password-sql";
12
15
  import type { PasswordSqlQuery } from "./password-sql";
13
16
  import {
14
17
  coordinateTargetPasswordPersistence,
@@ -20,22 +23,27 @@ import {
20
23
  import type { ProofPersistenceMapping } from "./proof-model";
21
24
  import type { ProofSqlQuery } from "./proof-sql";
22
25
  import { sqlClientProofStandaloneGuard } from "./proof-target";
26
+ import {
27
+ type TransactionService,
28
+ acquireTransactionService,
29
+ transactionService,
30
+ } from "./standalone-guard";
23
31
  import type { SuppliedService } from "./SuppliedService";
24
32
 
25
33
  type Database = EffectMysql2Database<AnyRelations>;
26
34
  type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
27
35
 
28
- const configuration = (database: Database) => ({
36
+ const configuration = (service: TransactionService | undefined) => ({
29
37
  mode: "interactive" as const,
30
38
  locking: true,
31
- standaloneGuard: sqlClientPasswordStandaloneGuard(database),
39
+ standaloneGuard: sqlClientPasswordStandaloneGuard(service),
32
40
  insertIfAbsent: (query: PasswordSqlQuery, selfKey: string, selfValue: unknown) =>
33
41
  query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),
34
42
  generatedSubjectRows: (query: PasswordSqlQuery) => query.$returningId(),
35
43
  proof: {
36
44
  mode: "interactive" as const,
37
45
  locking: true,
38
- standaloneGuard: sqlClientProofStandaloneGuard(database),
46
+ standaloneGuard: sqlClientProofStandaloneGuard(service),
39
47
  insertIfAbsent: (query: ProofSqlQuery, selfKey: string, selfValue: unknown) =>
40
48
  query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),
41
49
  },
@@ -64,7 +72,6 @@ export const makeMysqlPasswordPersistenceServices = <
64
72
  M extends AnyMySqlTable,
65
73
  NativeId,
66
74
  >(
67
- database: Database,
68
75
  mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>,
69
76
  proofMapping?: ProofPersistenceMapping<
70
77
  any,
@@ -81,7 +88,10 @@ export const makeMysqlPasswordPersistenceServices = <
81
88
  any
82
89
  >,
83
90
  ) =>
84
- makeTargetPasswordPersistenceServices(database, mapping, configuration(database), proofMapping);
91
+ Effect.flatMap(
92
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
93
+ (configuration) => makeTargetPasswordPersistenceServices(mapping, configuration, proofMapping),
94
+ ).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)));
85
95
 
86
96
  export function coordinateMysqlPasswordPersistence<
87
97
  D extends Database,
@@ -189,7 +199,7 @@ export function coordinateMysqlPasswordPersistence<
189
199
  coordinateTargetPasswordPersistence<TransactionOf<D>, Out, E, Exclude<R, PasswordPersistence>>(
190
200
  database,
191
201
  options.mapping,
192
- configuration(database),
202
+ configuration(transactionService(database)),
193
203
  options.proofMapping,
194
204
  (
195
205
  transaction: TransactionOf<D>,
@@ -215,10 +225,12 @@ export const makeMysqlPasswordRegistrationServices = <
215
225
  Rq extends AnyMySqlTable,
216
226
  NativeId,
217
227
  >(
218
- database: Database,
219
228
  mapping: PasswordRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,
220
229
  ) =>
221
- makeTargetPasswordRegistrationServices<Registration>(database, mapping, configuration(database));
230
+ Effect.flatMap(
231
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
232
+ (configuration) => makeTargetPasswordRegistrationServices<Registration>(mapping, configuration),
233
+ ).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)));
222
234
 
223
235
  export function coordinateMysqlPasswordRegistration<
224
236
  TargetId,
@@ -320,7 +332,7 @@ export function coordinateMysqlPasswordRegistration<
320
332
  >(
321
333
  database,
322
334
  options.mapping,
323
- configuration(database),
335
+ configuration(transactionService(database)),
324
336
  (
325
337
  transaction: TransactionOf<D>,
326
338
  services: { readonly registrationAuthority: PasswordRegistrationAuthority<Registration> },
@@ -7,13 +7,21 @@ import { Effect, Context } from "effect";
7
7
  import type { SqlError } from "effect/sql/SqlError";
8
8
 
9
9
  import { updateValues } from "./model";
10
+ import { Database as DatabaseService } from "./mysql-database";
11
+ import { nativeDatabase } from "./native-database";
10
12
  import type { ProofPersistenceMapping } from "./proof-model";
13
+ import { CurrentProofSql } from "./proof-sql";
11
14
  import type { ProofSqlQuery } from "./proof-sql";
12
15
  import {
13
16
  coordinateTargetProofPersistence,
14
17
  makeTargetProofPersistenceServices,
15
18
  sqlClientProofStandaloneGuard,
16
19
  } from "./proof-target";
20
+ import {
21
+ type TransactionService,
22
+ acquireTransactionService,
23
+ transactionService,
24
+ } from "./standalone-guard";
17
25
  import type { SuppliedService } from "./SuppliedService";
18
26
 
19
27
  type Database = EffectMysql2Database<AnyRelations>;
@@ -33,10 +41,10 @@ type Mapping<
33
41
  NativeId,
34
42
  > = ProofPersistenceMapping<Rq, S, G, Cn, Rs, A, F, C, Sub, I, Cr, NativeId>;
35
43
 
36
- const configuration = (database: Database) => ({
44
+ const configuration = (service: TransactionService | undefined) => ({
37
45
  mode: "interactive" as const,
38
46
  locking: true,
39
- standaloneGuard: sqlClientProofStandaloneGuard(database),
47
+ standaloneGuard: sqlClientProofStandaloneGuard(service),
40
48
  insertIfAbsent: (query: ProofSqlQuery, selfKey: string, selfValue: unknown) =>
41
49
  query.onDuplicateKeyUpdate({
42
50
  set: updateValues([[selfKey, selfValue]]),
@@ -57,9 +65,12 @@ export const makeMysqlProofPersistenceServices = <
57
65
  Cr extends AnyMySqlTable,
58
66
  NativeId,
59
67
  >(
60
- database: Database,
61
68
  mapping: Mapping<Rq, S, G, Cn, Rs, A, F, C, Sub, I, Cr, NativeId>,
62
- ) => makeTargetProofPersistenceServices(database, mapping, configuration(database));
69
+ ) =>
70
+ Effect.flatMap(
71
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
72
+ (configuration) => makeTargetProofPersistenceServices(mapping, configuration),
73
+ ).pipe(Effect.provideServiceEffect(CurrentProofSql, nativeDatabase(DatabaseService)));
63
74
 
64
75
  export function coordinateMysqlProofPersistence<
65
76
  D extends Database,
@@ -164,7 +175,7 @@ export function coordinateMysqlProofPersistence<
164
175
  coordinateTargetProofPersistence<Transaction, A, E, Exclude<R, ProofPersistence>>(
165
176
  database,
166
177
  options.mapping,
167
- configuration(database),
178
+ configuration(transactionService(database)),
168
179
  (
169
180
  transaction: Transaction,
170
181
  services: { readonly proofPersistence: ProofPersistence["Service"] },