@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
@@ -27,7 +27,7 @@ import {
27
27
  type SessionSqlDatabase,
28
28
  type SessionSqlOptions,
29
29
  } from "./session-sql";
30
- import { sqlClientStandaloneGuard } from "./standalone-guard";
30
+ import { sqlClientStandaloneGuard, type TransactionService } from "./standalone-guard";
31
31
 
32
32
  export interface SessionTargetConfiguration {
33
33
  readonly mode: "interactive" | "synchronous";
@@ -45,9 +45,9 @@ interface TransactionOwner<Transaction> {
45
45
  type CoordinatorError<E> = E | SessionUnavailable | HookConfigurationError | SqlError.SqlError;
46
46
 
47
47
  export const sqlClientSessionStandaloneGuard = (
48
- database: unknown,
48
+ service: TransactionService | undefined,
49
49
  ): Effect.Effect<void, SessionUnavailable> =>
50
- sqlClientStandaloneGuard(database, () => SessionUnavailable.make({}));
50
+ sqlClientStandaloneGuard(service, () => SessionUnavailable.make({}));
51
51
 
52
52
  const options = (
53
53
  configuration: SessionTargetConfiguration,
@@ -59,42 +59,35 @@ const options = (
59
59
  });
60
60
 
61
61
  export const makeTargetAuthenticationAuthorityServices = <Claims>(
62
- database: any,
63
62
  mapping: any,
64
63
  configuration: SessionTargetConfiguration,
65
64
  ) =>
66
65
  Effect.map(
67
- makeSqlAuthenticationAuthority<Claims>(database, mapping, options(configuration)),
66
+ makeSqlAuthenticationAuthority<Claims>(mapping, options(configuration)),
68
67
  (authenticationAuthority) => ({ authenticationAuthority }),
69
68
  );
70
69
 
71
70
  export const makeTargetPendingAuthenticationServices = <Claims>(
72
- database: any,
73
71
  mapping: any,
74
72
  configuration: SessionTargetConfiguration,
75
73
  ) =>
76
74
  Effect.map(
77
- makeSqlPendingAuthentication<Claims>(database, mapping, options(configuration)),
75
+ makeSqlPendingAuthentication<Claims>(mapping, options(configuration)),
78
76
  (pendingAuthentication) => ({ pendingAuthentication }),
79
77
  );
80
78
 
81
79
  export const makeTargetStatefulSessionServices = <Claims>(
82
- database: any,
83
80
  mapping: any,
84
81
  configuration: SessionTargetConfiguration,
85
- ) => makeSqlStatefulSessions<Claims>(database, mapping, options(configuration));
82
+ ) => makeSqlStatefulSessions<Claims>(mapping, options(configuration));
86
83
 
87
84
  export const makeTargetSignedSessionValidityServices = (
88
- database: any,
89
85
  mapping: any,
90
86
  configuration: SessionTargetConfiguration,
91
87
  ) =>
92
- Effect.map(
93
- makeSqlSignedValidity(database, mapping, options(configuration)),
94
- (signedSessionValidity) => ({
95
- signedSessionValidity,
96
- }),
97
- );
88
+ Effect.map(makeSqlSignedValidity(mapping, options(configuration)), (signedSessionValidity) => ({
89
+ signedSessionValidity,
90
+ }));
98
91
 
99
92
  /**
100
93
  * The native transaction is the root commit owner. Interruption or owner
@@ -146,10 +139,8 @@ export const coordinateTargetAuthenticationAuthority = <Claims, Transaction, A,
146
139
  configuration,
147
140
  (transaction) =>
148
141
  Effect.map(
149
- makeSqlAuthenticationAuthority<Claims>(
150
- transaction as unknown as SessionSqlDatabase,
151
- mapping,
152
- options(configuration, true),
142
+ makeSqlAuthenticationAuthority<Claims>(mapping, options(configuration, true)).pipe(
143
+ Effect.provideService(CurrentSessionSql, transaction as unknown as SessionSqlDatabase),
153
144
  ),
154
145
  (authenticationAuthority) => ({ authenticationAuthority }),
155
146
  ),
@@ -170,10 +161,8 @@ export const coordinateTargetPendingAuthentication = <Claims, Transaction, A, E,
170
161
  configuration,
171
162
  (transaction) =>
172
163
  Effect.map(
173
- makeSqlPendingAuthentication<Claims>(
174
- transaction as unknown as SessionSqlDatabase,
175
- mapping,
176
- options(configuration, true),
164
+ makeSqlPendingAuthentication<Claims>(mapping, options(configuration, true)).pipe(
165
+ Effect.provideService(CurrentSessionSql, transaction as unknown as SessionSqlDatabase),
177
166
  ),
178
167
  (pendingAuthentication) => ({ pendingAuthentication }),
179
168
  ),
@@ -196,10 +185,8 @@ export const coordinateTargetStatefulSessions = <Claims, Transaction, A, E, R>(
196
185
  database,
197
186
  configuration,
198
187
  (transaction) =>
199
- makeSqlStatefulSessions<Claims>(
200
- transaction as unknown as SessionSqlDatabase,
201
- mapping,
202
- options(configuration, true),
188
+ makeSqlStatefulSessions<Claims>(mapping, options(configuration, true)).pipe(
189
+ Effect.provideService(CurrentSessionSql, transaction as unknown as SessionSqlDatabase),
203
190
  ),
204
191
  owner,
205
192
  );
@@ -218,23 +205,21 @@ export const coordinateTargetSignedSessionValidity = <Transaction, A, E, R>(
218
205
  configuration,
219
206
  (transaction) =>
220
207
  Effect.map(
221
- makeSqlSignedValidity(
222
- transaction as unknown as SessionSqlDatabase,
223
- mapping,
224
- options(configuration, true),
208
+ makeSqlSignedValidity(mapping, options(configuration, true)).pipe(
209
+ Effect.provideService(CurrentSessionSql, transaction as unknown as SessionSqlDatabase),
225
210
  ),
226
211
  (signedSessionValidity) => ({ signedSessionValidity }),
227
212
  ),
228
213
  owner,
229
214
  );
230
215
 
231
- export const authenticationAuthorityLayer = (
216
+ export const authenticationAuthorityLayer = <E, R>(
232
217
  services: Effect.Effect<
233
218
  {
234
219
  readonly authenticationAuthority: AuthenticationAuthority["Service"];
235
220
  },
236
- never,
237
- LifecycleHooks
221
+ E,
222
+ R
238
223
  >,
239
224
  ) =>
240
225
  Layer.effect(
@@ -242,7 +227,7 @@ export const authenticationAuthorityLayer = (
242
227
  Effect.map(services, (value) => value.authenticationAuthority),
243
228
  );
244
229
 
245
- export const statefulSessionLayers = <Claims>(
230
+ export const statefulSessionLayers = <Claims, E, R>(
246
231
  module: {
247
232
  readonly StatefulSessionPersistence: any;
248
233
  readonly SessionRepository: any;
@@ -252,8 +237,8 @@ export const statefulSessionLayers = <Claims>(
252
237
  readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;
253
238
  readonly sessionRepository: SessionRepository;
254
239
  },
255
- never,
256
- LifecycleHooks
240
+ E,
241
+ R
257
242
  >,
258
243
  ) =>
259
244
  Layer.merge(
@@ -267,14 +252,14 @@ export const statefulSessionLayers = <Claims>(
267
252
  ),
268
253
  );
269
254
 
270
- export const pendingAuthenticationLayer = <Claims>(
255
+ export const pendingAuthenticationLayer = <Claims, E, R>(
271
256
  module: { readonly PendingAuthentication: any },
272
257
  services: Effect.Effect<
273
258
  {
274
259
  readonly pendingAuthentication: PendingAuthentication<Claims>;
275
260
  },
276
- never,
277
- LifecycleHooks
261
+ E,
262
+ R
278
263
  >,
279
264
  ) =>
280
265
  Layer.effect(
@@ -282,14 +267,14 @@ export const pendingAuthenticationLayer = <Claims>(
282
267
  Effect.map(services, (value) => value.pendingAuthentication),
283
268
  );
284
269
 
285
- export const signedSessionValidityLayer = (
270
+ export const signedSessionValidityLayer = <E, R>(
286
271
  module: { readonly SignedSessionValidity: any },
287
272
  services: Effect.Effect<
288
273
  {
289
274
  readonly signedSessionValidity: SignedSessionValidity;
290
275
  },
291
- never,
292
- LifecycleHooks
276
+ E,
277
+ R
293
278
  >,
294
279
  ) =>
295
280
  Layer.effect(
@@ -298,13 +283,12 @@ export const signedSessionValidityLayer = (
298
283
  );
299
284
 
300
285
  export const makeTargetSessionStepUpServices = <Claims, Id>(
301
- database: any,
302
286
  mapping: any,
303
287
  target: Context.Service<Id, SessionStepUpPersistence<Claims>>,
304
288
  configuration: SessionTargetConfiguration,
305
289
  ) =>
306
290
  Effect.map(
307
- makeSqlSessionStepUp<Claims>(database, mapping, options(configuration)),
291
+ makeSqlSessionStepUp<Claims>(mapping, options(configuration)),
308
292
  (sessionStepUpPersistence) => ({
309
293
  sessionStepUpPersistence: target.of(sessionStepUpPersistence),
310
294
  }),
@@ -325,10 +309,8 @@ export const coordinateTargetSessionStepUp = <Claims, Id, Transaction, A, E, R>(
325
309
  configuration,
326
310
  (transaction) =>
327
311
  Effect.map(
328
- makeSqlSessionStepUp<Claims>(
329
- transaction as unknown as SessionSqlDatabase,
330
- mapping,
331
- options(configuration, true),
312
+ makeSqlSessionStepUp<Claims>(mapping, options(configuration, true)).pipe(
313
+ Effect.provideService(CurrentSessionSql, transaction as unknown as SessionSqlDatabase),
332
314
  ),
333
315
  (sessionStepUpPersistence) => ({
334
316
  sessionStepUpPersistence: target.of(sessionStepUpPersistence),
@@ -17,6 +17,7 @@ import type {
17
17
  EmailSignInMapping,
18
18
  } from "./email-model";
19
19
  import type { EmailRegistrationAuthority } from "./email-registration";
20
+ import { CurrentEmailSql } from "./email-sql";
20
21
  import type { EmailSqlQuery } from "./email-sql";
21
22
  import {
22
23
  coordinateTargetEmailAddress,
@@ -26,8 +27,14 @@ import {
26
27
  makeTargetEmailSignInServices,
27
28
  type EmailTargetConfiguration,
28
29
  } from "./email-target";
30
+ import { nativeDatabase } from "./native-database";
29
31
  import type { ProofPersistenceMapping } from "./proof-model";
30
32
  import type { ProofSqlQuery } from "./proof-sql";
33
+ import {
34
+ type TransactionService,
35
+ acquireTransactionService,
36
+ transactionService,
37
+ } from "./standalone-guard";
31
38
  import type { SuppliedService } from "./SuppliedService";
32
39
 
33
40
  export type SqliteEmailDatabase =
@@ -73,13 +80,24 @@ export const sqliteEmailConfiguration = (
73
80
  });
74
81
 
75
82
  export const makeSqliteEmailTarget = <
83
+ DatabaseId,
76
84
  D extends SqliteEmailDatabase,
77
85
  Synchronous extends boolean = false,
78
86
  >(
79
- configuration: EmailTargetConfiguration | ((database: D) => EmailTargetConfiguration),
87
+ databaseService: Context.Service<DatabaseId, D>,
88
+ configuration:
89
+ | EmailTargetConfiguration
90
+ | ((service: TransactionService | undefined) => EmailTargetConfiguration),
80
91
  ) => {
81
92
  const configurationFor = (database: D) =>
82
- typeof configuration === "function" ? configuration(database) : configuration;
93
+ typeof configuration === "function"
94
+ ? configuration(transactionService(database))
95
+ : configuration;
96
+
97
+ const standaloneConfiguration =
98
+ typeof configuration === "function"
99
+ ? Effect.map(acquireTransactionService(databaseService), configuration)
100
+ : Effect.succeed(configuration);
83
101
 
84
102
  function coordinateEmailAddress<
85
103
  Database extends D,
@@ -325,9 +343,11 @@ export const makeSqliteEmailTarget = <
325
343
  C extends AnySQLiteTable,
326
344
  NativeId,
327
345
  >(
328
- database: D,
329
346
  mapping: EmailSignInMapping<S, I, C, NativeId>,
330
- ) => makeTargetEmailSignInServices(database, mapping, configurationFor(database)),
347
+ ) =>
348
+ Effect.flatMap(standaloneConfiguration, (configuration) =>
349
+ makeTargetEmailSignInServices(mapping, configuration),
350
+ ).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(databaseService))),
331
351
  makeEmailAddressServices: <
332
352
  S extends AnySQLiteTable,
333
353
  I extends AnySQLiteTable,
@@ -336,11 +356,12 @@ export const makeSqliteEmailTarget = <
336
356
  M extends AnySQLiteTable,
337
357
  NativeId,
338
358
  >(
339
- database: D,
340
359
  mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>,
341
360
  proofMapping: ProofMapping,
342
361
  ) =>
343
- makeTargetEmailAddressServices(database, mapping, proofMapping, configurationFor(database)),
362
+ Effect.flatMap(standaloneConfiguration, (configuration) =>
363
+ makeTargetEmailAddressServices(mapping, proofMapping, configuration),
364
+ ).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(databaseService))),
344
365
  coordinateEmailAddress,
345
366
  makeEmailRegistrationServices: <
346
367
  Registration,
@@ -351,16 +372,12 @@ export const makeSqliteEmailTarget = <
351
372
  Rq extends AnySQLiteTable,
352
373
  NativeId,
353
374
  >(
354
- database: D,
355
375
  mapping: EmailRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,
356
376
  proofMapping: ProofMapping,
357
377
  ) =>
358
- makeTargetEmailRegistrationServices<Registration>(
359
- database,
360
- mapping,
361
- proofMapping,
362
- configurationFor(database),
363
- ),
378
+ Effect.flatMap(standaloneConfiguration, (configuration) =>
379
+ makeTargetEmailRegistrationServices<Registration>(mapping, proofMapping, configuration),
380
+ ).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(databaseService))),
364
381
  coordinateEmailRegistration,
365
382
  };
366
383
  };
@@ -1,3 +1,4 @@
1
+ import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
1
2
  import {
2
3
  ExternalIdentityMutation,
3
4
  type ExternalIdentity,
@@ -10,7 +11,7 @@ import {
10
11
  import { reportPersistenceFailure } from "@yielded/auth/Persistence";
11
12
  import type { SubjectId } from "@yielded/auth/Schema";
12
13
  /* oxlint-disable no-explicit-any -- Drizzle generic query types are narrowed at this technology boundary. */
13
- import { and, eq, type AnyRelations } from "drizzle-orm";
14
+ import { and, eq } from "drizzle-orm";
14
15
  import type { QueryEffectHKTBase } from "drizzle-orm/effect-core";
15
16
  import type { AnySQLiteTable, SQLiteColumn } from "drizzle-orm/sqlite-core";
16
17
  import type { SQLiteEffectDatabase } from "drizzle-orm/sqlite-core/effect/db";
@@ -27,16 +28,7 @@ import {
27
28
  } from "./model";
28
29
 
29
30
  type ClosedQueryEffectHKT = QueryEffectHKTBase & { readonly context: never };
30
- type Database<HKT extends ClosedQueryEffectHKT, RunResult> = SQLiteEffectDatabase<
31
- HKT,
32
- RunResult,
33
- AnyRelations
34
- >;
35
- type RuntimeDatabase<HKT extends ClosedQueryEffectHKT, RunResult> = SQLiteEffectDatabase<
36
- HKT,
37
- RunResult,
38
- any
39
- >;
31
+ type RuntimeDatabase = SQLiteEffectDatabase<ClosedQueryEffectHKT, unknown, any>;
40
32
  const unavailable = () => IdentityUnavailable.make();
41
33
  const isIdentityFailure = Schema.is(Schema.Union([IdentityConflict, IdentityUnavailable]));
42
34
 
@@ -49,19 +41,18 @@ const mapUnavailable = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
49
41
  ),
50
42
  );
51
43
 
52
- export const makeSqliteSubjectProvisioningServices = <
44
+ export const makeSqliteSubjectProvisioningServices = Effect.fnUntraced(function* <
53
45
  Subject extends AnySQLiteTable,
54
46
  Identifier extends AnySQLiteTable,
55
47
  Request extends AnySQLiteTable,
56
48
  NativeId,
57
- HKT extends ClosedQueryEffectHKT = ClosedQueryEffectHKT,
58
- RunResult = unknown,
59
49
  >(
60
- database: Database<HKT, RunResult>,
61
50
  mapping: SubjectProvisioningTables<Subject, Identifier, Request, NativeId>,
62
51
  mode: "interactive" | "synchronous",
63
- ) => {
64
- const db = database as RuntimeDatabase<HKT, RunResult>;
52
+ ) {
53
+ const database = yield* NativeDatabase;
54
+
55
+ const db = database as unknown as RuntimeDatabase;
65
56
  const requestTable = mapping.provisioningRequest.table;
66
57
 
67
58
  const requestIdColumn = column(
@@ -158,14 +149,7 @@ export const makeSqliteSubjectProvisioningServices = <
158
149
 
159
150
  const nativeId = yield* attempt.pipe(
160
151
  Effect.catchCause(
161
- (
162
- cause,
163
- ): Effect.Effect<
164
- NativeId,
165
- | Effect.Error<typeof attempt>
166
- | Effect.Error<ReturnType<typeof findReceipt>>
167
- | IdentityConflict
168
- > => {
152
+ (cause): Effect.Effect<NativeId, Effect.Error<typeof attempt> | IdentityConflict> => {
169
153
  if (
170
154
  cause.reasons.length === 0 ||
171
155
  !cause.reasons.every(
@@ -207,19 +191,16 @@ export const makeSqliteSubjectProvisioningServices = <
207
191
  }, mapUnavailable);
208
192
 
209
193
  return { subjectProvisioner: SubjectProvisioner.of({ provision }) } as const;
210
- };
194
+ });
211
195
 
212
- export const makeSqliteExternalIdentityServices = <
196
+ export const makeSqliteExternalIdentityServices = Effect.fnUntraced(function* <
213
197
  Subject extends AnySQLiteTable,
214
198
  External extends AnySQLiteTable,
215
199
  NativeId,
216
- HKT extends ClosedQueryEffectHKT = ClosedQueryEffectHKT,
217
- RunResult = unknown,
218
- >(
219
- database: Database<HKT, RunResult>,
220
- mapping: ExternalIdentityTables<Subject, External, NativeId>,
221
- ) => {
222
- const db = database as RuntimeDatabase<HKT, RunResult>;
200
+ >(mapping: ExternalIdentityTables<Subject, External, NativeId>) {
201
+ const database = yield* NativeDatabase;
202
+
203
+ const db = database as unknown as RuntimeDatabase;
223
204
  const externalTable = mapping.externalIdentity.table;
224
205
 
225
206
  const externalProviderColumn = column(
@@ -324,21 +305,20 @@ export const makeSqliteExternalIdentityServices = <
324
305
  }, mapUnavailable);
325
306
 
326
307
  return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) } as const;
327
- };
308
+ });
328
309
 
329
- export const makeSqliteIdentityServices = <
310
+ export const makeSqliteIdentityServices = Effect.fnUntraced(function* <
330
311
  Subject extends AnySQLiteTable,
331
312
  Identifier extends AnySQLiteTable,
332
313
  External extends AnySQLiteTable,
333
314
  Request extends AnySQLiteTable,
334
315
  NativeId,
335
- HKT extends ClosedQueryEffectHKT = ClosedQueryEffectHKT,
336
- RunResult = unknown,
337
316
  >(
338
- database: Database<HKT, RunResult>,
339
317
  mapping: IdentityTables<Subject, Identifier, External, Request, NativeId>,
340
318
  mode: "interactive" | "synchronous",
341
- ) => ({
342
- ...makeSqliteSubjectProvisioningServices(database, mapping, mode),
343
- ...makeSqliteExternalIdentityServices(database, mapping),
319
+ ) {
320
+ return {
321
+ ...(yield* makeSqliteSubjectProvisioningServices(mapping, mode)),
322
+ ...(yield* makeSqliteExternalIdentityServices(mapping)),
323
+ };
344
324
  });
@@ -4,6 +4,7 @@ import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
4
4
  import { Effect, Context } from "effect";
5
5
  import type { SqlError } from "effect/sql/SqlError";
6
6
 
7
+ import { nativeDatabase } from "./native-database";
7
8
  import type {
8
9
  PasswordPreparedPersistenceMapping,
9
10
  PasswordPreparedProofMapping,
@@ -12,21 +13,38 @@ import {
12
13
  makeTargetPasswordPreparedPersistenceServices,
13
14
  coordinateTargetPasswordPreparedPersistence,
14
15
  } from "./password-prepared-target";
16
+ import { CurrentPasswordSql } from "./password-sql";
15
17
  import type { PasswordTargetConfiguration } from "./password-target";
16
18
  import type { SqlitePasswordDatabase } from "./sqlite-passwords";
19
+ import {
20
+ type TransactionService,
21
+ acquireTransactionService,
22
+ transactionService,
23
+ } from "./standalone-guard";
17
24
  import type { SuppliedService } from "./SuppliedService";
18
25
  type TransactionOf<D extends SqlitePasswordDatabase> = Parameters<
19
26
  Parameters<D["transaction"]>[0]
20
27
  >[0];
21
28
 
22
29
  export const makeSqlitePasswordPreparedTarget = <
30
+ DatabaseId,
23
31
  D extends SqlitePasswordDatabase,
24
32
  Synchronous extends boolean = false,
25
33
  >(
26
- configuration: PasswordTargetConfiguration | ((database: D) => PasswordTargetConfiguration),
34
+ databaseService: Context.Service<DatabaseId, D>,
35
+ configuration:
36
+ | PasswordTargetConfiguration
37
+ | ((service: TransactionService | undefined) => PasswordTargetConfiguration),
27
38
  ) => {
28
39
  const configurationFor = (database: D) =>
29
- typeof configuration === "function" ? configuration(database) : configuration;
40
+ typeof configuration === "function"
41
+ ? configuration(transactionService(database))
42
+ : configuration;
43
+
44
+ const standaloneConfiguration =
45
+ typeof configuration === "function"
46
+ ? Effect.map(acquireTransactionService(databaseService), configuration)
47
+ : Effect.succeed(configuration);
30
48
 
31
49
  function coordinatePasswordPreparedPersistence<
32
50
  Database extends D,
@@ -245,16 +263,12 @@ export const makeSqlitePasswordPreparedTarget = <
245
263
  PCr extends AnySQLiteTable = AnySQLiteTable,
246
264
  PNativeId = unknown,
247
265
  >(
248
- database: D,
249
266
  mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, A, RS, CE, M, T, B, NativeId>,
250
267
  proofMapping?: PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>,
251
268
  ) =>
252
- makeTargetPasswordPreparedPersistenceServices(
253
- database,
254
- mapping,
255
- configurationFor(database),
256
- proofMapping,
257
- ),
269
+ Effect.flatMap(standaloneConfiguration, (configuration) =>
270
+ makeTargetPasswordPreparedPersistenceServices(mapping, configuration, proofMapping),
271
+ ).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(databaseService))),
258
272
  coordinatePasswordPreparedPersistence,
259
273
  };
260
274
  };
@@ -11,8 +11,10 @@ import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
11
11
  import { Effect, Context } from "effect";
12
12
  import type { SqlError } from "effect/sql/SqlError";
13
13
 
14
+ import { nativeDatabase } from "./native-database";
14
15
  import type { PasswordPersistenceMapping, PasswordRegistrationMapping } from "./password-model";
15
16
  import type { PasswordRegistrationAuthority } from "./password-registration";
17
+ import { CurrentPasswordSql } from "./password-sql";
16
18
  import type { PasswordSqlQuery } from "./password-sql";
17
19
  import {
18
20
  coordinateTargetPasswordPersistence,
@@ -23,6 +25,11 @@ import {
23
25
  } from "./password-target";
24
26
  import type { ProofPersistenceMapping } from "./proof-model";
25
27
  import type { ProofSqlQuery } from "./proof-sql";
28
+ import {
29
+ type TransactionService,
30
+ acquireTransactionService,
31
+ transactionService,
32
+ } from "./standalone-guard";
26
33
  import type { SuppliedService } from "./SuppliedService";
27
34
 
28
35
  export type SqlitePasswordDatabase =
@@ -79,7 +86,6 @@ export const makeSqlitePasswordPersistenceServices = <
79
86
  M extends AnySQLiteTable,
80
87
  NativeId,
81
88
  >(
82
- database: SqlitePasswordDatabase,
83
89
  mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>,
84
90
  configuration: PasswordTargetConfiguration,
85
91
  proofMapping?: ProofPersistenceMapping<
@@ -96,7 +102,7 @@ export const makeSqlitePasswordPersistenceServices = <
96
102
  any,
97
103
  any
98
104
  >,
99
- ) => makeTargetPasswordPersistenceServices(database, mapping, configuration, proofMapping);
105
+ ) => makeTargetPasswordPersistenceServices(mapping, configuration, proofMapping);
100
106
 
101
107
  export const coordinateSqlitePasswordPersistence = <
102
108
  D extends SqlitePasswordDatabase,
@@ -142,10 +148,9 @@ export const makeSqlitePasswordRegistrationServices = <
142
148
  Rq extends AnySQLiteTable,
143
149
  NativeId,
144
150
  >(
145
- database: SqlitePasswordDatabase,
146
151
  mapping: PasswordRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,
147
152
  configuration: PasswordTargetConfiguration,
148
- ) => makeTargetPasswordRegistrationServices<Registration>(database, mapping, configuration);
153
+ ) => makeTargetPasswordRegistrationServices<Registration>(mapping, configuration);
149
154
 
150
155
  export const coordinateSqlitePasswordRegistration = <
151
156
  Registration,
@@ -176,13 +181,24 @@ export const coordinateSqlitePasswordRegistration = <
176
181
  );
177
182
 
178
183
  export const makeSqlitePasswordTarget = <
184
+ DatabaseId,
179
185
  D extends SqlitePasswordDatabase,
180
186
  Synchronous extends boolean = false,
181
187
  >(
182
- configuration: PasswordTargetConfiguration | ((database: D) => PasswordTargetConfiguration),
188
+ databaseService: Context.Service<DatabaseId, D>,
189
+ configuration:
190
+ | PasswordTargetConfiguration
191
+ | ((service: TransactionService | undefined) => PasswordTargetConfiguration),
183
192
  ) => {
184
193
  const configurationFor = (database: D) =>
185
- typeof configuration === "function" ? configuration(database) : configuration;
194
+ typeof configuration === "function"
195
+ ? configuration(transactionService(database))
196
+ : configuration;
197
+
198
+ const standaloneConfiguration =
199
+ typeof configuration === "function"
200
+ ? Effect.map(acquireTransactionService(databaseService), configuration)
201
+ : Effect.succeed(configuration);
186
202
 
187
203
  function coordinatePasswordPersistence<
188
204
  Database extends D,
@@ -456,7 +472,6 @@ export const makeSqlitePasswordTarget = <
456
472
  M extends AnySQLiteTable,
457
473
  NativeId,
458
474
  >(
459
- database: D,
460
475
  mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>,
461
476
  proofMapping?: ProofPersistenceMapping<
462
477
  any,
@@ -473,12 +488,9 @@ export const makeSqlitePasswordTarget = <
473
488
  any
474
489
  >,
475
490
  ) =>
476
- makeSqlitePasswordPersistenceServices(
477
- database,
478
- mapping,
479
- configurationFor(database),
480
- proofMapping,
481
- ),
491
+ Effect.flatMap(standaloneConfiguration, (configuration) =>
492
+ makeSqlitePasswordPersistenceServices(mapping, configuration, proofMapping),
493
+ ).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(databaseService))),
482
494
  coordinatePasswordPersistence,
483
495
  makePasswordRegistrationServices: <
484
496
  Registration,
@@ -489,9 +501,11 @@ export const makeSqlitePasswordTarget = <
489
501
  Rq extends AnySQLiteTable,
490
502
  NativeId,
491
503
  >(
492
- database: D,
493
504
  mapping: PasswordRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,
494
- ) => makeSqlitePasswordRegistrationServices(database, mapping, configurationFor(database)),
505
+ ) =>
506
+ Effect.flatMap(standaloneConfiguration, (configuration) =>
507
+ makeSqlitePasswordRegistrationServices(mapping, configuration),
508
+ ).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(databaseService))),
495
509
  coordinatePasswordRegistration,
496
510
  };
497
511
  };