@yielded/auth-persistence-drizzle 0.1.0-beta.0 → 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 (291) hide show
  1. package/README.md +6 -1
  2. package/dist/D1.d.mts +155 -40
  3. package/dist/D1.mjs +10 -6
  4. package/dist/D1.mjs.map +1 -1
  5. package/dist/Libsql.d.mts +251 -129
  6. package/dist/Libsql.mjs +20 -21
  7. package/dist/Libsql.mjs.map +1 -1
  8. package/dist/Mysql2.d.mts +208 -56
  9. package/dist/Mysql2.mjs +13 -8
  10. package/dist/Mysql2.mjs.map +1 -1
  11. package/dist/Pglite.d.mts +209 -57
  12. package/dist/Pglite.mjs +13 -9
  13. package/dist/Pglite.mjs.map +1 -1
  14. package/dist/Postgres.d.mts +207 -55
  15. package/dist/Postgres.mjs +13 -9
  16. package/dist/Postgres.mjs.map +1 -1
  17. package/dist/SqliteBun.d.mts +249 -126
  18. package/dist/SqliteBun.mjs +20 -18
  19. package/dist/SqliteBun.mjs.map +1 -1
  20. package/dist/SqliteDo.d.mts +248 -158
  21. package/dist/SqliteDo.mjs +26 -44
  22. package/dist/SqliteDo.mjs.map +1 -1
  23. package/dist/SqliteNode.d.mts +247 -124
  24. package/dist/SqliteNode.mjs +20 -18
  25. package/dist/SqliteNode.mjs.map +1 -1
  26. package/dist/SqliteWasm.d.mts +251 -128
  27. package/dist/SqliteWasm.mjs +20 -18
  28. package/dist/SqliteWasm.mjs.map +1 -1
  29. package/dist/drizzle/D1BatchStatements.d.mts +1 -1
  30. package/dist/drizzle/D1BatchStatements.mjs.map +1 -1
  31. package/dist/drizzle/d1-database.d.mts +11 -0
  32. package/dist/drizzle/d1-database.mjs +8 -0
  33. package/dist/drizzle/d1-database.mjs.map +1 -0
  34. package/dist/drizzle/d1-emails.d.mts +8 -7
  35. package/dist/drizzle/d1-emails.mjs +7 -4
  36. package/dist/drizzle/d1-emails.mjs.map +1 -1
  37. package/dist/drizzle/d1-generated-statement.mjs.map +1 -1
  38. package/dist/drizzle/d1-identity.mjs +12 -9
  39. package/dist/drizzle/d1-identity.mjs.map +1 -1
  40. package/dist/drizzle/d1-oauth.d.mts +41 -10
  41. package/dist/drizzle/d1-oauth.mjs +8 -5
  42. package/dist/drizzle/d1-oauth.mjs.map +1 -1
  43. package/dist/drizzle/d1-passkey.d.mts +3 -14
  44. package/dist/drizzle/d1-passkey.mjs +2 -1
  45. package/dist/drizzle/d1-passkey.mjs.map +1 -1
  46. package/dist/drizzle/d1-password-prepared.d.mts +4 -3
  47. package/dist/drizzle/d1-password-prepared.mjs +3 -1
  48. package/dist/drizzle/d1-password-prepared.mjs.map +1 -1
  49. package/dist/drizzle/d1-passwords.d.mts +7 -6
  50. package/dist/drizzle/d1-passwords.mjs +5 -2
  51. package/dist/drizzle/d1-passwords.mjs.map +1 -1
  52. package/dist/drizzle/d1-phone.d.mts +3 -4
  53. package/dist/drizzle/d1-phone.mjs +2 -1
  54. package/dist/drizzle/d1-phone.mjs.map +1 -1
  55. package/dist/drizzle/d1-planning.d.mts +1 -1
  56. package/dist/drizzle/d1-proofs.d.mts +5 -4
  57. package/dist/drizzle/d1-proofs.mjs +3 -1
  58. package/dist/drizzle/d1-proofs.mjs.map +1 -1
  59. package/dist/drizzle/d1-sessions.d.mts +14 -13
  60. package/dist/drizzle/d1-sessions.mjs +15 -9
  61. package/dist/drizzle/d1-sessions.mjs.map +1 -1
  62. package/dist/drizzle/d1-totp.d.mts +3 -4
  63. package/dist/drizzle/d1-totp.mjs +2 -1
  64. package/dist/drizzle/d1-totp.mjs.map +1 -1
  65. package/dist/drizzle/email-registration.d.mts +1 -1
  66. package/dist/drizzle/email-registration.mjs +2 -1
  67. package/dist/drizzle/email-registration.mjs.map +1 -1
  68. package/dist/drizzle/email-target.d.mts +8 -7
  69. package/dist/drizzle/email-target.mjs +10 -10
  70. package/dist/drizzle/email-target.mjs.map +1 -1
  71. package/dist/drizzle/model.d.mts +2 -126
  72. package/dist/drizzle/model.mjs +2 -21
  73. package/dist/drizzle/model.mjs.map +1 -1
  74. package/dist/drizzle/mysql-database.d.mts +8 -0
  75. package/dist/drizzle/mysql-database.mjs +8 -0
  76. package/dist/drizzle/mysql-database.mjs.map +1 -0
  77. package/dist/drizzle/mysql-emails.d.mts +8 -7
  78. package/dist/drizzle/mysql-emails.mjs +12 -8
  79. package/dist/drizzle/mysql-emails.mjs.map +1 -1
  80. package/dist/drizzle/mysql-identity.mjs +12 -9
  81. package/dist/drizzle/mysql-identity.mjs.map +1 -1
  82. package/dist/drizzle/mysql-password-prepared.d.mts +4 -3
  83. package/dist/drizzle/mysql-password-prepared.mjs +6 -2
  84. package/dist/drizzle/mysql-password-prepared.mjs.map +1 -1
  85. package/dist/drizzle/mysql-passwords.d.mts +7 -5
  86. package/dist/drizzle/mysql-passwords.mjs +11 -7
  87. package/dist/drizzle/mysql-passwords.mjs.map +1 -1
  88. package/dist/drizzle/mysql-proofs.d.mts +4 -3
  89. package/dist/drizzle/mysql-proofs.mjs +8 -4
  90. package/dist/drizzle/mysql-proofs.mjs.map +1 -1
  91. package/dist/drizzle/mysql-sessions.d.mts +12 -11
  92. package/dist/drizzle/mysql-sessions.mjs +16 -12
  93. package/dist/drizzle/mysql-sessions.mjs.map +1 -1
  94. package/dist/drizzle/native-database.mjs +10 -0
  95. package/dist/drizzle/native-database.mjs.map +1 -0
  96. package/dist/drizzle/oauth-accounts.mjs +1 -1
  97. package/dist/drizzle/oauth-connected-access.mjs +14 -12
  98. package/dist/drizzle/oauth-connected-access.mjs.map +1 -1
  99. package/dist/drizzle/oauth-connected-custody.mjs +2 -2
  100. package/dist/drizzle/oauth-connected-drivers.mjs +11 -6
  101. package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -1
  102. package/dist/drizzle/oauth-connected-flow.mjs +2 -2
  103. package/dist/drizzle/oauth-connected-input.mjs +14 -1
  104. package/dist/drizzle/oauth-connected-input.mjs.map +1 -1
  105. package/dist/drizzle/oauth-connected-maintenance.mjs +1 -1
  106. package/dist/drizzle/oauth-connected-management.mjs +2 -2
  107. package/dist/drizzle/oauth-connected-model.d.mts +17 -3
  108. package/dist/drizzle/oauth-connected-model.mjs.map +1 -1
  109. package/dist/drizzle/oauth-connected-settlement.mjs +51 -41
  110. package/dist/drizzle/oauth-connected-settlement.mjs.map +1 -1
  111. package/dist/drizzle/oauth-connected-sign-in.mjs +263 -0
  112. package/dist/drizzle/oauth-connected-sign-in.mjs.map +1 -0
  113. package/dist/drizzle/oauth-connected-state.d.mts +110 -2
  114. package/dist/drizzle/oauth-connected-state.mjs +9 -4
  115. package/dist/drizzle/oauth-connected-state.mjs.map +1 -1
  116. package/dist/drizzle/oauth-connected-target.d.mts +142 -15
  117. package/dist/drizzle/oauth-connected-target.mjs +9 -6
  118. package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
  119. package/dist/drizzle/oauth-drivers.mjs +9 -7
  120. package/dist/drizzle/oauth-drivers.mjs.map +1 -1
  121. package/dist/drizzle/oauth-flow.d.mts +1 -1
  122. package/dist/drizzle/oauth-flow.mjs +1 -1
  123. package/dist/drizzle/oauth-input.mjs +1 -1
  124. package/dist/drizzle/oauth-model.d.mts +1 -1
  125. package/dist/drizzle/oauth-owner.d.mts +1 -1
  126. package/dist/drizzle/oauth-registration.d.mts +2 -2
  127. package/dist/drizzle/oauth-registration.mjs +1 -1
  128. package/dist/drizzle/oauth-state.mjs +5 -4
  129. package/dist/drizzle/oauth-state.mjs.map +1 -1
  130. package/dist/drizzle/oauth-target.d.mts +14 -13
  131. package/dist/drizzle/oauth-target.mjs +14 -13
  132. package/dist/drizzle/oauth-target.mjs.map +1 -1
  133. package/dist/drizzle/passkey-drivers.mjs +8 -6
  134. package/dist/drizzle/passkey-drivers.mjs.map +1 -1
  135. package/dist/drizzle/passkey-write-drivers.mjs +5 -3
  136. package/dist/drizzle/passkey-write-drivers.mjs.map +1 -1
  137. package/dist/drizzle/passkey-write-target.d.mts +1 -1
  138. package/dist/drizzle/password-prepared-sql.mjs +2 -1
  139. package/dist/drizzle/password-prepared-sql.mjs.map +1 -1
  140. package/dist/drizzle/password-prepared-state.mjs +1 -1
  141. package/dist/drizzle/password-prepared-target.d.mts +4 -3
  142. package/dist/drizzle/password-prepared-target.mjs +4 -3
  143. package/dist/drizzle/password-prepared-target.mjs.map +1 -1
  144. package/dist/drizzle/password-registration.mjs +2 -1
  145. package/dist/drizzle/password-registration.mjs.map +1 -1
  146. package/dist/drizzle/password-target.d.mts +6 -5
  147. package/dist/drizzle/password-target.mjs +8 -8
  148. package/dist/drizzle/password-target.mjs.map +1 -1
  149. package/dist/drizzle/pg-database.d.mts +9 -0
  150. package/dist/drizzle/pg-database.mjs +8 -0
  151. package/dist/drizzle/pg-database.mjs.map +1 -0
  152. package/dist/drizzle/pg-emails.d.mts +8 -7
  153. package/dist/drizzle/pg-emails.mjs +12 -8
  154. package/dist/drizzle/pg-emails.mjs.map +1 -1
  155. package/dist/drizzle/pg-identity.mjs +92 -0
  156. package/dist/drizzle/pg-identity.mjs.map +1 -0
  157. package/dist/drizzle/pg-password-prepared.d.mts +4 -3
  158. package/dist/drizzle/pg-password-prepared.mjs +6 -2
  159. package/dist/drizzle/pg-password-prepared.mjs.map +1 -1
  160. package/dist/drizzle/pg-passwords.d.mts +7 -5
  161. package/dist/drizzle/pg-passwords.mjs +11 -7
  162. package/dist/drizzle/pg-passwords.mjs.map +1 -1
  163. package/dist/drizzle/pg-proofs.d.mts +4 -3
  164. package/dist/drizzle/pg-proofs.mjs +8 -4
  165. package/dist/drizzle/pg-proofs.mjs.map +1 -1
  166. package/dist/drizzle/pg-sessions.d.mts +12 -11
  167. package/dist/drizzle/pg-sessions.mjs +16 -12
  168. package/dist/drizzle/pg-sessions.mjs.map +1 -1
  169. package/dist/drizzle/phone-model.d.mts +1 -1
  170. package/dist/drizzle/phone-target.d.mts +5 -4
  171. package/dist/drizzle/phone-target.mjs +12 -11
  172. package/dist/drizzle/phone-target.mjs.map +1 -1
  173. package/dist/drizzle/proof-target.d.mts +4 -3
  174. package/dist/drizzle/proof-target.mjs +5 -5
  175. package/dist/drizzle/proof-target.mjs.map +1 -1
  176. package/dist/drizzle/session-sql.d.mts +1 -0
  177. package/dist/drizzle/session-target.d.mts +11 -9
  178. package/dist/drizzle/session-target.mjs +11 -11
  179. package/dist/drizzle/session-target.mjs.map +1 -1
  180. package/dist/drizzle/sqlite-emails.mjs +9 -5
  181. package/dist/drizzle/sqlite-emails.mjs.map +1 -1
  182. package/dist/drizzle/sqlite-identity.mjs +14 -11
  183. package/dist/drizzle/sqlite-identity.mjs.map +1 -1
  184. package/dist/drizzle/sqlite-password-prepared.mjs +7 -3
  185. package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -1
  186. package/dist/drizzle/sqlite-passwords.mjs +10 -6
  187. package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
  188. package/dist/drizzle/sqlite-proofs.mjs +7 -3
  189. package/dist/drizzle/sqlite-proofs.mjs.map +1 -1
  190. package/dist/drizzle/sqlite-sessions.mjs +16 -12
  191. package/dist/drizzle/sqlite-sessions.mjs.map +1 -1
  192. package/dist/drizzle/standalone-guard.d.mts +2 -0
  193. package/dist/drizzle/standalone-guard.mjs +8 -4
  194. package/dist/drizzle/standalone-guard.mjs.map +1 -1
  195. package/dist/drizzle/totp-model.d.mts +1 -1
  196. package/dist/drizzle/totp-target.d.mts +5 -4
  197. package/dist/drizzle/totp-target.mjs +31 -28
  198. package/dist/drizzle/totp-target.mjs.map +1 -1
  199. package/dist/drizzle/transaction-mysql.mjs +1 -1
  200. package/dist/drizzle/transaction-mysql.mjs.map +1 -1
  201. package/dist/index.d.mts +2 -4
  202. package/dist/index.mjs +2 -4
  203. package/dist/internal/drizzle-postgres.mjs.map +1 -1
  204. package/dist/internal/drizzle-sqlite.mjs.map +1 -1
  205. package/package.json +1 -1
  206. package/src/D1.ts +37 -26
  207. package/src/Libsql.ts +45 -61
  208. package/src/Mysql2.ts +39 -35
  209. package/src/Pglite.ts +48 -30
  210. package/src/Postgres.ts +48 -30
  211. package/src/SqliteBun.ts +59 -68
  212. package/src/SqliteDo.ts +61 -274
  213. package/src/SqliteNode.ts +56 -66
  214. package/src/SqliteWasm.ts +56 -66
  215. package/src/drizzle/D1BatchStatements.ts +1 -1
  216. package/src/drizzle/d1-database.ts +10 -0
  217. package/src/drizzle/d1-emails.ts +86 -88
  218. package/src/drizzle/d1-generated-statement.ts +1 -1
  219. package/src/drizzle/d1-identity.ts +17 -20
  220. package/src/drizzle/d1-oauth.ts +19 -8
  221. package/src/drizzle/d1-passkey.ts +5 -1
  222. package/src/drizzle/d1-password-prepared.ts +40 -42
  223. package/src/drizzle/d1-passwords.ts +76 -80
  224. package/src/drizzle/d1-phone.ts +5 -1
  225. package/src/drizzle/d1-proofs.ts +31 -34
  226. package/src/drizzle/d1-sessions.ts +53 -40
  227. package/src/drizzle/d1-totp.ts +5 -1
  228. package/src/drizzle/email-registration.ts +6 -2
  229. package/src/drizzle/email-target.ts +18 -20
  230. package/src/drizzle/model.ts +1 -208
  231. package/src/drizzle/mysql-database.ts +8 -0
  232. package/src/drizzle/mysql-emails.ts +29 -17
  233. package/src/drizzle/mysql-identity.ts +18 -21
  234. package/src/drizzle/mysql-password-prepared.ts +11 -9
  235. package/src/drizzle/mysql-passwords.ts +22 -10
  236. package/src/drizzle/mysql-proofs.ts +17 -6
  237. package/src/drizzle/mysql-sessions.ts +41 -18
  238. package/src/drizzle/native-database.ts +22 -0
  239. package/src/drizzle/oauth-connected-access.ts +8 -1
  240. package/src/drizzle/oauth-connected-drivers.ts +21 -6
  241. package/src/drizzle/oauth-connected-input.ts +13 -0
  242. package/src/drizzle/oauth-connected-model.ts +17 -0
  243. package/src/drizzle/oauth-connected-settlement.ts +65 -42
  244. package/src/drizzle/oauth-connected-sign-in.ts +438 -0
  245. package/src/drizzle/oauth-connected-state.ts +19 -7
  246. package/src/drizzle/oauth-connected-target.ts +26 -18
  247. package/src/drizzle/oauth-drivers.ts +26 -10
  248. package/src/drizzle/oauth-state.ts +5 -4
  249. package/src/drizzle/oauth-target.ts +31 -43
  250. package/src/drizzle/passkey-drivers.ts +21 -13
  251. package/src/drizzle/passkey-write-drivers.ts +11 -6
  252. package/src/drizzle/password-prepared-sql.ts +2 -4
  253. package/src/drizzle/password-prepared-target.ts +10 -7
  254. package/src/drizzle/password-registration.ts +7 -8
  255. package/src/drizzle/password-target.ts +20 -19
  256. package/src/drizzle/pg-database.ts +10 -0
  257. package/src/drizzle/pg-emails.ts +29 -17
  258. package/src/drizzle/pg-identity.ts +297 -0
  259. package/src/drizzle/pg-password-prepared.ts +11 -9
  260. package/src/drizzle/pg-passwords.ts +22 -10
  261. package/src/drizzle/pg-proofs.ts +17 -6
  262. package/src/drizzle/pg-sessions.ts +41 -18
  263. package/src/drizzle/phone-target.ts +23 -18
  264. package/src/drizzle/proof-target.ts +10 -13
  265. package/src/drizzle/session-target.ts +33 -51
  266. package/src/drizzle/sqlite-emails.ts +31 -14
  267. package/src/drizzle/sqlite-identity.ts +22 -42
  268. package/src/drizzle/sqlite-password-prepared.ts +24 -10
  269. package/src/drizzle/sqlite-passwords.ts +30 -16
  270. package/src/drizzle/sqlite-proofs.ts +29 -6
  271. package/src/drizzle/sqlite-sessions.ts +50 -24
  272. package/src/drizzle/standalone-guard.ts +19 -7
  273. package/src/drizzle/totp-target.ts +62 -61
  274. package/src/drizzle/transaction-mysql.ts +1 -1
  275. package/src/index.ts +0 -24
  276. package/src/internal/drizzle-postgres.ts +1 -1
  277. package/src/internal/drizzle-sqlite.ts +1 -1
  278. package/dist/drizzle/d1-identity.d.mts +0 -30
  279. package/dist/drizzle/mysql-identity.d.mts +0 -21
  280. package/dist/drizzle/mysql.d.mts +0 -69
  281. package/dist/drizzle/mysql.mjs +0 -218
  282. package/dist/drizzle/mysql.mjs.map +0 -1
  283. package/dist/drizzle/pg.d.mts +0 -80
  284. package/dist/drizzle/pg.mjs +0 -289
  285. package/dist/drizzle/pg.mjs.map +0 -1
  286. package/dist/drizzle/sqlite.d.mts +0 -77
  287. package/dist/drizzle/sqlite.mjs +0 -217
  288. package/dist/drizzle/sqlite.mjs.map +0 -1
  289. package/src/drizzle/mysql.ts +0 -687
  290. package/src/drizzle/pg.ts +0 -984
  291. package/src/drizzle/sqlite.ts +0 -705
@@ -30,8 +30,9 @@ import { eq, is, isNotNull, lte, or, SQL, sql, type AnyRelations, type Table } f
30
30
  import type { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
31
31
  import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
32
32
  import { Cause, DateTime, Effect, Predicate, Redacted, Schema, Context } from "effect";
33
- import type { Statement } from "effect/unstable/sql/Statement";
33
+ import type { Statement } from "effect/sql/Statement";
34
34
 
35
+ import { Database as DatabaseService } from "./d1-database";
35
36
  import { balancedD1And as and, compactD1GeneratedStatement } from "./d1-generated-statement";
36
37
  import { passwordD1Kernel as kernel } from "./d1-passwords";
37
38
  import { CurrentD1PlanningDatabase, makeD1Owner } from "./d1-planning";
@@ -791,10 +792,7 @@ const makePreparedPlans = (mapping: Mapping, proofMapping?: any) => {
791
792
  Effect.catchCause(
792
793
  (
793
794
  cause,
794
- ): Effect.Effect<
795
- never,
796
- PasswordRejected | import("effect/unstable/sql/SqlError").SqlError
797
- > =>
795
+ ): Effect.Effect<never, PasswordRejected | import("effect/sql/SqlError").SqlError> =>
798
796
  everyFailureMatches(cause, (failure) =>
799
797
  kernel.isGuardFailure(
800
798
  failure,
@@ -967,7 +965,7 @@ const makePreparedPlans = (mapping: Mapping, proofMapping?: any) => {
967
965
  return services;
968
966
  };
969
967
 
970
- export const makeD1PasswordPreparedPersistenceServices = <
968
+ export const makeD1PasswordPreparedPersistenceServices = Effect.fnUntraced(function* <
971
969
  S extends AnySQLiteTable,
972
970
  I extends AnySQLiteTable,
973
971
  C extends AnySQLiteTable,
@@ -987,47 +985,47 @@ export const makeD1PasswordPreparedPersistenceServices = <
987
985
  PCr extends AnySQLiteTable = AnySQLiteTable,
988
986
  PNativeId = unknown,
989
987
  >(
990
- database: Database,
991
988
  mapping: D1PasswordPreparedPersistenceMapping<S, I, C, AC, At, RS, CE, M, T, B, NativeId>,
992
989
  proofMapping?: D1PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>,
993
- ) =>
994
- Effect.gen(function* () {
995
- const hooks = yield* LifecycleHooks;
996
- const plans = makePreparedPlans(mapping as unknown as Mapping, proofMapping);
990
+ ) {
991
+ const database = yield* DatabaseService;
997
992
 
998
- const run = <Out, Err, Env>(plan: Effect.Effect<Planned<Out>, Err, Env>) =>
999
- Effect.gen(function* () {
1000
- if (yield* hasCommitScope) return yield* unavailable();
993
+ const hooks = yield* LifecycleHooks;
994
+ const plans = makePreparedPlans(mapping as unknown as Mapping, proofMapping);
1001
995
 
1002
- return yield* executeStandalone(plan);
1003
- }).pipe(
1004
- Effect.provideService(CurrentD1PlanningDatabase, database),
1005
- Effect.provideService(CurrentPasswordSql, database as unknown as PasswordSqlDatabase),
1006
- Effect.provideService(LifecycleHooks, hooks),
1007
- );
996
+ const run = <Out, Err, Env>(plan: Effect.Effect<Planned<Out>, Err, Env>) =>
997
+ Effect.gen(function* () {
998
+ if (yield* hasCommitScope) return yield* unavailable();
1008
999
 
1009
- const service: PasswordPreparedPersistence = {
1010
- reserve: (input, prepare) => run(plans.reserve(input, prepare)).pipe(translateFailure),
1011
- publishReady: (input, prepare) =>
1012
- run(plans.publishReady(input, prepare)).pipe(translateFailure),
1013
- context: (input) =>
1014
- plans
1015
- .context(input)
1016
- .pipe(
1017
- Effect.provideService(CurrentD1PlanningDatabase, database),
1018
- Effect.provideService(CurrentPasswordSql, database as unknown as PasswordSqlDatabase),
1019
- Effect.provideService(LifecycleHooks, hooks),
1020
- translateContextFailure,
1021
- ),
1022
- complete: (input, prepare) => run(plans.complete(input, prepare)).pipe(translateFailure),
1023
- resetWithProof: (input, prepare) =>
1024
- run(plans.resetWithProof(input, prepare)).pipe(translateFailure),
1025
- cancel: (input, prepare) => run(plans.cancel(input, prepare)).pipe(translateFailure),
1026
- cleanup: (input, prepare) => run(plans.cleanup(input, prepare)).pipe(translateFailure),
1027
- };
1028
-
1029
- return { passwordPreparedPersistence: service };
1030
- });
1000
+ return yield* executeStandalone(plan);
1001
+ }).pipe(
1002
+ Effect.provideService(CurrentD1PlanningDatabase, database),
1003
+ Effect.provideService(CurrentPasswordSql, database as unknown as PasswordSqlDatabase),
1004
+ Effect.provideService(LifecycleHooks, hooks),
1005
+ );
1006
+
1007
+ const service: PasswordPreparedPersistence = {
1008
+ reserve: (input, prepare) => run(plans.reserve(input, prepare)).pipe(translateFailure),
1009
+ publishReady: (input, prepare) =>
1010
+ run(plans.publishReady(input, prepare)).pipe(translateFailure),
1011
+ context: (input) =>
1012
+ plans
1013
+ .context(input)
1014
+ .pipe(
1015
+ Effect.provideService(CurrentD1PlanningDatabase, database),
1016
+ Effect.provideService(CurrentPasswordSql, database as unknown as PasswordSqlDatabase),
1017
+ Effect.provideService(LifecycleHooks, hooks),
1018
+ translateContextFailure,
1019
+ ),
1020
+ complete: (input, prepare) => run(plans.complete(input, prepare)).pipe(translateFailure),
1021
+ resetWithProof: (input, prepare) =>
1022
+ run(plans.resetWithProof(input, prepare)).pipe(translateFailure),
1023
+ cancel: (input, prepare) => run(plans.cancel(input, prepare)).pipe(translateFailure),
1024
+ cleanup: (input, prepare) => run(plans.cleanup(input, prepare)).pipe(translateFailure),
1025
+ };
1026
+
1027
+ return { passwordPreparedPersistence: service };
1028
+ });
1031
1029
 
1032
1030
  export function coordinateD1PasswordPreparedPersistence<
1033
1031
  TargetId,
@@ -54,8 +54,9 @@ import type { EffectDrizzleQueryError } from "drizzle-orm/effect-core";
54
54
  import type { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
55
55
  import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
56
56
  import { Cause, DateTime, Effect, Option, Predicate, Redacted, Schema, Context } from "effect";
57
- import type { Statement } from "effect/unstable/sql/Statement";
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,
@@ -2624,9 +2622,7 @@ const executeStandalone = <A, E, R>(
2624
2622
  retries = 2,
2625
2623
  ): Effect.Effect<
2626
2624
  A,
2627
- | E
2628
- | import("@yielded/auth/Hooks").HookConfigurationError
2629
- | import("effect/unstable/sql/SqlError").SqlError,
2625
+ E | import("@yielded/auth/Hooks").HookConfigurationError | import("effect/sql/SqlError").SqlError,
2630
2626
  Exclude<R, CurrentCommitJournal> | CurrentD1PlanningDatabase | LifecycleHooks
2631
2627
  > =>
2632
2628
  Effect.suspend(() => {
@@ -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
 
@@ -45,8 +45,9 @@ import type { EffectDrizzleQueryError } from "drizzle-orm/effect-core";
45
45
  import type { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
46
46
  import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
47
47
  import { Cause, Effect, Schema, Context } from "effect";
48
- import type { Statement } from "effect/unstable/sql/Statement";
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
 
@@ -2273,9 +2272,7 @@ const executeStandalone = <A, E, R>(
2273
2272
  retries = 2,
2274
2273
  ): Effect.Effect<
2275
2274
  A,
2276
- | E
2277
- | import("@yielded/auth/Hooks").HookConfigurationError
2278
- | import("effect/unstable/sql/SqlError").SqlError,
2275
+ E | import("@yielded/auth/Hooks").HookConfigurationError | import("effect/sql/SqlError").SqlError,
2279
2276
  Exclude<R, CurrentCommitJournal> | CurrentD1PlanningDatabase | LifecycleHooks
2280
2277
  > =>
2281
2278
  Effect.suspend(() => {
@@ -49,9 +49,10 @@ import { and, eq, getTableColumns, gt, inArray, not, or, sql, type SQL } from "d
49
49
  import type { EffectDrizzleQueryError } from "drizzle-orm/effect-core";
50
50
  import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
51
51
  import { Cause, Context, Data, DateTime, Effect, Schema } from "effect";
52
- import type * as SqlError from "effect/unstable/sql/SqlError";
53
- import type { Statement } from "effect/unstable/sql/Statement";
52
+ import type * as SqlError from "effect/sql/SqlError";
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