@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,12 +15,15 @@ import type { AnyPgTable } from "drizzle-orm/pg-core";
15
15
  import { Effect, Context } from "effect";
16
16
  import type { SqlError } from "effect/sql/SqlError";
17
17
 
18
+ import { nativeDatabase } from "./native-database";
19
+ import { Database as DatabaseService } from "./pg-database";
18
20
  import type {
19
21
  AuthenticationAuthorityMapping,
20
22
  PendingAuthenticationMapping,
21
23
  SignedSessionValidityMapping,
22
24
  StatefulSessionMapping,
23
25
  } from "./session-model";
26
+ import { CurrentSessionSql } from "./session-sql";
24
27
  import {
25
28
  coordinateTargetAuthenticationAuthority,
26
29
  coordinateTargetPendingAuthentication,
@@ -34,15 +37,20 @@ import {
34
37
  makeTargetSessionStepUpServices,
35
38
  coordinateTargetSessionStepUp,
36
39
  } from "./session-target";
40
+ import {
41
+ type TransactionService,
42
+ acquireTransactionService,
43
+ transactionService,
44
+ } from "./standalone-guard";
37
45
  import type { SuppliedService } from "./SuppliedService";
38
46
 
39
47
  type Database = PostgresDatabase<AnyRelations> | PgliteDatabase<AnyRelations>;
40
48
  type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
41
49
 
42
- const configuration = (database: Database) => ({
50
+ const configuration = (service: TransactionService | undefined) => ({
43
51
  mode: "interactive" as const,
44
52
  locking: true,
45
- standaloneGuard: sqlClientSessionStandaloneGuard(database),
53
+ standaloneGuard: sqlClientSessionStandaloneGuard(service),
46
54
  });
47
55
 
48
56
  export const makePgAuthenticationAuthorityServices = <
@@ -53,7 +61,6 @@ export const makePgAuthenticationAuthorityServices = <
53
61
  Pending extends AnyPgTable,
54
62
  NativeSubjectId,
55
63
  >(
56
- database: Database,
57
64
  mapping: AuthenticationAuthorityMapping<
58
65
  Claims,
59
66
  Subject,
@@ -62,7 +69,11 @@ export const makePgAuthenticationAuthorityServices = <
62
69
  Pending,
63
70
  NativeSubjectId
64
71
  >,
65
- ) => makeTargetAuthenticationAuthorityServices<Claims>(database, mapping, configuration(database));
72
+ ) =>
73
+ Effect.flatMap(
74
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
75
+ (configuration) => makeTargetAuthenticationAuthorityServices<Claims>(mapping, configuration),
76
+ ).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(DatabaseService)));
66
77
 
67
78
  export const makePgPendingAuthenticationServices = <
68
79
  Claims,
@@ -72,7 +83,6 @@ export const makePgPendingAuthenticationServices = <
72
83
  Flow extends AnyPgTable,
73
84
  NativeSubjectId,
74
85
  >(
75
- database: Database,
76
86
  mapping: PendingAuthenticationMapping<
77
87
  Claims,
78
88
  Subject,
@@ -81,7 +91,11 @@ export const makePgPendingAuthenticationServices = <
81
91
  Flow,
82
92
  NativeSubjectId
83
93
  >,
84
- ) => makeTargetPendingAuthenticationServices<Claims>(database, mapping, configuration(database));
94
+ ) =>
95
+ Effect.flatMap(
96
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
97
+ (configuration) => makeTargetPendingAuthenticationServices<Claims>(mapping, configuration),
98
+ ).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(DatabaseService)));
85
99
 
86
100
  export const makePgStatefulSessionServices = <
87
101
  Claims,
@@ -93,7 +107,6 @@ export const makePgStatefulSessionServices = <
93
107
  NativeSubjectId,
94
108
  NativeSessionId,
95
109
  >(
96
- database: Database,
97
110
  mapping: StatefulSessionMapping<
98
111
  Claims,
99
112
  Subject,
@@ -104,7 +117,11 @@ export const makePgStatefulSessionServices = <
104
117
  NativeSubjectId,
105
118
  NativeSessionId
106
119
  >,
107
- ) => makeTargetStatefulSessionServices<Claims>(database, mapping, configuration(database));
120
+ ) =>
121
+ Effect.flatMap(
122
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
123
+ (configuration) => makeTargetStatefulSessionServices<Claims>(mapping, configuration),
124
+ ).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(DatabaseService)));
108
125
 
109
126
  export const makePgSignedSessionValidityServices = <
110
127
  Subject extends AnyPgTable,
@@ -112,9 +129,12 @@ export const makePgSignedSessionValidityServices = <
112
129
  NativeSubjectId,
113
130
  NativeSessionId,
114
131
  >(
115
- database: Database,
116
132
  mapping: SignedSessionValidityMapping<Subject, Tombstone, NativeSubjectId, NativeSessionId>,
117
- ) => makeTargetSignedSessionValidityServices(database, mapping, configuration(database));
133
+ ) =>
134
+ Effect.flatMap(
135
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
136
+ (configuration) => makeTargetSignedSessionValidityServices(mapping, configuration),
137
+ ).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(DatabaseService)));
118
138
 
119
139
  export function coordinatePgAuthenticationAuthority<
120
140
  Claims,
@@ -207,7 +227,7 @@ export function coordinatePgAuthenticationAuthority<
207
227
  >(
208
228
  database,
209
229
  options.mapping,
210
- configuration(database),
230
+ configuration(transactionService(database)),
211
231
  (
212
232
  transaction: TransactionOf<D>,
213
233
  services: { readonly authenticationAuthority: AuthenticationAuthority["Service"] },
@@ -314,7 +334,7 @@ export function coordinatePgPendingAuthentication<
314
334
  coordinateTargetPendingAuthentication<Claims, TransactionOf<D>, A, E, Exclude<R, TargetId>>(
315
335
  database,
316
336
  options.mapping,
317
- configuration(database),
337
+ configuration(transactionService(database)),
318
338
  (
319
339
  transaction: TransactionOf<D>,
320
340
  services: { readonly pendingAuthentication: PendingAuthentication<Claims> },
@@ -466,7 +486,7 @@ export function coordinatePgStatefulSessions<
466
486
  >(
467
487
  database,
468
488
  options.mapping,
469
- configuration(database),
489
+ configuration(transactionService(database)),
470
490
  (
471
491
  transaction: TransactionOf<D>,
472
492
  services: {
@@ -574,7 +594,7 @@ export function coordinatePgSignedSessionValidity<
574
594
  coordinateTargetSignedSessionValidity<TransactionOf<D>, A, E, Exclude<R, TargetId>>(
575
595
  database,
576
596
  options.mapping,
577
- configuration(database),
597
+ configuration(transactionService(database)),
578
598
  (
579
599
  transaction: TransactionOf<D>,
580
600
  services: { readonly signedSessionValidity: SignedSessionValidity },
@@ -603,10 +623,13 @@ export const makePgSessionStepUpServices = <
603
623
  NativeId,
604
624
  NativeSessionId,
605
625
  >(
606
- database: Database,
607
626
  mapping: SessionStepUpMapping<NoInfer<Claims>, S, C, I, Session, T, NativeId, NativeSessionId>,
608
627
  target: Context.Service<Id, SessionStepUpPersistence<Claims>>,
609
- ) => makeTargetSessionStepUpServices(database, mapping, target, configuration(database));
628
+ ) =>
629
+ Effect.flatMap(
630
+ Effect.map(acquireTransactionService(DatabaseService), configuration),
631
+ (configuration) => makeTargetSessionStepUpServices(mapping, target, configuration),
632
+ ).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(DatabaseService)));
610
633
 
611
634
  export function coordinatePgSessionStepUp<
612
635
  Claims,
@@ -733,7 +756,7 @@ export function coordinatePgSessionStepUp<
733
756
  database,
734
757
  options.mapping,
735
758
  options.target,
736
- configuration(database),
759
+ configuration(transactionService(database)),
737
760
  (
738
761
  transaction: TransactionOf<D>,
739
762
  services: { readonly sessionStepUpPersistence: SessionStepUpPersistence<Claims> },
@@ -1,4 +1,5 @@
1
1
  import { randomId } from "@yielded/auth-crypto";
2
+ import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
2
3
  import { LifecycleHooks } from "@yielded/auth/Hooks";
3
4
  import {
4
5
  PhoneConfigurationError,
@@ -21,6 +22,7 @@ import type { Statement } from "effect/sql/Statement";
21
22
  import { CurrentD1PlanningDatabase } from "./d1-planning";
22
23
  import { compileD1ProofCompletionPlan } from "./d1-proofs";
23
24
  import type { PersistenceMappingError } from "./model";
25
+ import { nativeDatabase } from "./native-database";
24
26
  import {
25
27
  phoneProofs,
26
28
  type PhoneMapping,
@@ -59,8 +61,8 @@ export type PhoneCoordinatorError<E> =
59
61
  | PersistenceMappingError;
60
62
 
61
63
  export const sqlClientPhoneStandaloneGuard = (
62
- database: Parameters<typeof sqlClientTransactionStandaloneGuard>[1],
63
- ) => sqlClientTransactionStandaloneGuard(unavailable, database);
64
+ service: Parameters<typeof sqlClientTransactionStandaloneGuard>[1],
65
+ ) => sqlClientTransactionStandaloneGuard(unavailable, service);
64
66
 
65
67
  const validateMapping = <M>(original: M, configuration: PhoneTargetConfiguration): M => {
66
68
  const mapping = original as any;
@@ -95,12 +97,13 @@ const validateMapping = <M>(original: M, configuration: PhoneTargetConfiguration
95
97
  });
96
98
  };
97
99
 
98
- const services = (
100
+ const services = Effect.fnUntraced(function* (
99
101
  mapping: any,
100
102
  execution: TransactionExecution<PhoneUnavailable, CurrentPhoneTransaction>,
101
- hooks: LifecycleHooks["Service"],
102
103
  configuration: PhoneTargetConfiguration,
103
- ): PhonePersistenceServices => {
104
+ ): Effect.fn.Return<PhonePersistenceServices, never, LifecycleHooks> {
105
+ const hooks = yield* LifecycleHooks;
106
+
104
107
  const run = <A, E, R>(effect: Effect.Effect<A, E, R>, mutation = true) =>
105
108
  execution.admit.pipe(
106
109
  Effect.andThen(execution.run(effect, mutation)),
@@ -253,7 +256,7 @@ const services = (
253
256
  }).pipe(Effect.catchDefect(() => Effect.fail(unavailable()))),
254
257
  }),
255
258
  };
256
- };
259
+ });
257
260
 
258
261
  export const makeTargetPhonePersistence = <
259
262
  S extends Table,
@@ -263,12 +266,10 @@ export const makeTargetPhonePersistence = <
263
266
  N,
264
267
  RSetup = never,
265
268
  >(
266
- database: TransactionNativeDatabase,
267
269
  source: PhoneMappingSource<PhoneMapping<S, I, C, F, N>, RSetup>,
268
270
  configuration: PhoneTargetConfiguration,
269
271
  ) =>
270
272
  Effect.gen(function* () {
271
- const hooks = yield* LifecycleHooks;
272
273
  const original = yield* Effect.isEffect(source) ? source : Effect.succeed(source);
273
274
 
274
275
  const mapping = yield* Effect.try({
@@ -276,15 +277,14 @@ export const makeTargetPhonePersistence = <
276
277
  catch: () => PhoneConfigurationError.make({}),
277
278
  });
278
279
 
279
- const execution = makeTransactionExecution(
280
+ const execution = yield* makeTransactionExecution(
280
281
  CurrentPhoneTransaction,
281
- database,
282
282
  configuration,
283
283
  unavailable,
284
284
  randomId,
285
285
  );
286
286
 
287
- return services(mapping, execution, hooks, configuration);
287
+ return yield* services(mapping, execution, configuration);
288
288
  });
289
289
 
290
290
  export const coordinateTargetPhone = <M, A, E, R, RSetup = never>(
@@ -298,7 +298,6 @@ export const coordinateTargetPhone = <M, A, E, R, RSetup = never>(
298
298
  ) => Effect.Effect<A, E, R>,
299
299
  ): Effect.Effect<A, PhoneCoordinatorError<E>, R | RSetup | LifecycleHooks> =>
300
300
  Effect.gen(function* () {
301
- const hooks = yield* LifecycleHooks;
302
301
  const original = yield* Effect.isEffect(source) ? source : Effect.succeed(source);
303
302
 
304
303
  const mapping = yield* Effect.try({
@@ -313,8 +312,11 @@ export const coordinateTargetPhone = <M, A, E, R, RSetup = never>(
313
312
  Effect.void,
314
313
  unavailable,
315
314
  randomId,
316
- (execution) => services(mapping, execution, hooks, configuration),
317
- body,
315
+ (execution) => services(mapping, execution, configuration),
316
+ (transaction, acquireServices, append) =>
317
+ Effect.flatMap(acquireServices, (boundServices) =>
318
+ body(transaction, boundServices, append),
319
+ ),
318
320
  );
319
321
  });
320
322
 
@@ -324,11 +326,13 @@ type TransactionOf<D> = D extends { readonly transaction: (...args: any[]) => an
324
326
 
325
327
  /** Concrete driver wrappers select transaction mode; cryptography always precedes these owners. */
326
328
  export const makePhoneTarget = <
329
+ DatabaseId,
327
330
  D extends { readonly transaction: any },
328
331
  T extends Table,
329
332
  Extra = unknown,
330
333
  Synchronous extends boolean = false,
331
334
  >(
335
+ databaseService: Context.Service<DatabaseId, D>,
332
336
  configuration: PhoneTargetConfiguration,
333
337
  ) => {
334
338
  function coordinatePhonePersistence<
@@ -456,7 +460,6 @@ export const makePhoneTarget = <
456
460
 
457
461
  return {
458
462
  makePhonePersistenceServices: <
459
- Database extends D,
460
463
  S extends T,
461
464
  I extends T,
462
465
  F extends T,
@@ -464,9 +467,11 @@ export const makePhoneTarget = <
464
467
  N,
465
468
  RSetup = never,
466
469
  >(
467
- database: Database,
468
470
  mapping: PhoneMappingSource<PhoneMapping<S, I, C, F, N> & Extra, RSetup>,
469
- ) => makeTargetPhonePersistence(database as any, mapping, configuration),
471
+ ) =>
472
+ makeTargetPhonePersistence(mapping, configuration).pipe(
473
+ Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService)),
474
+ ),
470
475
  coordinatePhonePersistence,
471
476
  };
472
477
  };
@@ -10,12 +10,13 @@ import { Effect, Layer } from "effect";
10
10
  import type * as SqlError from "effect/sql/SqlError";
11
11
 
12
12
  import {
13
+ CurrentProofSql,
13
14
  makeSqlProofPersistence,
14
15
  type ProofSqlConfiguration,
15
16
  type ProofSqlDatabase,
16
17
  type ProofSqlQuery,
17
18
  } from "./proof-sql";
18
- import { sqlClientStandaloneGuard } from "./standalone-guard";
19
+ import { sqlClientStandaloneGuard, type TransactionService } from "./standalone-guard";
19
20
 
20
21
  export interface ProofTargetConfiguration {
21
22
  readonly mode: "interactive" | "synchronous";
@@ -42,9 +43,9 @@ export type ProofCoordinatorError<E> =
42
43
  | SqlError.SqlError;
43
44
 
44
45
  export const sqlClientProofStandaloneGuard = (
45
- database: unknown,
46
+ service: TransactionService | undefined,
46
47
  ): Effect.Effect<void, ProofUnavailable> =>
47
- sqlClientStandaloneGuard(database, () => ProofUnavailable.make({}));
48
+ sqlClientStandaloneGuard(service, () => ProofUnavailable.make({}));
48
49
 
49
50
  const options = (
50
51
  configuration: ProofTargetConfiguration,
@@ -59,13 +60,12 @@ const options = (
59
60
  });
60
61
 
61
62
  export const makeTargetProofPersistenceServices = (
62
- database: any,
63
63
  mapping: any,
64
64
  configuration: ProofTargetConfiguration,
65
65
  ) =>
66
66
  Effect.gen(function* () {
67
67
  return {
68
- proofPersistence: yield* makeSqlProofPersistence(database, mapping, options(configuration)),
68
+ proofPersistence: yield* makeSqlProofPersistence(mapping, options(configuration)),
69
69
  };
70
70
  });
71
71
 
@@ -96,9 +96,10 @@ export const coordinateTargetProofPersistence = <Transaction, A, E, R>(
96
96
  Effect.gen(function* () {
97
97
  return yield* owner(transaction, {
98
98
  proofPersistence: yield* makeSqlProofPersistence(
99
- transaction as unknown as ProofSqlDatabase,
100
99
  mapping,
101
100
  options(configuration, true),
101
+ ).pipe(
102
+ Effect.provideService(CurrentProofSql, transaction as unknown as ProofSqlDatabase),
102
103
  ),
103
104
  });
104
105
  }),
@@ -109,12 +110,8 @@ export const coordinateTargetProofPersistence = <Transaction, A, E, R>(
109
110
  return result.value;
110
111
  });
111
112
 
112
- export const proofPersistenceLayer = (
113
- services: Effect.Effect<
114
- { readonly proofPersistence: ProofPersistence["Service"] },
115
- never,
116
- LifecycleHooks
117
- >,
113
+ export const proofPersistenceLayer = <E, R>(
114
+ services: Effect.Effect<{ readonly proofPersistence: ProofPersistence["Service"] }, E, R>,
118
115
  ) =>
119
116
  Layer.effect(
120
117
  ProofPersistence,
@@ -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),