@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
@@ -56,6 +56,7 @@ import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
56
56
  import { Cause, DateTime, Effect, Option, Predicate, Redacted, Schema, Context } from "effect";
57
57
  import type { Statement } from "effect/sql/Statement";
58
58
 
59
+ import { Database as DatabaseService } from "./d1-database";
59
60
  import { balancedD1And } from "./d1-generated-statement";
60
61
  import { CurrentD1PlanningDatabase, makeD1Owner } from "./d1-planning";
61
62
  import { compileD1ProofCompletionPlan, type D1ProtectedProofMutation } from "./d1-proofs";
@@ -1980,7 +1981,7 @@ const cleanupPlan = Effect.fn("Drizzle.cleanupPlan")(function* <A>(
1980
1981
  };
1981
1982
  });
1982
1983
 
1983
- export const makeD1PasswordPersistenceServices = <
1984
+ export const makeD1PasswordPersistenceServices = Effect.fnUntraced(function* <
1984
1985
  S extends AnySQLiteTable,
1985
1986
  I extends AnySQLiteTable,
1986
1987
  C extends AnySQLiteTable,
@@ -1991,7 +1992,6 @@ export const makeD1PasswordPersistenceServices = <
1991
1992
  M extends AnySQLiteTable,
1992
1993
  NativeId,
1993
1994
  >(
1994
- database: Database,
1995
1995
  mapping: D1PasswordPersistenceMapping<S, I, C, AC, A, RS, CE, M, NativeId>,
1996
1996
  proofMapping?: D1ProofPersistenceMapping<
1997
1997
  any,
@@ -2007,62 +2007,62 @@ export const makeD1PasswordPersistenceServices = <
2007
2007
  any,
2008
2008
  any
2009
2009
  >,
2010
- ) =>
2011
- Effect.gen(function* () {
2012
- const hooks = yield* LifecycleHooks;
2013
- const plans = makePasswordPlans(mapping as unknown as Mapping, proofMapping);
2010
+ ) {
2011
+ const database = yield* DatabaseService;
2014
2012
 
2015
- const run = <Out, Err, Env>(plan: Effect.Effect<Planned<Out>, Err, Env>) =>
2016
- Effect.gen(function* () {
2017
- if (yield* hasCommitScope) return yield* unavailable();
2013
+ const hooks = yield* LifecycleHooks;
2014
+ const plans = makePasswordPlans(mapping as unknown as Mapping, proofMapping);
2018
2015
 
2019
- return yield* executeStandalone(plan, 2);
2020
- }).pipe(
2021
- Effect.provideService(CurrentD1PlanningDatabase, database),
2022
- Effect.provideService(LifecycleHooks, hooks),
2023
- );
2024
-
2025
- const service: PasswordPersistence["Service"] = {
2026
- admitAttempt: (input, prepare) =>
2027
- run(plans.admitAttempt(input, prepare)).pipe(translateFailure),
2028
- settleAttempt: (input, prepare) =>
2029
- run(plans.settleAttempt(input, prepare)).pipe(translateFailure),
2030
- readForSubject: (input) =>
2031
- plans
2032
- .readForSubject(input)
2033
- .pipe(
2034
- Effect.provideService(CurrentD1PlanningDatabase, database),
2035
- Effect.provideService(LifecycleHooks, hooks),
2036
- translateFailure,
2037
- ),
2038
- recoveryTarget: (input) =>
2039
- plans
2040
- .recoveryTarget(input)
2041
- .pipe(
2042
- Effect.provideService(CurrentD1PlanningDatabase, database),
2043
- Effect.provideService(LifecycleHooks, hooks),
2044
- translateFailure,
2045
- ),
2046
- addIfAbsent: (input, prepare) =>
2047
- run(plans.addIfAbsent(input, prepare)).pipe(translateFailure),
2048
- replaceIfCurrent: (input, prepare) =>
2049
- run(plans.replaceIfCurrent(input, prepare)).pipe(translateFailure),
2050
- checkReset: (input) =>
2051
- plans
2052
- .checkReset(input)
2053
- .pipe(
2054
- Effect.provideService(CurrentD1PlanningDatabase, database),
2055
- Effect.provideService(LifecycleHooks, hooks),
2056
- translateFailure,
2057
- ),
2058
- resetWithProof: (input, prepare) =>
2059
- run(plans.resetWithProof(input, prepare)).pipe(translateFailure),
2060
- cleanupAttempts: (input, prepare) =>
2061
- run(plans.cleanupAttempts(input, prepare)).pipe(translateFailure),
2062
- };
2016
+ const run = <Out, Err, Env>(plan: Effect.Effect<Planned<Out>, Err, Env>) =>
2017
+ Effect.gen(function* () {
2018
+ if (yield* hasCommitScope) return yield* unavailable();
2063
2019
 
2064
- return { passwordPersistence: service };
2065
- });
2020
+ return yield* executeStandalone(plan, 2);
2021
+ }).pipe(
2022
+ Effect.provideService(CurrentD1PlanningDatabase, database),
2023
+ Effect.provideService(LifecycleHooks, hooks),
2024
+ );
2025
+
2026
+ const service: PasswordPersistence["Service"] = {
2027
+ admitAttempt: (input, prepare) =>
2028
+ run(plans.admitAttempt(input, prepare)).pipe(translateFailure),
2029
+ settleAttempt: (input, prepare) =>
2030
+ run(plans.settleAttempt(input, prepare)).pipe(translateFailure),
2031
+ readForSubject: (input) =>
2032
+ plans
2033
+ .readForSubject(input)
2034
+ .pipe(
2035
+ Effect.provideService(CurrentD1PlanningDatabase, database),
2036
+ Effect.provideService(LifecycleHooks, hooks),
2037
+ translateFailure,
2038
+ ),
2039
+ recoveryTarget: (input) =>
2040
+ plans
2041
+ .recoveryTarget(input)
2042
+ .pipe(
2043
+ Effect.provideService(CurrentD1PlanningDatabase, database),
2044
+ Effect.provideService(LifecycleHooks, hooks),
2045
+ translateFailure,
2046
+ ),
2047
+ addIfAbsent: (input, prepare) => run(plans.addIfAbsent(input, prepare)).pipe(translateFailure),
2048
+ replaceIfCurrent: (input, prepare) =>
2049
+ run(plans.replaceIfCurrent(input, prepare)).pipe(translateFailure),
2050
+ checkReset: (input) =>
2051
+ plans
2052
+ .checkReset(input)
2053
+ .pipe(
2054
+ Effect.provideService(CurrentD1PlanningDatabase, database),
2055
+ Effect.provideService(LifecycleHooks, hooks),
2056
+ translateFailure,
2057
+ ),
2058
+ resetWithProof: (input, prepare) =>
2059
+ run(plans.resetWithProof(input, prepare)).pipe(translateFailure),
2060
+ cleanupAttempts: (input, prepare) =>
2061
+ run(plans.cleanupAttempts(input, prepare)).pipe(translateFailure),
2062
+ };
2063
+
2064
+ return { passwordPersistence: service };
2065
+ });
2066
2066
 
2067
2067
  type CoordinatorError<E> = E | PasswordUnavailable | HookConfigurationError;
2068
2068
 
@@ -2443,7 +2443,7 @@ const makeRegistrationPlans = <Registration>(mapping: RegistrationMapping<Regist
2443
2443
  }),
2444
2444
  });
2445
2445
 
2446
- export const makeD1PasswordRegistrationServices = <
2446
+ export const makeD1PasswordRegistrationServices = Effect.fnUntraced(function* <
2447
2447
  Registration,
2448
2448
  S extends AnySQLiteTable,
2449
2449
  I extends AnySQLiteTable,
@@ -2451,30 +2451,28 @@ export const makeD1PasswordRegistrationServices = <
2451
2451
  AC extends AnySQLiteTable,
2452
2452
  Rq extends AnySQLiteTable,
2453
2453
  NativeId,
2454
- >(
2455
- database: Database,
2456
- mapping: PasswordRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,
2457
- ) =>
2458
- Effect.gen(function* () {
2459
- const hooks = yield* LifecycleHooks;
2460
- const plans = makeRegistrationPlans(mapping as unknown as RegistrationMapping<Registration>);
2454
+ >(mapping: PasswordRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>) {
2455
+ const database = yield* DatabaseService;
2461
2456
 
2462
- const run = <Out, Err, Env>(plan: Effect.Effect<Planned<Out>, Err, Env>) =>
2463
- Effect.gen(function* () {
2464
- if (yield* hasCommitScope) return yield* unavailable();
2457
+ const hooks = yield* LifecycleHooks;
2458
+ const plans = makeRegistrationPlans(mapping as unknown as RegistrationMapping<Registration>);
2465
2459
 
2466
- return yield* executeStandalone(plan, 2);
2467
- }).pipe(
2468
- Effect.provideService(CurrentD1PlanningDatabase, database),
2469
- Effect.provideService(LifecycleHooks, hooks),
2470
- );
2460
+ const run = <Out, Err, Env>(plan: Effect.Effect<Planned<Out>, Err, Env>) =>
2461
+ Effect.gen(function* () {
2462
+ if (yield* hasCommitScope) return yield* unavailable();
2471
2463
 
2472
- const service: PasswordRegistrationAuthority<Registration> = {
2473
- register: (input, prepare) => run(plans.register(input, prepare)).pipe(translateFailure),
2474
- };
2464
+ return yield* executeStandalone(plan, 2);
2465
+ }).pipe(
2466
+ Effect.provideService(CurrentD1PlanningDatabase, database),
2467
+ Effect.provideService(LifecycleHooks, hooks),
2468
+ );
2475
2469
 
2476
- return { registrationAuthority: service };
2477
- });
2470
+ const service: PasswordRegistrationAuthority<Registration> = {
2471
+ register: (input, prepare) => run(plans.register(input, prepare)).pipe(translateFailure),
2472
+ };
2473
+
2474
+ return { registrationAuthority: service };
2475
+ });
2478
2476
 
2479
2477
  export function coordinateD1PasswordRegistration<
2480
2478
  TargetId,
@@ -11,6 +11,7 @@ import type { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
11
11
  import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
12
12
  import { Context, Effect } from "effect";
13
13
 
14
+ import { Database as DatabaseService } from "./d1-database";
14
15
  import { makeD1Owner } from "./d1-planning";
15
16
  import { D1BatchStatements } from "./D1BatchStatements";
16
17
  import type { D1PhoneMapping, PhoneMapping, PhoneMappingSource } from "./phone-model";
@@ -26,7 +27,10 @@ const configuration = {
26
27
  };
27
28
 
28
29
  /** Reads use a primary D1 session; observations and expiry are asserted in the same batch. */
29
- const target = makePhoneTarget<Database, Table, D1PhoneMapping>(configuration);
30
+ const target = makePhoneTarget<DatabaseService, Database, Table, D1PhoneMapping>(
31
+ DatabaseService,
32
+ configuration,
33
+ );
30
34
 
31
35
  export const { makePhonePersistenceServices } = target;
32
36
 
@@ -47,6 +47,7 @@ import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
47
47
  import { Cause, Effect, Schema, Context } from "effect";
48
48
  import type { Statement } from "effect/sql/Statement";
49
49
 
50
+ import { Database as DatabaseService } from "./d1-database";
50
51
  import { balancedD1And } from "./d1-generated-statement";
51
52
  import { CurrentD1PlanningDatabase, makeD1Owner } from "./d1-planning";
52
53
  import { D1BatchStatements } from "./D1BatchStatements";
@@ -1985,7 +1986,7 @@ const makeProofPlans = (mapping: Mapping) => {
1985
1986
  };
1986
1987
  };
1987
1988
 
1988
- export const makeD1ProofPersistenceServices = <
1989
+ export const makeD1ProofPersistenceServices = Effect.fnUntraced(function* <
1989
1990
  Rq extends AnySQLiteTable,
1990
1991
  S extends AnySQLiteTable,
1991
1992
  G extends AnySQLiteTable,
@@ -1998,38 +1999,36 @@ export const makeD1ProofPersistenceServices = <
1998
1999
  I extends AnySQLiteTable,
1999
2000
  Cr extends AnySQLiteTable,
2000
2001
  NativeId,
2001
- >(
2002
- database: Database,
2003
- mapping: D1ProofPersistenceMapping<Rq, S, G, Cn, Rs, A, F, C, Sub, I, Cr, NativeId>,
2004
- ) =>
2005
- Effect.gen(function* () {
2006
- const hooks = yield* LifecycleHooks;
2007
- const plans = makeProofPlans(mapping as unknown as Mapping);
2008
-
2009
- const run = <Out, Err, Env>(plan: Effect.Effect<Planned<Out>, Err, Env>) =>
2010
- Effect.gen(function* () {
2011
- if (yield* hasCommitScope) return yield* unavailable();
2002
+ >(mapping: D1ProofPersistenceMapping<Rq, S, G, Cn, Rs, A, F, C, Sub, I, Cr, NativeId>) {
2003
+ const database = yield* DatabaseService;
2012
2004
 
2013
- return yield* executeStandalone(plan, 2);
2014
- }).pipe(
2015
- Effect.provideService(CurrentD1PlanningDatabase, database),
2016
- Effect.provideService(LifecycleHooks, hooks),
2017
- );
2005
+ const hooks = yield* LifecycleHooks;
2006
+ const plans = makeProofPlans(mapping as unknown as Mapping);
2018
2007
 
2019
- const service: ProofPersistence["Service"] = {
2020
- issue: (input, prepare) => run(plans.issue(input, prepare)).pipe(translateIssueFailure),
2021
- attempt: (input, prepare) => run(plans.attempt(input, prepare)).pipe(translateFailure),
2022
- complete: (input, prepare) => run(plans.complete(input, prepare)).pipe(translateFailure),
2023
- claimDelivery: (input, prepare) =>
2024
- run(plans.claimDelivery(input, prepare)).pipe(translateFailure),
2025
- settleDelivery: (input, prepare) =>
2026
- run(plans.settleDelivery(input, prepare)).pipe(translateFailure),
2027
- cancel: (input, prepare) => run(plans.cancel(input, prepare)).pipe(translateFailure),
2028
- cleanup: (input, prepare) => run(plans.cleanup(input, prepare)).pipe(translateFailure),
2029
- };
2008
+ const run = <Out, Err, Env>(plan: Effect.Effect<Planned<Out>, Err, Env>) =>
2009
+ Effect.gen(function* () {
2010
+ if (yield* hasCommitScope) return yield* unavailable();
2030
2011
 
2031
- return { proofPersistence: service };
2032
- });
2012
+ return yield* executeStandalone(plan, 2);
2013
+ }).pipe(
2014
+ Effect.provideService(CurrentD1PlanningDatabase, database),
2015
+ Effect.provideService(LifecycleHooks, hooks),
2016
+ );
2017
+
2018
+ const service: ProofPersistence["Service"] = {
2019
+ issue: (input, prepare) => run(plans.issue(input, prepare)).pipe(translateIssueFailure),
2020
+ attempt: (input, prepare) => run(plans.attempt(input, prepare)).pipe(translateFailure),
2021
+ complete: (input, prepare) => run(plans.complete(input, prepare)).pipe(translateFailure),
2022
+ claimDelivery: (input, prepare) =>
2023
+ run(plans.claimDelivery(input, prepare)).pipe(translateFailure),
2024
+ settleDelivery: (input, prepare) =>
2025
+ run(plans.settleDelivery(input, prepare)).pipe(translateFailure),
2026
+ cancel: (input, prepare) => run(plans.cancel(input, prepare)).pipe(translateFailure),
2027
+ cleanup: (input, prepare) => run(plans.cleanup(input, prepare)).pipe(translateFailure),
2028
+ };
2029
+
2030
+ return { proofPersistence: service };
2031
+ });
2033
2032
 
2034
2033
  type CoordinatorError<E> = E | ProofUnavailable | HookConfigurationError;
2035
2034
 
@@ -52,6 +52,7 @@ import { Cause, Context, Data, DateTime, Effect, Schema } from "effect";
52
52
  import type * as SqlError from "effect/sql/SqlError";
53
53
  import type { Statement } from "effect/sql/Statement";
54
54
 
55
+ import { Database as DatabaseService } from "./d1-database";
55
56
  import { compactD1GeneratedStatement } from "./d1-generated-statement";
56
57
  import {
57
58
  CurrentD1PlanningDatabase,
@@ -1622,8 +1623,9 @@ export const makeD1SignedValidity = (
1622
1623
  };
1623
1624
 
1624
1625
  export const makeD1SessionServiceEffects = {
1625
- authority: <Claims>(database: Database, mapping: any) =>
1626
+ authority: <Claims>(mapping: any) =>
1626
1627
  Effect.gen(function* () {
1628
+ const database = yield* CurrentD1PlanningDatabase;
1627
1629
  const hooks = yield* LifecycleHooks;
1628
1630
  const raw = makeD1AuthenticationAuthority<Claims>(mapping);
1629
1631
 
@@ -1649,8 +1651,9 @@ export const makeD1SessionServiceEffects = {
1649
1651
 
1650
1652
  return { authenticationAuthority };
1651
1653
  }),
1652
- pending: <Claims>(database: Database, mapping: any) =>
1654
+ pending: <Claims>(mapping: any) =>
1653
1655
  Effect.gen(function* () {
1656
+ const database = yield* CurrentD1PlanningDatabase;
1654
1657
  const hooks = yield* LifecycleHooks;
1655
1658
  const raw = makeD1PendingAuthentication<Claims>(mapping);
1656
1659
 
@@ -1677,8 +1680,9 @@ export const makeD1SessionServiceEffects = {
1677
1680
 
1678
1681
  return { pendingAuthentication };
1679
1682
  }),
1680
- stateful: <Claims>(database: Database, mapping: any) =>
1683
+ stateful: <Claims>(mapping: any) =>
1681
1684
  Effect.gen(function* () {
1685
+ const database = yield* CurrentD1PlanningDatabase;
1682
1686
  const hooks = yield* LifecycleHooks;
1683
1687
  const raw = makeD1StatefulSessions<Claims>(mapping);
1684
1688
 
@@ -1711,8 +1715,9 @@ export const makeD1SessionServiceEffects = {
1711
1715
 
1712
1716
  return { statefulSessionPersistence, sessionRepository };
1713
1717
  }),
1714
- validity: (database: Database, mapping: any) =>
1718
+ validity: (mapping: any) =>
1715
1719
  Effect.gen(function* () {
1720
+ const database = yield* CurrentD1PlanningDatabase;
1716
1721
  const hooks = yield* LifecycleHooks;
1717
1722
  const raw = makeD1SignedValidity(mapping);
1718
1723
 
@@ -1832,7 +1837,6 @@ export const makeD1AuthenticationAuthorityServices = <
1832
1837
  Pending extends AnySQLiteTable,
1833
1838
  NativeSubjectId,
1834
1839
  >(
1835
- database: Database,
1836
1840
  mapping: D1AuthenticationAuthorityMapping<
1837
1841
  Claims,
1838
1842
  Subject,
@@ -1841,7 +1845,10 @@ export const makeD1AuthenticationAuthorityServices = <
1841
1845
  Pending,
1842
1846
  NativeSubjectId
1843
1847
  >,
1844
- ) => makeD1SessionServiceEffects.authority<Claims>(database, mapping as any);
1848
+ ) =>
1849
+ makeD1SessionServiceEffects
1850
+ .authority<Claims>(mapping as any)
1851
+ .pipe(Effect.provideServiceEffect(CurrentD1PlanningDatabase, DatabaseService));
1845
1852
 
1846
1853
  export const makeD1PendingAuthenticationServices = <
1847
1854
  Claims,
@@ -1851,7 +1858,6 @@ export const makeD1PendingAuthenticationServices = <
1851
1858
  Flow extends AnySQLiteTable,
1852
1859
  NativeSubjectId,
1853
1860
  >(
1854
- database: Database,
1855
1861
  mapping: D1PendingAuthenticationMapping<
1856
1862
  Claims,
1857
1863
  Subject,
@@ -1860,7 +1866,10 @@ export const makeD1PendingAuthenticationServices = <
1860
1866
  Flow,
1861
1867
  NativeSubjectId
1862
1868
  >,
1863
- ) => makeD1SessionServiceEffects.pending<Claims>(database, mapping as any);
1869
+ ) =>
1870
+ makeD1SessionServiceEffects
1871
+ .pending<Claims>(mapping as any)
1872
+ .pipe(Effect.provideServiceEffect(CurrentD1PlanningDatabase, DatabaseService));
1864
1873
 
1865
1874
  export const makeD1StatefulSessionServices = <
1866
1875
  Claims,
@@ -1872,7 +1881,6 @@ export const makeD1StatefulSessionServices = <
1872
1881
  NativeSubjectId,
1873
1882
  NativeSessionId,
1874
1883
  >(
1875
- database: Database,
1876
1884
  mapping: D1StatefulSessionMapping<
1877
1885
  Claims,
1878
1886
  Subject,
@@ -1883,7 +1891,10 @@ export const makeD1StatefulSessionServices = <
1883
1891
  NativeSubjectId,
1884
1892
  NativeSessionId
1885
1893
  >,
1886
- ) => makeD1SessionServiceEffects.stateful<Claims>(database, mapping as any);
1894
+ ) =>
1895
+ makeD1SessionServiceEffects
1896
+ .stateful<Claims>(mapping as any)
1897
+ .pipe(Effect.provideServiceEffect(CurrentD1PlanningDatabase, DatabaseService));
1887
1898
 
1888
1899
  export const makeD1SignedSessionValidityServices = <
1889
1900
  Subject extends AnySQLiteTable,
@@ -1891,9 +1902,11 @@ export const makeD1SignedSessionValidityServices = <
1891
1902
  NativeSubjectId,
1892
1903
  NativeSessionId,
1893
1904
  >(
1894
- database: Database,
1895
1905
  mapping: D1SignedSessionValidityMapping<Subject, Tombstone, NativeSubjectId, NativeSessionId>,
1896
- ) => makeD1SessionServiceEffects.validity(database, mapping as any);
1906
+ ) =>
1907
+ makeD1SessionServiceEffects
1908
+ .validity(mapping as any)
1909
+ .pipe(Effect.provideServiceEffect(CurrentD1PlanningDatabase, DatabaseService));
1897
1910
 
1898
1911
  export function coordinateD1AuthenticationAuthority<
1899
1912
  Claims,
@@ -2733,7 +2746,7 @@ export const makeD1SessionStepUp = <Claims>(
2733
2746
  };
2734
2747
  };
2735
2748
 
2736
- export const makeD1SessionStepUpServices = <
2749
+ export const makeD1SessionStepUpServices = Effect.fnUntraced(function* <
2737
2750
  Claims,
2738
2751
  Id,
2739
2752
  S extends AnySQLiteTable,
@@ -2744,39 +2757,39 @@ export const makeD1SessionStepUpServices = <
2744
2757
  NativeId,
2745
2758
  NativeSessionId,
2746
2759
  >(
2747
- database: Database,
2748
2760
  mapping: D1SessionStepUpMapping<NoInfer<Claims>, S, C, I, Session, T, NativeId, NativeSessionId>,
2749
2761
  target: Context.Service<Id, SessionStepUpPersistence<Claims>>,
2750
- ) =>
2751
- Effect.gen(function* () {
2752
- const hooks = yield* LifecycleHooks;
2753
- const raw = makeD1SessionStepUp<Claims>(mapping as any);
2762
+ ) {
2763
+ const database = yield* DatabaseService;
2754
2764
 
2755
- const run = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
2756
- Effect.gen(function* () {
2757
- if (
2758
- (yield* Effect.serviceOption(CurrentD1SessionBatch))._tag === "Some" ||
2759
- (yield* hasCommitScope)
2760
- )
2761
- return yield* unavailable();
2765
+ const hooks = yield* LifecycleHooks;
2766
+ const raw = makeD1SessionStepUp<Claims>(mapping as any);
2762
2767
 
2763
- return yield* effect.pipe(
2764
- Effect.provideService(CurrentD1PlanningDatabase, database),
2765
- Effect.provideService(LifecycleHooks, hooks),
2766
- );
2767
- });
2768
-
2769
- const sessionStepUpPersistence = target.of({
2770
- create: (input, now, prepare) => run(raw.create(input, now, prepare)),
2771
- context: (input) => run(raw.context(input)),
2772
- read: (input) => run(raw.read(input)),
2773
- reject: (input, prepare) => run(raw.reject(input, prepare)),
2774
- complete: (plan, prepare) => run(raw.complete(plan, prepare)),
2768
+ const run = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
2769
+ Effect.gen(function* () {
2770
+ if (
2771
+ (yield* Effect.serviceOption(CurrentD1SessionBatch))._tag === "Some" ||
2772
+ (yield* hasCommitScope)
2773
+ )
2774
+ return yield* unavailable();
2775
+
2776
+ return yield* effect.pipe(
2777
+ Effect.provideService(CurrentD1PlanningDatabase, database),
2778
+ Effect.provideService(LifecycleHooks, hooks),
2779
+ );
2775
2780
  });
2776
2781
 
2777
- return { sessionStepUpPersistence };
2782
+ const sessionStepUpPersistence = target.of({
2783
+ create: (input, now, prepare) => run(raw.create(input, now, prepare)),
2784
+ context: (input) => run(raw.context(input)),
2785
+ read: (input) => run(raw.read(input)),
2786
+ reject: (input, prepare) => run(raw.reject(input, prepare)),
2787
+ complete: (plan, prepare) => run(raw.complete(plan, prepare)),
2778
2788
  });
2779
2789
 
2790
+ return { sessionStepUpPersistence };
2791
+ });
2792
+
2780
2793
  export function coordinateD1SessionStepUp<
2781
2794
  Claims,
2782
2795
  Id,
@@ -6,6 +6,7 @@ import type { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
6
6
  import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
7
7
  import { Context, Effect } from "effect";
8
8
 
9
+ import { Database as DatabaseService } from "./d1-database";
9
10
  import { makeD1Owner } from "./d1-planning";
10
11
  import { D1BatchStatements } from "./D1BatchStatements";
11
12
  import type { D1TotpMapping, TotpMapping, TotpMappingSource } from "./totp-model";
@@ -21,7 +22,10 @@ const configuration = {
21
22
  };
22
23
 
23
24
  /** Reads use a primary D1 session; observations and expiry are asserted in the same batch. */
24
- const target = makeTotpTarget<Database, Table, D1TotpMapping>(configuration);
25
+ const target = makeTotpTarget<DatabaseService, Database, Table, D1TotpMapping>(
26
+ DatabaseService,
27
+ configuration,
28
+ );
25
29
 
26
30
  export const { makeTotpPersistenceServices } = target;
27
31
 
@@ -540,10 +540,14 @@ const prepareConflict = Effect.fn("Drizzle.prepareConflict")(function* <Registra
540
540
 
541
541
  export const makeSqlEmailRegistrationAuthority = Effect.fn("makeSqlEmailRegistrationAuthority")(
542
542
  function* <Registration>(
543
- database: EmailSqlDatabase,
544
543
  mapping: Mapping<Registration>,
545
544
  configuration: EmailRegistrationConfiguration,
546
- ): Effect.fn.Return<EmailRegistrationAuthority<Registration>, never, LifecycleHooks> {
545
+ ): Effect.fn.Return<
546
+ EmailRegistrationAuthority<Registration>,
547
+ never,
548
+ LifecycleHooks | CurrentEmailSql
549
+ > {
550
+ const database = yield* CurrentEmailSql;
547
551
  const hooks = yield* LifecycleHooks;
548
552
 
549
553
  return {
@@ -15,6 +15,7 @@ import {
15
15
  type EmailRegistrationConfiguration,
16
16
  } from "./email-registration";
17
17
  import {
18
+ CurrentEmailSql,
18
19
  makeSqlEmailAddressPersistence,
19
20
  makeSqlEmailSignInTargets,
20
21
  type EmailSqlConfiguration,
@@ -22,7 +23,7 @@ import {
22
23
  type EmailSqlQuery,
23
24
  } from "./email-sql";
24
25
  import type { ProofTargetConfiguration } from "./proof-target";
25
- import { sqlClientStandaloneGuard } from "./standalone-guard";
26
+ import { sqlClientStandaloneGuard, type TransactionService } from "./standalone-guard";
26
27
 
27
28
  export interface EmailTargetConfiguration {
28
29
  readonly mode: "interactive" | "synchronous";
@@ -46,9 +47,9 @@ export type EmailCoordinatorError<E> =
46
47
  | SqlError.SqlError;
47
48
 
48
49
  export const sqlClientEmailStandaloneGuard = (
49
- database: unknown,
50
+ service: TransactionService | undefined,
50
51
  ): Effect.Effect<void, EmailUnavailable> =>
51
- sqlClientStandaloneGuard(database, () => EmailUnavailable.make({}));
52
+ sqlClientStandaloneGuard(service, () => EmailUnavailable.make({}));
52
53
 
53
54
  const proofConfiguration = (configuration: EmailTargetConfiguration, coordinated = false) => ({
54
55
  mode: configuration.proof.mode,
@@ -93,13 +94,12 @@ const registrationOptions = (
93
94
  });
94
95
 
95
96
  export const makeTargetEmailSignInServices = (
96
- database: any,
97
97
  mapping: any,
98
98
  configuration: EmailTargetConfiguration,
99
99
  ) =>
100
100
  Effect.gen(function* () {
101
101
  return {
102
- emailSignInTargets: yield* makeSqlEmailSignInTargets(database, mapping, {
102
+ emailSignInTargets: yield* makeSqlEmailSignInTargets(mapping, {
103
103
  mode: configuration.mode,
104
104
  locking: false,
105
105
  standaloneGuard: configuration.standaloneGuard,
@@ -108,7 +108,6 @@ export const makeTargetEmailSignInServices = (
108
108
  });
109
109
 
110
110
  export const makeTargetEmailAddressServices = (
111
- database: any,
112
111
  mapping: any,
113
112
  proofMapping: any,
114
113
  configuration: EmailTargetConfiguration,
@@ -116,7 +115,6 @@ export const makeTargetEmailAddressServices = (
116
115
  Effect.gen(function* () {
117
116
  return {
118
117
  emailAddressPersistence: yield* makeSqlEmailAddressPersistence(
119
- database,
120
118
  mapping,
121
119
  addressOptions(configuration, proofMapping),
122
120
  ),
@@ -124,7 +122,6 @@ export const makeTargetEmailAddressServices = (
124
122
  });
125
123
 
126
124
  export const makeTargetEmailRegistrationServices = <Registration>(
127
- database: any,
128
125
  mapping: any,
129
126
  proofMapping: any,
130
127
  configuration: EmailTargetConfiguration,
@@ -132,7 +129,6 @@ export const makeTargetEmailRegistrationServices = <Registration>(
132
129
  Effect.gen(function* () {
133
130
  return {
134
131
  registrationAuthority: yield* makeSqlEmailRegistrationAuthority<Registration>(
135
- database,
136
132
  mapping,
137
133
  registrationOptions(configuration, proofMapping),
138
134
  ),
@@ -161,9 +157,10 @@ export const coordinateTargetEmailAddress = <Transaction, A, E, R>(
161
157
  Effect.gen(function* () {
162
158
  return yield* owner(transaction, {
163
159
  emailAddressPersistence: yield* makeSqlEmailAddressPersistence(
164
- transaction as unknown as EmailSqlDatabase,
165
160
  mapping,
166
161
  addressOptions(configuration, proofMapping, true),
162
+ ).pipe(
163
+ Effect.provideService(CurrentEmailSql, transaction as unknown as EmailSqlDatabase),
167
164
  ),
168
165
  });
169
166
  }),
@@ -196,9 +193,10 @@ export const coordinateTargetEmailRegistration = <Registration, Transaction, A,
196
193
  Effect.gen(function* () {
197
194
  return yield* owner(transaction, {
198
195
  registrationAuthority: yield* makeSqlEmailRegistrationAuthority<Registration>(
199
- transaction as unknown as EmailSqlDatabase,
200
196
  mapping,
201
197
  registrationOptions(configuration, proofMapping, true),
198
+ ).pipe(
199
+ Effect.provideService(CurrentEmailSql, transaction as unknown as EmailSqlDatabase),
202
200
  ),
203
201
  });
204
202
  }),
@@ -209,19 +207,19 @@ export const coordinateTargetEmailRegistration = <Registration, Transaction, A,
209
207
  return result.value;
210
208
  });
211
209
 
212
- export const emailSignInTargetsLayer = (
213
- services: Effect.Effect<{ readonly emailSignInTargets: EmailSignInTargets["Service"] }>,
210
+ export const emailSignInTargetsLayer = <E, R>(
211
+ services: Effect.Effect<{ readonly emailSignInTargets: EmailSignInTargets["Service"] }, E, R>,
214
212
  ) =>
215
213
  Layer.effect(
216
214
  EmailSignInTargets,
217
215
  Effect.map(services, (value) => value.emailSignInTargets),
218
216
  );
219
217
 
220
- export const emailAddressPersistenceLayer = (
218
+ export const emailAddressPersistenceLayer = <E, R>(
221
219
  services: Effect.Effect<
222
220
  { readonly emailAddressPersistence: EmailAddressPersistence["Service"] },
223
- never,
224
- LifecycleHooks
221
+ E,
222
+ R
225
223
  >,
226
224
  ) =>
227
225
  Layer.effect(
@@ -229,12 +227,12 @@ export const emailAddressPersistenceLayer = (
229
227
  Effect.map(services, (value) => value.emailAddressPersistence),
230
228
  );
231
229
 
232
- export const emailRegistrationLayer = <Id, Registration>(
230
+ export const emailRegistrationLayer = <Id, Registration, E, R>(
233
231
  tag: Context.Key<Id, EmailRegistrationAuthority<Registration>>,
234
232
  services: Effect.Effect<
235
233
  { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },
236
- never,
237
- LifecycleHooks
234
+ E,
235
+ R
238
236
  >,
239
237
  ) =>
240
238
  Layer.effect(