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

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 (222) hide show
  1. package/dist/D1.d.mts +27 -22
  2. package/dist/D1.mjs +10 -4
  3. package/dist/D1.mjs.map +1 -1
  4. package/dist/Libsql.d.mts +66 -61
  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 +43 -32
  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 +58 -53
  17. package/dist/SqliteBun.mjs +20 -14
  18. package/dist/SqliteBun.mjs.map +1 -1
  19. package/dist/SqliteDo.d.mts +66 -60
  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 +66 -61
  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 +14 -13
  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 +5 -2
  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-target.d.mts +6 -7
  91. package/dist/drizzle/oauth-connected-target.mjs +4 -5
  92. package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
  93. package/dist/drizzle/oauth-drivers.mjs +8 -6
  94. package/dist/drizzle/oauth-drivers.mjs.map +1 -1
  95. package/dist/drizzle/oauth-target.d.mts +12 -11
  96. package/dist/drizzle/oauth-target.mjs +13 -12
  97. package/dist/drizzle/oauth-target.mjs.map +1 -1
  98. package/dist/drizzle/passkey-drivers.mjs +8 -6
  99. package/dist/drizzle/passkey-drivers.mjs.map +1 -1
  100. package/dist/drizzle/passkey-write-drivers.mjs +5 -3
  101. package/dist/drizzle/passkey-write-drivers.mjs.map +1 -1
  102. package/dist/drizzle/passkey-write-target.d.mts +1 -1
  103. package/dist/drizzle/password-prepared-sql.mjs +2 -1
  104. package/dist/drizzle/password-prepared-sql.mjs.map +1 -1
  105. package/dist/drizzle/password-prepared-target.d.mts +3 -2
  106. package/dist/drizzle/password-prepared-target.mjs +4 -3
  107. package/dist/drizzle/password-prepared-target.mjs.map +1 -1
  108. package/dist/drizzle/password-registration.mjs +2 -1
  109. package/dist/drizzle/password-registration.mjs.map +1 -1
  110. package/dist/drizzle/password-target.d.mts +5 -4
  111. package/dist/drizzle/password-target.mjs +8 -8
  112. package/dist/drizzle/password-target.mjs.map +1 -1
  113. package/dist/drizzle/pg-database.d.mts +9 -0
  114. package/dist/drizzle/pg-database.mjs +8 -0
  115. package/dist/drizzle/pg-database.mjs.map +1 -0
  116. package/dist/drizzle/pg-emails.d.mts +7 -6
  117. package/dist/drizzle/pg-emails.mjs +12 -8
  118. package/dist/drizzle/pg-emails.mjs.map +1 -1
  119. package/dist/drizzle/pg-identity.mjs +12 -9
  120. package/dist/drizzle/pg-identity.mjs.map +1 -1
  121. package/dist/drizzle/pg-password-prepared.d.mts +3 -2
  122. package/dist/drizzle/pg-password-prepared.mjs +6 -2
  123. package/dist/drizzle/pg-password-prepared.mjs.map +1 -1
  124. package/dist/drizzle/pg-passwords.d.mts +6 -4
  125. package/dist/drizzle/pg-passwords.mjs +11 -7
  126. package/dist/drizzle/pg-passwords.mjs.map +1 -1
  127. package/dist/drizzle/pg-proofs.d.mts +3 -2
  128. package/dist/drizzle/pg-proofs.mjs +8 -4
  129. package/dist/drizzle/pg-proofs.mjs.map +1 -1
  130. package/dist/drizzle/pg-sessions.d.mts +11 -10
  131. package/dist/drizzle/pg-sessions.mjs +16 -12
  132. package/dist/drizzle/pg-sessions.mjs.map +1 -1
  133. package/dist/drizzle/phone-target.d.mts +4 -3
  134. package/dist/drizzle/phone-target.mjs +12 -11
  135. package/dist/drizzle/phone-target.mjs.map +1 -1
  136. package/dist/drizzle/proof-target.d.mts +3 -2
  137. package/dist/drizzle/proof-target.mjs +5 -5
  138. package/dist/drizzle/proof-target.mjs.map +1 -1
  139. package/dist/drizzle/session-sql.d.mts +1 -0
  140. package/dist/drizzle/session-target.d.mts +10 -8
  141. package/dist/drizzle/session-target.mjs +11 -11
  142. package/dist/drizzle/session-target.mjs.map +1 -1
  143. package/dist/drizzle/sqlite-emails.mjs +9 -5
  144. package/dist/drizzle/sqlite-emails.mjs.map +1 -1
  145. package/dist/drizzle/sqlite-identity.mjs +14 -11
  146. package/dist/drizzle/sqlite-identity.mjs.map +1 -1
  147. package/dist/drizzle/sqlite-password-prepared.mjs +7 -3
  148. package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -1
  149. package/dist/drizzle/sqlite-passwords.mjs +10 -6
  150. package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
  151. package/dist/drizzle/sqlite-proofs.mjs +7 -3
  152. package/dist/drizzle/sqlite-proofs.mjs.map +1 -1
  153. package/dist/drizzle/sqlite-sessions.mjs +16 -12
  154. package/dist/drizzle/sqlite-sessions.mjs.map +1 -1
  155. package/dist/drizzle/standalone-guard.d.mts +2 -0
  156. package/dist/drizzle/standalone-guard.mjs +8 -4
  157. package/dist/drizzle/standalone-guard.mjs.map +1 -1
  158. package/dist/drizzle/totp-target.d.mts +4 -3
  159. package/dist/drizzle/totp-target.mjs +31 -28
  160. package/dist/drizzle/totp-target.mjs.map +1 -1
  161. package/package.json +1 -1
  162. package/src/D1.ts +37 -10
  163. package/src/Libsql.ts +45 -17
  164. package/src/Mysql2.ts +39 -13
  165. package/src/Pglite.ts +47 -13
  166. package/src/Postgres.ts +47 -13
  167. package/src/SqliteBun.ts +58 -30
  168. package/src/SqliteDo.ts +61 -19
  169. package/src/SqliteNode.ts +55 -28
  170. package/src/SqliteWasm.ts +55 -28
  171. package/src/drizzle/d1-database.ts +10 -0
  172. package/src/drizzle/d1-emails.ts +84 -84
  173. package/src/drizzle/d1-identity.ts +17 -20
  174. package/src/drizzle/d1-oauth.ts +19 -8
  175. package/src/drizzle/d1-passkey.ts +5 -1
  176. package/src/drizzle/d1-password-prepared.ts +38 -37
  177. package/src/drizzle/d1-passwords.ts +74 -76
  178. package/src/drizzle/d1-phone.ts +5 -1
  179. package/src/drizzle/d1-proofs.ts +29 -30
  180. package/src/drizzle/d1-sessions.ts +51 -38
  181. package/src/drizzle/d1-totp.ts +5 -1
  182. package/src/drizzle/email-registration.ts +6 -2
  183. package/src/drizzle/email-target.ts +17 -19
  184. package/src/drizzle/mysql-database.ts +8 -0
  185. package/src/drizzle/mysql-emails.ts +28 -16
  186. package/src/drizzle/mysql-identity.ts +18 -21
  187. package/src/drizzle/mysql-password-prepared.ts +10 -8
  188. package/src/drizzle/mysql-passwords.ts +21 -9
  189. package/src/drizzle/mysql-proofs.ts +16 -5
  190. package/src/drizzle/mysql-sessions.ts +40 -17
  191. package/src/drizzle/native-database.ts +22 -0
  192. package/src/drizzle/oauth-connected-drivers.ts +18 -6
  193. package/src/drizzle/oauth-connected-target.ts +16 -17
  194. package/src/drizzle/oauth-drivers.ts +26 -10
  195. package/src/drizzle/oauth-target.ts +30 -42
  196. package/src/drizzle/passkey-drivers.ts +21 -13
  197. package/src/drizzle/passkey-write-drivers.ts +11 -6
  198. package/src/drizzle/password-prepared-sql.ts +2 -4
  199. package/src/drizzle/password-prepared-target.ts +9 -6
  200. package/src/drizzle/password-registration.ts +7 -8
  201. package/src/drizzle/password-target.ts +19 -18
  202. package/src/drizzle/pg-database.ts +10 -0
  203. package/src/drizzle/pg-emails.ts +28 -16
  204. package/src/drizzle/pg-identity.ts +18 -22
  205. package/src/drizzle/pg-password-prepared.ts +10 -8
  206. package/src/drizzle/pg-passwords.ts +21 -9
  207. package/src/drizzle/pg-proofs.ts +16 -5
  208. package/src/drizzle/pg-sessions.ts +40 -17
  209. package/src/drizzle/phone-target.ts +22 -17
  210. package/src/drizzle/proof-target.ts +9 -12
  211. package/src/drizzle/session-target.ts +32 -50
  212. package/src/drizzle/sqlite-emails.ts +30 -13
  213. package/src/drizzle/sqlite-identity.ts +22 -42
  214. package/src/drizzle/sqlite-password-prepared.ts +23 -9
  215. package/src/drizzle/sqlite-passwords.ts +29 -15
  216. package/src/drizzle/sqlite-proofs.ts +28 -5
  217. package/src/drizzle/sqlite-sessions.ts +49 -23
  218. package/src/drizzle/standalone-guard.ts +18 -6
  219. package/src/drizzle/totp-target.ts +61 -60
  220. package/dist/drizzle/d1-identity.d.mts +0 -30
  221. package/dist/drizzle/mysql-identity.d.mts +0 -21
  222. package/dist/drizzle/pg-identity.d.mts +0 -22
@@ -15,13 +15,14 @@ import {
15
15
  type PasswordRegistrationConfiguration,
16
16
  } from "./password-registration";
17
17
  import {
18
+ CurrentPasswordSql,
18
19
  makeSqlPasswordPersistence,
19
20
  type PasswordSqlConfiguration,
20
21
  type PasswordSqlDatabase,
21
22
  type PasswordSqlQuery,
22
23
  } from "./password-sql";
23
24
  import type { ProofTargetConfiguration } from "./proof-target";
24
- import { sqlClientStandaloneGuard } from "./standalone-guard";
25
+ import { sqlClientStandaloneGuard, type TransactionService } from "./standalone-guard";
25
26
 
26
27
  export interface PasswordTargetConfiguration {
27
28
  readonly mode: "interactive" | "synchronous";
@@ -50,9 +51,9 @@ export type PasswordCoordinatorError<E> =
50
51
  | SqlError.SqlError;
51
52
 
52
53
  export const sqlClientPasswordStandaloneGuard = (
53
- database: unknown,
54
+ service: TransactionService | undefined,
54
55
  ): Effect.Effect<void, PasswordUnavailable> =>
55
- sqlClientStandaloneGuard(database, () => PasswordUnavailable.make({}));
56
+ sqlClientStandaloneGuard(service, () => PasswordUnavailable.make({}));
56
57
 
57
58
  export const passwordOptions = (
58
59
  configuration: PasswordTargetConfiguration,
@@ -96,7 +97,6 @@ const registrationOptions = (
96
97
  });
97
98
 
98
99
  export const makeTargetPasswordPersistenceServices = (
99
- database: any,
100
100
  mapping: any,
101
101
  configuration: PasswordTargetConfiguration,
102
102
  proofMapping?: any,
@@ -104,7 +104,6 @@ export const makeTargetPasswordPersistenceServices = (
104
104
  Effect.gen(function* () {
105
105
  return {
106
106
  passwordPersistence: yield* makeSqlPasswordPersistence(
107
- database,
108
107
  mapping,
109
108
  passwordOptions(configuration, proofMapping),
110
109
  ),
@@ -112,14 +111,12 @@ export const makeTargetPasswordPersistenceServices = (
112
111
  });
113
112
 
114
113
  export const makeTargetPasswordRegistrationServices = <Registration>(
115
- database: any,
116
114
  mapping: any,
117
115
  configuration: PasswordTargetConfiguration,
118
116
  ) =>
119
117
  Effect.gen(function* () {
120
118
  return {
121
119
  registrationAuthority: yield* makeSqlPasswordRegistrationAuthority<Registration>(
122
- database,
123
120
  mapping,
124
121
  registrationOptions(configuration),
125
122
  ),
@@ -149,9 +146,13 @@ export const coordinateTargetPasswordPersistence = <Transaction, A, E, R>(
149
146
  Effect.gen(function* () {
150
147
  return yield* owner(transaction, {
151
148
  passwordPersistence: yield* makeSqlPasswordPersistence(
152
- transaction as unknown as PasswordSqlDatabase,
153
149
  mapping,
154
150
  passwordOptions(configuration, proofMapping, true),
151
+ ).pipe(
152
+ Effect.provideService(
153
+ CurrentPasswordSql,
154
+ transaction as unknown as PasswordSqlDatabase,
155
+ ),
155
156
  ),
156
157
  });
157
158
  }),
@@ -185,9 +186,13 @@ export const coordinateTargetPasswordRegistration = <Registration, Transaction,
185
186
  Effect.gen(function* () {
186
187
  return yield* owner(transaction, {
187
188
  registrationAuthority: yield* makeSqlPasswordRegistrationAuthority<Registration>(
188
- transaction as unknown as PasswordSqlDatabase,
189
189
  mapping,
190
190
  registrationOptions(configuration, true),
191
+ ).pipe(
192
+ Effect.provideService(
193
+ CurrentPasswordSql,
194
+ transaction as unknown as PasswordSqlDatabase,
195
+ ),
191
196
  ),
192
197
  });
193
198
  }),
@@ -198,24 +203,20 @@ export const coordinateTargetPasswordRegistration = <Registration, Transaction,
198
203
  return result.value;
199
204
  });
200
205
 
201
- export const passwordPersistenceLayer = (
202
- services: Effect.Effect<
203
- { readonly passwordPersistence: PasswordPersistence["Service"] },
204
- never,
205
- LifecycleHooks
206
- >,
206
+ export const passwordPersistenceLayer = <E, R>(
207
+ services: Effect.Effect<{ readonly passwordPersistence: PasswordPersistence["Service"] }, E, R>,
207
208
  ) =>
208
209
  Layer.effect(
209
210
  PasswordPersistence,
210
211
  Effect.map(services, (value) => value.passwordPersistence),
211
212
  );
212
213
 
213
- export const passwordRegistrationLayer = <Id, Registration>(
214
+ export const passwordRegistrationLayer = <Id, Registration, E, R>(
214
215
  tag: Context.Key<Id, PasswordRegistrationAuthority<Registration>>,
215
216
  services: Effect.Effect<
216
217
  { readonly registrationAuthority: PasswordRegistrationAuthority<Registration> },
217
- never,
218
- LifecycleHooks
218
+ E,
219
+ R
219
220
  >,
220
221
  ) =>
221
222
  Layer.effect(
@@ -0,0 +1,10 @@
1
+ import type { AnyRelations } from "drizzle-orm";
2
+ import type { EffectPgDatabase as PgliteDatabase } from "drizzle-orm/effect-pglite";
3
+ import type { EffectPgDatabase as PostgresDatabase } from "drizzle-orm/effect-postgres";
4
+ import { Context } from "effect";
5
+
6
+ /** Application-owned PostgreSQL database; Postgres and Pglite share this service. */
7
+ export class Database extends Context.Service<
8
+ Database,
9
+ PostgresDatabase<AnyRelations> | PgliteDatabase<AnyRelations>
10
+ >()("effect-auth/persistence-drizzle/Postgres/Database") {}
@@ -14,6 +14,7 @@ import type {
14
14
  EmailSignInMapping,
15
15
  } from "./email-model";
16
16
  import type { EmailRegistrationAuthority } from "./email-registration";
17
+ import { CurrentEmailSql } from "./email-sql";
17
18
  import type { EmailSqlQuery } from "./email-sql";
18
19
  import {
19
20
  coordinateTargetEmailAddress,
@@ -23,9 +24,16 @@ import {
23
24
  makeTargetEmailSignInServices,
24
25
  sqlClientEmailStandaloneGuard,
25
26
  } from "./email-target";
27
+ import { nativeDatabase } from "./native-database";
28
+ import { Database as DatabaseService } from "./pg-database";
26
29
  import type { ProofPersistenceMapping } from "./proof-model";
27
30
  import type { ProofSqlQuery } from "./proof-sql";
28
31
  import { sqlClientProofStandaloneGuard } from "./proof-target";
32
+ import {
33
+ type TransactionService,
34
+ acquireTransactionService,
35
+ transactionService,
36
+ } from "./standalone-guard";
29
37
  import type { SuppliedService } from "./SuppliedService";
30
38
 
31
39
  type Database = PostgresDatabase<AnyRelations> | PgliteDatabase<AnyRelations>;
@@ -45,15 +53,15 @@ type ProofMapping = ProofPersistenceMapping<
45
53
  any
46
54
  >;
47
55
 
48
- const configuration = (database: Database) => ({
56
+ const configuration = (service: TransactionService | undefined) => ({
49
57
  mode: "interactive" as const,
50
58
  locking: true,
51
- standaloneGuard: sqlClientEmailStandaloneGuard(database),
59
+ standaloneGuard: sqlClientEmailStandaloneGuard(service),
52
60
  generatedSubjectRows: (query: EmailSqlQuery) => query.returning(),
53
61
  proof: {
54
62
  mode: "interactive" as const,
55
63
  locking: true,
56
- standaloneGuard: sqlClientProofStandaloneGuard(database),
64
+ standaloneGuard: sqlClientProofStandaloneGuard(service),
57
65
  insertIfAbsent: (query: ProofSqlQuery) => query.onConflictDoNothing(),
58
66
  },
59
67
  });
@@ -64,9 +72,12 @@ export const makePgEmailSignInServices = <
64
72
  C extends AnyPgTable,
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 makePgEmailAddressServices = <
72
83
  S extends AnyPgTable,
@@ -76,10 +87,13 @@ export const makePgEmailAddressServices = <
76
87
  M extends AnyPgTable,
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 coordinatePgEmailAddress<
85
99
  D extends Database,
@@ -170,7 +184,7 @@ export function coordinatePgEmailAddress<
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 makePgEmailRegistrationServices = <
195
209
  Rq extends AnyPgTable,
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 coordinatePgEmailRegistration<
210
222
  TargetId,
@@ -304,7 +316,7 @@ export function coordinatePgEmailRegistration<
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,8 +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's generic query builders lose the concrete consumer table through a runtime column map. Assertions stay in this adapter. */
13
- import { and, eq, type AnyRelations } from "drizzle-orm";
14
- import type { EffectPgDatabase as PgliteDatabase } from "drizzle-orm/effect-pglite";
13
+ import { and, eq } from "drizzle-orm";
15
14
  import type { EffectPgDatabase as PgDatabase } from "drizzle-orm/effect-postgres";
16
15
  import { type AnyPgTable, type PgColumn } from "drizzle-orm/pg-core";
17
16
  import { Cause, Effect, Schema } from "effect";
@@ -25,8 +24,8 @@ import {
25
24
  type IdentityTables,
26
25
  type SubjectProvisioningTables,
27
26
  } from "./model";
27
+ import { Database as DatabaseService } from "./pg-database";
28
28
 
29
- type Database = PgDatabase<AnyRelations> | PgliteDatabase<AnyRelations>;
30
29
  type RuntimeDatabase = PgDatabase<any>;
31
30
 
32
31
  const identityUnavailable = () => IdentityUnavailable.make();
@@ -41,15 +40,14 @@ const mapIdentityFailure = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
41
40
  ),
42
41
  );
43
42
 
44
- export const makePgSubjectProvisioningServices = <
43
+ export const makePgSubjectProvisioningServices = Effect.fnUntraced(function* <
45
44
  Subject extends AnyPgTable,
46
45
  Identifier extends AnyPgTable,
47
46
  Request extends AnyPgTable,
48
47
  NativeId,
49
- >(
50
- database: Database,
51
- mapping: SubjectProvisioningTables<Subject, Identifier, Request, NativeId>,
52
- ) => {
48
+ >(mapping: SubjectProvisioningTables<Subject, Identifier, Request, NativeId>) {
49
+ const database = yield* DatabaseService;
50
+
53
51
  const db = database as RuntimeDatabase;
54
52
  const requestTable = mapping.provisioningRequest.table;
55
53
  const requestIdColumn = column(requestTable, mapping.provisioningRequest.requestId);
@@ -174,16 +172,15 @@ export const makePgSubjectProvisioningServices = <
174
172
  return {
175
173
  subjectProvisioner: SubjectProvisioner.of({ provision }),
176
174
  } as const;
177
- };
175
+ });
178
176
 
179
- export const makePgExternalIdentityServices = <
177
+ export const makePgExternalIdentityServices = Effect.fnUntraced(function* <
180
178
  Subject extends AnyPgTable,
181
179
  External extends AnyPgTable,
182
180
  NativeId,
183
- >(
184
- database: Database,
185
- mapping: ExternalIdentityTables<Subject, External, NativeId>,
186
- ) => {
181
+ >(mapping: ExternalIdentityTables<Subject, External, NativeId>) {
182
+ const database = yield* DatabaseService;
183
+
187
184
  const db = database as RuntimeDatabase;
188
185
  const externalTable = mapping.externalIdentity.table;
189
186
 
@@ -284,18 +281,17 @@ export const makePgExternalIdentityServices = <
284
281
  }, mapIdentityFailure);
285
282
 
286
283
  return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) } as const;
287
- };
284
+ });
288
285
 
289
- export const makePgIdentityServices = <
286
+ export const makePgIdentityServices = Effect.fnUntraced(function* <
290
287
  Subject extends AnyPgTable,
291
288
  Identifier extends AnyPgTable,
292
289
  External extends AnyPgTable,
293
290
  Request extends AnyPgTable,
294
291
  NativeId,
295
- >(
296
- database: Database,
297
- mapping: IdentityTables<Subject, Identifier, External, Request, NativeId>,
298
- ) => ({
299
- ...makePgSubjectProvisioningServices(database, mapping),
300
- ...makePgExternalIdentityServices(database, mapping),
292
+ >(mapping: IdentityTables<Subject, Identifier, External, Request, NativeId>) {
293
+ return {
294
+ ...(yield* makePgSubjectProvisioningServices(mapping)),
295
+ ...(yield* makePgExternalIdentityServices(mapping)),
296
+ };
301
297
  });
@@ -7,6 +7,7 @@ import type { AnyPgTable } from "drizzle-orm/pg-core";
7
7
  import { Effect, Context } from "effect";
8
8
  import type { SqlError } from "effect/sql/SqlError";
9
9
 
10
+ import { nativeDatabase } from "./native-database";
10
11
  import type {
11
12
  PasswordPreparedPersistenceMapping,
12
13
  PasswordPreparedProofMapping,
@@ -15,7 +16,10 @@ import {
15
16
  makeTargetPasswordPreparedPersistenceServices,
16
17
  coordinateTargetPasswordPreparedPersistence,
17
18
  } from "./password-prepared-target";
19
+ import { CurrentPasswordSql } from "./password-sql";
20
+ import { Database as DatabaseService } from "./pg-database";
18
21
  import { pgPasswordConfiguration as configuration } from "./pg-passwords";
22
+ import { acquireTransactionService, transactionService } from "./standalone-guard";
19
23
  import type { SuppliedService } from "./SuppliedService";
20
24
  type Database = PostgresDatabase<AnyRelations> | PgliteDatabase<AnyRelations>;
21
25
  type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
@@ -40,16 +44,14 @@ export const makePgPasswordPreparedPersistenceServices = <
40
44
  PCr extends AnyPgTable = AnyPgTable,
41
45
  PNativeId = unknown,
42
46
  >(
43
- database: Database,
44
47
  mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, A, RS, CE, M, T, B, NativeId>,
45
48
  proofMapping?: PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>,
46
49
  ) =>
47
- makeTargetPasswordPreparedPersistenceServices(
48
- database,
49
- mapping,
50
- configuration(database),
51
- proofMapping,
52
- );
50
+ Effect.flatMap(
51
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
52
+ (configuration) =>
53
+ makeTargetPasswordPreparedPersistenceServices(mapping, configuration, proofMapping),
54
+ ).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)));
53
55
 
54
56
  export function coordinatePgPasswordPreparedPersistence<
55
57
  TargetId,
@@ -187,7 +189,7 @@ export function coordinatePgPasswordPreparedPersistence<
187
189
  coordinateTargetPasswordPreparedPersistence<TransactionOf<D>, Out, E, Exclude<R, TargetId>>(
188
190
  database,
189
191
  options.mapping,
190
- configuration(database),
192
+ configuration(transactionService(database)),
191
193
  options.proofMapping,
192
194
  (
193
195
  transaction: TransactionOf<D>,
@@ -8,8 +8,10 @@ import type { AnyPgTable } from "drizzle-orm/pg-core";
8
8
  import { Effect, Context } from "effect";
9
9
  import type { SqlError } from "effect/sql/SqlError";
10
10
 
11
+ import { nativeDatabase } from "./native-database";
11
12
  import type { PasswordPersistenceMapping, PasswordRegistrationMapping } from "./password-model";
12
13
  import type { PasswordRegistrationAuthority } from "./password-registration";
14
+ import { CurrentPasswordSql } from "./password-sql";
13
15
  import type { PasswordSqlQuery } from "./password-sql";
14
16
  import {
15
17
  coordinateTargetPasswordPersistence,
@@ -18,24 +20,30 @@ import {
18
20
  makeTargetPasswordRegistrationServices,
19
21
  sqlClientPasswordStandaloneGuard,
20
22
  } from "./password-target";
23
+ import { Database as DatabaseService } from "./pg-database";
21
24
  import type { ProofPersistenceMapping } from "./proof-model";
22
25
  import type { ProofSqlQuery } from "./proof-sql";
23
26
  import { sqlClientProofStandaloneGuard } from "./proof-target";
27
+ import {
28
+ type TransactionService,
29
+ acquireTransactionService,
30
+ transactionService,
31
+ } from "./standalone-guard";
24
32
  import type { SuppliedService } from "./SuppliedService";
25
33
 
26
34
  type Database = PostgresDatabase<AnyRelations> | PgliteDatabase<AnyRelations>;
27
35
  type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
28
36
 
29
- const configuration = (database: Database) => ({
37
+ const configuration = (service: TransactionService | undefined) => ({
30
38
  mode: "interactive" as const,
31
39
  locking: true,
32
- standaloneGuard: sqlClientPasswordStandaloneGuard(database),
40
+ standaloneGuard: sqlClientPasswordStandaloneGuard(service),
33
41
  insertIfAbsent: (query: PasswordSqlQuery) => query.onConflictDoNothing(),
34
42
  generatedSubjectRows: (query: PasswordSqlQuery) => query.returning(),
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) => query.onConflictDoNothing(),
40
48
  },
41
49
  });
@@ -63,7 +71,6 @@ export const makePgPasswordPersistenceServices = <
63
71
  M extends AnyPgTable,
64
72
  NativeId,
65
73
  >(
66
- database: Database,
67
74
  mapping: PasswordMapping<S, I, C, AC, A, RS, CE, M, NativeId>,
68
75
  proofMapping?: ProofPersistenceMapping<
69
76
  any,
@@ -80,7 +87,10 @@ export const makePgPasswordPersistenceServices = <
80
87
  any
81
88
  >,
82
89
  ) =>
83
- makeTargetPasswordPersistenceServices(database, mapping, configuration(database), proofMapping);
90
+ Effect.flatMap(
91
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
92
+ (configuration) => makeTargetPasswordPersistenceServices(mapping, configuration, proofMapping),
93
+ ).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)));
84
94
 
85
95
  export function coordinatePgPasswordPersistence<
86
96
  D extends Database,
@@ -188,7 +198,7 @@ export function coordinatePgPasswordPersistence<
188
198
  coordinateTargetPasswordPersistence<TransactionOf<D>, Out, E, Exclude<R, PasswordPersistence>>(
189
199
  database,
190
200
  options.mapping,
191
- configuration(database),
201
+ configuration(transactionService(database)),
192
202
  options.proofMapping,
193
203
  (
194
204
  transaction: TransactionOf<D>,
@@ -214,10 +224,12 @@ export const makePgPasswordRegistrationServices = <
214
224
  Rq extends AnyPgTable,
215
225
  NativeId,
216
226
  >(
217
- database: Database,
218
227
  mapping: PasswordRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,
219
228
  ) =>
220
- makeTargetPasswordRegistrationServices<Registration>(database, mapping, configuration(database));
229
+ Effect.flatMap(
230
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
231
+ (configuration) => makeTargetPasswordRegistrationServices<Registration>(mapping, configuration),
232
+ ).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)));
221
233
 
222
234
  export function coordinatePgPasswordRegistration<
223
235
  TargetId,
@@ -319,7 +331,7 @@ export function coordinatePgPasswordRegistration<
319
331
  >(
320
332
  database,
321
333
  options.mapping,
322
- configuration(database),
334
+ configuration(transactionService(database)),
323
335
  (
324
336
  transaction: TransactionOf<D>,
325
337
  services: { readonly registrationAuthority: PasswordRegistrationAuthority<Registration> },
@@ -7,13 +7,21 @@ import type { AnyPgTable } from "drizzle-orm/pg-core";
7
7
  import { Effect, Context } from "effect";
8
8
  import type { SqlError } from "effect/sql/SqlError";
9
9
 
10
+ import { nativeDatabase } from "./native-database";
11
+ import { Database as DatabaseService } from "./pg-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 = PostgresDatabase<AnyRelations> | PgliteDatabase<AnyRelations>;
@@ -46,10 +54,10 @@ type Mapping<
46
54
  NativeSubjectId
47
55
  >;
48
56
 
49
- const configuration = (database: Database) => ({
57
+ const configuration = (service: TransactionService | undefined) => ({
50
58
  mode: "interactive" as const,
51
59
  locking: true,
52
- standaloneGuard: sqlClientProofStandaloneGuard(database),
60
+ standaloneGuard: sqlClientProofStandaloneGuard(service),
53
61
  insertIfAbsent: (query: ProofSqlQuery) => query.onConflictDoNothing(),
54
62
  });
55
63
 
@@ -67,9 +75,12 @@ export const makePgProofPersistenceServices = <
67
75
  Cr extends AnyPgTable,
68
76
  NativeId,
69
77
  >(
70
- database: Database,
71
78
  mapping: Mapping<Rq, S, G, Cn, Rs, A, F, C, Sub, I, Cr, NativeId>,
72
- ) => makeTargetProofPersistenceServices(database, mapping, configuration(database));
79
+ ) =>
80
+ Effect.flatMap(
81
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
82
+ (configuration) => makeTargetProofPersistenceServices(mapping, configuration),
83
+ ).pipe(Effect.provideServiceEffect(CurrentProofSql, nativeDatabase(DatabaseService)));
73
84
 
74
85
  export function coordinatePgProofPersistence<
75
86
  D extends Database,
@@ -174,7 +185,7 @@ export function coordinatePgProofPersistence<
174
185
  coordinateTargetProofPersistence<TransactionOf<D>, A, E, Exclude<R, ProofPersistence>>(
175
186
  database,
176
187
  options.mapping,
177
- configuration(database),
188
+ configuration(transactionService(database)),
178
189
  (
179
190
  transaction: TransactionOf<D>,
180
191
  services: { readonly proofPersistence: ProofPersistence["Service"] },