@yielded/auth-persistence 0.1.0-beta.7

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 (526) hide show
  1. package/README.md +21 -0
  2. package/dist/Drizzle.d.mts +28 -0
  3. package/dist/Drizzle.mjs +28 -0
  4. package/dist/DrizzleD1.d.mts +963 -0
  5. package/dist/DrizzleD1.mjs +29 -0
  6. package/dist/DrizzleD1.mjs.map +1 -0
  7. package/dist/DrizzleLibsql.d.mts +2284 -0
  8. package/dist/DrizzleLibsql.mjs +92 -0
  9. package/dist/DrizzleLibsql.mjs.map +1 -0
  10. package/dist/DrizzleMysql2.d.mts +1820 -0
  11. package/dist/DrizzleMysql2.mjs +55 -0
  12. package/dist/DrizzleMysql2.mjs.map +1 -0
  13. package/dist/DrizzlePglite.d.mts +1826 -0
  14. package/dist/DrizzlePglite.mjs +53 -0
  15. package/dist/DrizzlePglite.mjs.map +1 -0
  16. package/dist/DrizzlePostgres.d.mts +1826 -0
  17. package/dist/DrizzlePostgres.mjs +53 -0
  18. package/dist/DrizzlePostgres.mjs.map +1 -0
  19. package/dist/DrizzleSqliteBun.d.mts +2279 -0
  20. package/dist/DrizzleSqliteBun.mjs +70 -0
  21. package/dist/DrizzleSqliteBun.mjs.map +1 -0
  22. package/dist/DrizzleSqliteDo.d.mts +2329 -0
  23. package/dist/DrizzleSqliteDo.mjs +105 -0
  24. package/dist/DrizzleSqliteDo.mjs.map +1 -0
  25. package/dist/DrizzleSqliteNode.d.mts +2279 -0
  26. package/dist/DrizzleSqliteNode.mjs +70 -0
  27. package/dist/DrizzleSqliteNode.mjs.map +1 -0
  28. package/dist/DrizzleSqliteWasm.d.mts +2282 -0
  29. package/dist/DrizzleSqliteWasm.mjs +70 -0
  30. package/dist/DrizzleSqliteWasm.mjs.map +1 -0
  31. package/dist/drizzle/D1BatchStatements.d.mts +11 -0
  32. package/dist/drizzle/D1BatchStatements.mjs +8 -0
  33. package/dist/drizzle/D1BatchStatements.mjs.map +1 -0
  34. package/dist/drizzle/PasswordPreparedPostconditions.mjs +12 -0
  35. package/dist/drizzle/PasswordPreparedPostconditions.mjs.map +1 -0
  36. package/dist/drizzle/SuppliedService.d.mts +10 -0
  37. package/dist/drizzle/d1-emails.d.mts +62 -0
  38. package/dist/drizzle/d1-emails.mjs +580 -0
  39. package/dist/drizzle/d1-emails.mjs.map +1 -0
  40. package/dist/drizzle/d1-generated-statement.d.mts +2 -0
  41. package/dist/drizzle/d1-generated-statement.mjs +79 -0
  42. package/dist/drizzle/d1-generated-statement.mjs.map +1 -0
  43. package/dist/drizzle/d1-identity.d.mts +31 -0
  44. package/dist/drizzle/d1-identity.mjs +119 -0
  45. package/dist/drizzle/d1-identity.mjs.map +1 -0
  46. package/dist/drizzle/d1-oauth.d.mts +301 -0
  47. package/dist/drizzle/d1-oauth.mjs +76 -0
  48. package/dist/drizzle/d1-oauth.mjs.map +1 -0
  49. package/dist/drizzle/d1-passkey.d.mts +51 -0
  50. package/dist/drizzle/d1-passkey.mjs +95 -0
  51. package/dist/drizzle/d1-passkey.mjs.map +1 -0
  52. package/dist/drizzle/d1-password-prepared.d.mts +25 -0
  53. package/dist/drizzle/d1-password-prepared.mjs +461 -0
  54. package/dist/drizzle/d1-password-prepared.mjs.map +1 -0
  55. package/dist/drizzle/d1-passwords.d.mts +87 -0
  56. package/dist/drizzle/d1-passwords.mjs +1004 -0
  57. package/dist/drizzle/d1-passwords.mjs.map +1 -0
  58. package/dist/drizzle/d1-phone.d.mts +26 -0
  59. package/dist/drizzle/d1-phone.mjs +30 -0
  60. package/dist/drizzle/d1-phone.mjs.map +1 -0
  61. package/dist/drizzle/d1-planning.d.mts +12 -0
  62. package/dist/drizzle/d1-planning.mjs +43 -0
  63. package/dist/drizzle/d1-planning.mjs.map +1 -0
  64. package/dist/drizzle/d1-proofs.d.mts +80 -0
  65. package/dist/drizzle/d1-proofs.mjs +830 -0
  66. package/dist/drizzle/d1-proofs.mjs.map +1 -0
  67. package/dist/drizzle/d1-sessions.d.mts +67 -0
  68. package/dist/drizzle/d1-sessions.mjs +966 -0
  69. package/dist/drizzle/d1-sessions.mjs.map +1 -0
  70. package/dist/drizzle/d1-totp.d.mts +26 -0
  71. package/dist/drizzle/d1-totp.mjs +27 -0
  72. package/dist/drizzle/d1-totp.mjs.map +1 -0
  73. package/dist/drizzle/email-model.d.mts +354 -0
  74. package/dist/drizzle/email-model.mjs +21 -0
  75. package/dist/drizzle/email-model.mjs.map +1 -0
  76. package/dist/drizzle/email-registration.d.mts +30 -0
  77. package/dist/drizzle/email-registration.mjs +238 -0
  78. package/dist/drizzle/email-registration.mjs.map +1 -0
  79. package/dist/drizzle/email-sql.d.mts +4 -0
  80. package/dist/drizzle/email-sql.mjs +9 -0
  81. package/dist/drizzle/email-sql.mjs.map +1 -0
  82. package/dist/drizzle/email-target.d.mts +20 -0
  83. package/dist/drizzle/email-target.mjs +72 -0
  84. package/dist/drizzle/email-target.mjs.map +1 -0
  85. package/dist/drizzle/model.d.mts +250 -0
  86. package/dist/drizzle/model.mjs +58 -0
  87. package/dist/drizzle/model.mjs.map +1 -0
  88. package/dist/drizzle/mysql-emails.d.mts +71 -0
  89. package/dist/drizzle/mysql-emails.mjs +38 -0
  90. package/dist/drizzle/mysql-emails.mjs.map +1 -0
  91. package/dist/drizzle/mysql-identity.d.mts +22 -0
  92. package/dist/drizzle/mysql-identity.mjs +94 -0
  93. package/dist/drizzle/mysql-identity.mjs.map +1 -0
  94. package/dist/drizzle/mysql-password-prepared.d.mts +30 -0
  95. package/dist/drizzle/mysql-password-prepared.mjs +16 -0
  96. package/dist/drizzle/mysql-password-prepared.mjs.map +1 -0
  97. package/dist/drizzle/mysql-passwords.d.mts +86 -0
  98. package/dist/drizzle/mysql-passwords.mjs +38 -0
  99. package/dist/drizzle/mysql-passwords.mjs.map +1 -0
  100. package/dist/drizzle/mysql-proofs.d.mts +75 -0
  101. package/dist/drizzle/mysql-proofs.mjs +23 -0
  102. package/dist/drizzle/mysql-proofs.mjs.map +1 -0
  103. package/dist/drizzle/mysql-sessions.d.mts +237 -0
  104. package/dist/drizzle/mysql-sessions.mjs +53 -0
  105. package/dist/drizzle/mysql-sessions.mjs.map +1 -0
  106. package/dist/drizzle/mysql.d.mts +70 -0
  107. package/dist/drizzle/mysql.mjs +218 -0
  108. package/dist/drizzle/mysql.mjs.map +1 -0
  109. package/dist/drizzle/oauth-accounts.mjs +358 -0
  110. package/dist/drizzle/oauth-accounts.mjs.map +1 -0
  111. package/dist/drizzle/oauth-connected-access.mjs +210 -0
  112. package/dist/drizzle/oauth-connected-access.mjs.map +1 -0
  113. package/dist/drizzle/oauth-connected-collection.mjs +202 -0
  114. package/dist/drizzle/oauth-connected-collection.mjs.map +1 -0
  115. package/dist/drizzle/oauth-connected-custody.mjs +146 -0
  116. package/dist/drizzle/oauth-connected-custody.mjs.map +1 -0
  117. package/dist/drizzle/oauth-connected-drivers.mjs +76 -0
  118. package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -0
  119. package/dist/drizzle/oauth-connected-flow.mjs +247 -0
  120. package/dist/drizzle/oauth-connected-flow.mjs.map +1 -0
  121. package/dist/drizzle/oauth-connected-input.mjs +103 -0
  122. package/dist/drizzle/oauth-connected-input.mjs.map +1 -0
  123. package/dist/drizzle/oauth-connected-maintenance.mjs +214 -0
  124. package/dist/drizzle/oauth-connected-maintenance.mjs.map +1 -0
  125. package/dist/drizzle/oauth-connected-management.mjs +228 -0
  126. package/dist/drizzle/oauth-connected-management.mjs.map +1 -0
  127. package/dist/drizzle/oauth-connected-model.d.mts +278 -0
  128. package/dist/drizzle/oauth-connected-model.mjs +22 -0
  129. package/dist/drizzle/oauth-connected-model.mjs.map +1 -0
  130. package/dist/drizzle/oauth-connected-reference.d.mts +17 -0
  131. package/dist/drizzle/oauth-connected-reference.mjs +53 -0
  132. package/dist/drizzle/oauth-connected-reference.mjs.map +1 -0
  133. package/dist/drizzle/oauth-connected-settlement.mjs +117 -0
  134. package/dist/drizzle/oauth-connected-settlement.mjs.map +1 -0
  135. package/dist/drizzle/oauth-connected-state.d.mts +14 -0
  136. package/dist/drizzle/oauth-connected-state.mjs +422 -0
  137. package/dist/drizzle/oauth-connected-state.mjs.map +1 -0
  138. package/dist/drizzle/oauth-connected-target.d.mts +753 -0
  139. package/dist/drizzle/oauth-connected-target.mjs +91 -0
  140. package/dist/drizzle/oauth-connected-target.mjs.map +1 -0
  141. package/dist/drizzle/oauth-drivers.mjs +51 -0
  142. package/dist/drizzle/oauth-drivers.mjs.map +1 -0
  143. package/dist/drizzle/oauth-flow.d.mts +5 -0
  144. package/dist/drizzle/oauth-flow.mjs +253 -0
  145. package/dist/drizzle/oauth-flow.mjs.map +1 -0
  146. package/dist/drizzle/oauth-input.mjs +127 -0
  147. package/dist/drizzle/oauth-input.mjs.map +1 -0
  148. package/dist/drizzle/oauth-model.d.mts +463 -0
  149. package/dist/drizzle/oauth-model.mjs +49 -0
  150. package/dist/drizzle/oauth-model.mjs.map +1 -0
  151. package/dist/drizzle/oauth-mysql.mjs +8 -0
  152. package/dist/drizzle/oauth-mysql.mjs.map +1 -0
  153. package/dist/drizzle/oauth-owner.d.mts +4 -0
  154. package/dist/drizzle/oauth-owner.mjs +10 -0
  155. package/dist/drizzle/oauth-owner.mjs.map +1 -0
  156. package/dist/drizzle/oauth-registration.d.mts +6 -0
  157. package/dist/drizzle/oauth-registration.mjs +374 -0
  158. package/dist/drizzle/oauth-registration.mjs.map +1 -0
  159. package/dist/drizzle/oauth-state.mjs +107 -0
  160. package/dist/drizzle/oauth-state.mjs.map +1 -0
  161. package/dist/drizzle/oauth-target.d.mts +111 -0
  162. package/dist/drizzle/oauth-target.mjs +246 -0
  163. package/dist/drizzle/oauth-target.mjs.map +1 -0
  164. package/dist/drizzle/passkey-drivers.mjs +34 -0
  165. package/dist/drizzle/passkey-drivers.mjs.map +1 -0
  166. package/dist/drizzle/passkey-kernel.mjs +8 -0
  167. package/dist/drizzle/passkey-kernel.mjs.map +1 -0
  168. package/dist/drizzle/passkey-model.d.mts +272 -0
  169. package/dist/drizzle/passkey-model.mjs +34 -0
  170. package/dist/drizzle/passkey-model.mjs.map +1 -0
  171. package/dist/drizzle/passkey-registration-ceremony-model.d.mts +50 -0
  172. package/dist/drizzle/passkey-registration-ceremony-model.mjs +18 -0
  173. package/dist/drizzle/passkey-registration-ceremony-model.mjs.map +1 -0
  174. package/dist/drizzle/passkey-state.mjs +7 -0
  175. package/dist/drizzle/passkey-state.mjs.map +1 -0
  176. package/dist/drizzle/passkey-target.d.mts +9 -0
  177. package/dist/drizzle/passkey-target.mjs +7 -0
  178. package/dist/drizzle/passkey-target.mjs.map +1 -0
  179. package/dist/drizzle/passkey-write-drivers.mjs +32 -0
  180. package/dist/drizzle/passkey-write-drivers.mjs.map +1 -0
  181. package/dist/drizzle/passkey-write-model.d.mts +190 -0
  182. package/dist/drizzle/passkey-write-model.mjs +13 -0
  183. package/dist/drizzle/passkey-write-model.mjs.map +1 -0
  184. package/dist/drizzle/passkey-write-target.d.mts +11 -0
  185. package/dist/drizzle/passkey-write-target.mjs +7 -0
  186. package/dist/drizzle/passkey-write-target.mjs.map +1 -0
  187. package/dist/drizzle/password-model.d.mts +329 -0
  188. package/dist/drizzle/password-model.mjs +23 -0
  189. package/dist/drizzle/password-model.mjs.map +1 -0
  190. package/dist/drizzle/password-prepared-model.d.mts +94 -0
  191. package/dist/drizzle/password-prepared-model.mjs +11 -0
  192. package/dist/drizzle/password-prepared-model.mjs.map +1 -0
  193. package/dist/drizzle/password-prepared-sql.mjs +390 -0
  194. package/dist/drizzle/password-prepared-sql.mjs.map +1 -0
  195. package/dist/drizzle/password-prepared-state.mjs +104 -0
  196. package/dist/drizzle/password-prepared-state.mjs.map +1 -0
  197. package/dist/drizzle/password-prepared-target.d.mts +12 -0
  198. package/dist/drizzle/password-prepared-target.mjs +56 -0
  199. package/dist/drizzle/password-prepared-target.mjs.map +1 -0
  200. package/dist/drizzle/password-registration.d.mts +19 -0
  201. package/dist/drizzle/password-registration.mjs +135 -0
  202. package/dist/drizzle/password-registration.mjs.map +1 -0
  203. package/dist/drizzle/password-sql.d.mts +5 -0
  204. package/dist/drizzle/password-sql.mjs +9 -0
  205. package/dist/drizzle/password-sql.mjs.map +1 -0
  206. package/dist/drizzle/password-target.d.mts +17 -0
  207. package/dist/drizzle/password-target.mjs +61 -0
  208. package/dist/drizzle/password-target.mjs.map +1 -0
  209. package/dist/drizzle/pg-emails.d.mts +72 -0
  210. package/dist/drizzle/pg-emails.mjs +38 -0
  211. package/dist/drizzle/pg-emails.mjs.map +1 -0
  212. package/dist/drizzle/pg-password-prepared.d.mts +31 -0
  213. package/dist/drizzle/pg-password-prepared.mjs +16 -0
  214. package/dist/drizzle/pg-password-prepared.mjs.map +1 -0
  215. package/dist/drizzle/pg-passwords.d.mts +87 -0
  216. package/dist/drizzle/pg-passwords.mjs +38 -0
  217. package/dist/drizzle/pg-passwords.mjs.map +1 -0
  218. package/dist/drizzle/pg-proofs.d.mts +76 -0
  219. package/dist/drizzle/pg-proofs.mjs +22 -0
  220. package/dist/drizzle/pg-proofs.mjs.map +1 -0
  221. package/dist/drizzle/pg-sessions.d.mts +238 -0
  222. package/dist/drizzle/pg-sessions.mjs +53 -0
  223. package/dist/drizzle/pg-sessions.mjs.map +1 -0
  224. package/dist/drizzle/pg.d.mts +81 -0
  225. package/dist/drizzle/pg.mjs +290 -0
  226. package/dist/drizzle/pg.mjs.map +1 -0
  227. package/dist/drizzle/phone-model.d.mts +115 -0
  228. package/dist/drizzle/phone-model.mjs +39 -0
  229. package/dist/drizzle/phone-model.mjs.map +1 -0
  230. package/dist/drizzle/phone-state.mjs +16 -0
  231. package/dist/drizzle/phone-state.mjs.map +1 -0
  232. package/dist/drizzle/phone-target.d.mts +17 -0
  233. package/dist/drizzle/phone-target.mjs +170 -0
  234. package/dist/drizzle/phone-target.mjs.map +1 -0
  235. package/dist/drizzle/proof-model.d.mts +286 -0
  236. package/dist/drizzle/proof-model.mjs +17 -0
  237. package/dist/drizzle/proof-model.mjs.map +1 -0
  238. package/dist/drizzle/proof-sql.d.mts +4 -0
  239. package/dist/drizzle/proof-sql.mjs +8 -0
  240. package/dist/drizzle/proof-sql.mjs.map +1 -0
  241. package/dist/drizzle/proof-target.d.mts +12 -0
  242. package/dist/drizzle/proof-target.mjs +36 -0
  243. package/dist/drizzle/proof-target.mjs.map +1 -0
  244. package/dist/drizzle/query-operations.mjs +26 -0
  245. package/dist/drizzle/query-operations.mjs.map +1 -0
  246. package/dist/drizzle/session-model.d.mts +200 -0
  247. package/dist/drizzle/session-model.mjs +20 -0
  248. package/dist/drizzle/session-model.mjs.map +1 -0
  249. package/dist/drizzle/session-sql.mjs +8 -0
  250. package/dist/drizzle/session-sql.mjs.map +1 -0
  251. package/dist/drizzle/session-target.d.mts +28 -0
  252. package/dist/drizzle/session-target.mjs +47 -0
  253. package/dist/drizzle/session-target.mjs.map +1 -0
  254. package/dist/drizzle/sqlite-emails.mjs +45 -0
  255. package/dist/drizzle/sqlite-emails.mjs.map +1 -0
  256. package/dist/drizzle/sqlite-identity.mjs +91 -0
  257. package/dist/drizzle/sqlite-identity.mjs.map +1 -0
  258. package/dist/drizzle/sqlite-password-prepared.mjs +21 -0
  259. package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -0
  260. package/dist/drizzle/sqlite-passwords.mjs +49 -0
  261. package/dist/drizzle/sqlite-passwords.mjs.map +1 -0
  262. package/dist/drizzle/sqlite-proofs.mjs +29 -0
  263. package/dist/drizzle/sqlite-proofs.mjs.map +1 -0
  264. package/dist/drizzle/sqlite-sessions.mjs +74 -0
  265. package/dist/drizzle/sqlite-sessions.mjs.map +1 -0
  266. package/dist/drizzle/sqlite.d.mts +78 -0
  267. package/dist/drizzle/sqlite.mjs +217 -0
  268. package/dist/drizzle/sqlite.mjs.map +1 -0
  269. package/dist/drizzle/standalone-guard.mjs +19 -0
  270. package/dist/drizzle/standalone-guard.mjs.map +1 -0
  271. package/dist/drizzle/step-up-model.d.mts +65 -0
  272. package/dist/drizzle/step-up-model.mjs +9 -0
  273. package/dist/drizzle/step-up-model.mjs.map +1 -0
  274. package/dist/drizzle/step-up-state.mjs +32 -0
  275. package/dist/drizzle/step-up-state.mjs.map +1 -0
  276. package/dist/drizzle/totp-model.d.mts +84 -0
  277. package/dist/drizzle/totp-model.mjs +13 -0
  278. package/dist/drizzle/totp-model.mjs.map +1 -0
  279. package/dist/drizzle/totp-state.d.mts +38 -0
  280. package/dist/drizzle/totp-state.mjs +287 -0
  281. package/dist/drizzle/totp-state.mjs.map +1 -0
  282. package/dist/drizzle/totp-target.d.mts +17 -0
  283. package/dist/drizzle/totp-target.mjs +81 -0
  284. package/dist/drizzle/totp-target.mjs.map +1 -0
  285. package/dist/drizzle/transaction-execution.d.mts +4 -0
  286. package/dist/drizzle/transaction-execution.mjs +11 -0
  287. package/dist/drizzle/transaction-execution.mjs.map +1 -0
  288. package/dist/drizzle/transaction-mysql.mjs +46 -0
  289. package/dist/drizzle/transaction-mysql.mjs.map +1 -0
  290. package/dist/drizzle/transaction-owner.d.mts +2 -0
  291. package/dist/drizzle/transaction-owner.mjs +8 -0
  292. package/dist/drizzle/transaction-owner.mjs.map +1 -0
  293. package/dist/index.d.mts +5 -0
  294. package/dist/index.mjs +5 -0
  295. package/dist/internal/configuration.d.mts +174 -0
  296. package/dist/internal/configuration.mjs +7 -0
  297. package/dist/internal/configuration.mjs.map +1 -0
  298. package/dist/internal/drizzle-migrations.mjs +19 -0
  299. package/dist/internal/drizzle-migrations.mjs.map +1 -0
  300. package/dist/internal/drizzle-postgres.mjs +39 -0
  301. package/dist/internal/drizzle-postgres.mjs.map +1 -0
  302. package/dist/internal/drizzle-sqlite.mjs +37 -0
  303. package/dist/internal/drizzle-sqlite.mjs.map +1 -0
  304. package/dist/internal/email-kernel.d.mts +13 -0
  305. package/dist/internal/email-kernel.mjs +487 -0
  306. package/dist/internal/email-kernel.mjs.map +1 -0
  307. package/dist/internal/mapping-error.d.mts +11 -0
  308. package/dist/internal/mapping-error.mjs +30 -0
  309. package/dist/internal/mapping-error.mjs.map +1 -0
  310. package/dist/internal/passkey/admission.d.mts +7 -0
  311. package/dist/internal/passkey/admission.mjs +216 -0
  312. package/dist/internal/passkey/admission.mjs.map +1 -0
  313. package/dist/internal/passkey/credentials.d.mts +6 -0
  314. package/dist/internal/passkey/credentials.mjs +249 -0
  315. package/dist/internal/passkey/credentials.mjs.map +1 -0
  316. package/dist/internal/passkey/enrollment.mjs +138 -0
  317. package/dist/internal/passkey/enrollment.mjs.map +1 -0
  318. package/dist/internal/passkey/flow.d.mts +10 -0
  319. package/dist/internal/passkey/flow.mjs +452 -0
  320. package/dist/internal/passkey/flow.mjs.map +1 -0
  321. package/dist/internal/passkey/management.mjs +231 -0
  322. package/dist/internal/passkey/management.mjs.map +1 -0
  323. package/dist/internal/passkey/registration-ceremony.d.mts +9 -0
  324. package/dist/internal/passkey/registration-ceremony.mjs +129 -0
  325. package/dist/internal/passkey/registration-ceremony.mjs.map +1 -0
  326. package/dist/internal/passkey/registration-custody.d.mts +2 -0
  327. package/dist/internal/passkey/registration-custody.mjs +52 -0
  328. package/dist/internal/passkey/registration-custody.mjs.map +1 -0
  329. package/dist/internal/passkey/registration-write.mjs +211 -0
  330. package/dist/internal/passkey/registration-write.mjs.map +1 -0
  331. package/dist/internal/passkey/state.d.mts +5 -0
  332. package/dist/internal/passkey/state.mjs +234 -0
  333. package/dist/internal/passkey/state.mjs.map +1 -0
  334. package/dist/internal/passkey/target.d.mts +19 -0
  335. package/dist/internal/passkey/target.mjs +190 -0
  336. package/dist/internal/passkey/target.mjs.map +1 -0
  337. package/dist/internal/passkey/write-state.mjs +345 -0
  338. package/dist/internal/passkey/write-state.mjs.map +1 -0
  339. package/dist/internal/passkey/write-target.mjs +192 -0
  340. package/dist/internal/passkey/write-target.mjs.map +1 -0
  341. package/dist/internal/passkey-kernel.mjs +49 -0
  342. package/dist/internal/passkey-kernel.mjs.map +1 -0
  343. package/dist/internal/passkeys.mjs +367 -0
  344. package/dist/internal/passkeys.mjs.map +1 -0
  345. package/dist/internal/password-kernel.d.mts +13 -0
  346. package/dist/internal/password-kernel.mjs +704 -0
  347. package/dist/internal/password-kernel.mjs.map +1 -0
  348. package/dist/internal/persistence.mjs +289 -0
  349. package/dist/internal/persistence.mjs.map +1 -0
  350. package/dist/internal/phone-kernel.mjs +434 -0
  351. package/dist/internal/phone-kernel.mjs.map +1 -0
  352. package/dist/internal/proof-kernel.d.mts +9 -0
  353. package/dist/internal/proof-kernel.mjs +619 -0
  354. package/dist/internal/proof-kernel.mjs.map +1 -0
  355. package/dist/internal/query-operations.d.mts +3 -0
  356. package/dist/internal/registration.mjs +65 -0
  357. package/dist/internal/registration.mjs.map +1 -0
  358. package/dist/internal/session-kernel.mjs +737 -0
  359. package/dist/internal/session-kernel.mjs.map +1 -0
  360. package/dist/internal/sql-persistence.d.mts +11 -0
  361. package/dist/internal/sql-persistence.mjs +37 -0
  362. package/dist/internal/sql-persistence.mjs.map +1 -0
  363. package/dist/internal/sql-query.mjs +207 -0
  364. package/dist/internal/sql-query.mjs.map +1 -0
  365. package/dist/internal/sql-table.d.mts +37 -0
  366. package/dist/internal/sql-table.mjs +71 -0
  367. package/dist/internal/sql-table.mjs.map +1 -0
  368. package/dist/internal/storage-mapping.mjs +687 -0
  369. package/dist/internal/storage-mapping.mjs.map +1 -0
  370. package/dist/internal/storage-tables.d.mts +914 -0
  371. package/dist/internal/storage-tables.mjs +387 -0
  372. package/dist/internal/storage-tables.mjs.map +1 -0
  373. package/dist/internal/storage-validation.mjs +58 -0
  374. package/dist/internal/storage-validation.mjs.map +1 -0
  375. package/dist/internal/transaction-execution-kernel.d.mts +18 -0
  376. package/dist/internal/transaction-execution-kernel.mjs +118 -0
  377. package/dist/internal/transaction-execution-kernel.mjs.map +1 -0
  378. package/dist/internal/transaction-kernel.d.mts +7 -0
  379. package/dist/internal/transaction-kernel.mjs +260 -0
  380. package/dist/internal/transaction-kernel.mjs.map +1 -0
  381. package/package.json +1 -0
  382. package/src/Drizzle.ts +378 -0
  383. package/src/DrizzleD1.ts +136 -0
  384. package/src/DrizzleLibsql.ts +301 -0
  385. package/src/DrizzleMysql2.ts +184 -0
  386. package/src/DrizzlePglite.ts +174 -0
  387. package/src/DrizzlePostgres.ts +174 -0
  388. package/src/DrizzleSqliteBun.ts +258 -0
  389. package/src/DrizzleSqliteDo.ts +473 -0
  390. package/src/DrizzleSqliteNode.ts +259 -0
  391. package/src/DrizzleSqliteWasm.ts +263 -0
  392. package/src/drizzle/D1BatchStatements.ts +10 -0
  393. package/src/drizzle/PasswordPreparedPostconditions.ts +30 -0
  394. package/src/drizzle/SuppliedService.ts +10 -0
  395. package/src/drizzle/d1-emails.ts +1829 -0
  396. package/src/drizzle/d1-generated-statement.ts +129 -0
  397. package/src/drizzle/d1-identity.ts +375 -0
  398. package/src/drizzle/d1-oauth.ts +340 -0
  399. package/src/drizzle/d1-passkey.ts +373 -0
  400. package/src/drizzle/d1-password-prepared.ts +1270 -0
  401. package/src/drizzle/d1-passwords.ts +2656 -0
  402. package/src/drizzle/d1-phone.ts +96 -0
  403. package/src/drizzle/d1-planning.ts +104 -0
  404. package/src/drizzle/d1-proofs.ts +2305 -0
  405. package/src/drizzle/d1-sessions.ts +2857 -0
  406. package/src/drizzle/d1-totp.ts +78 -0
  407. package/src/drizzle/email-model.ts +516 -0
  408. package/src/drizzle/email-registration.ts +698 -0
  409. package/src/drizzle/email-sql.ts +24 -0
  410. package/src/drizzle/email-target.ts +243 -0
  411. package/src/drizzle/model.ts +463 -0
  412. package/src/drizzle/mysql-emails.ts +321 -0
  413. package/src/drizzle/mysql-identity.ts +324 -0
  414. package/src/drizzle/mysql-password-prepared.ts +204 -0
  415. package/src/drizzle/mysql-passwords.ts +339 -0
  416. package/src/drizzle/mysql-proofs.ts +181 -0
  417. package/src/drizzle/mysql-sessions.ts +741 -0
  418. package/src/drizzle/mysql.ts +687 -0
  419. package/src/drizzle/oauth-accounts.ts +804 -0
  420. package/src/drizzle/oauth-connected-access.ts +354 -0
  421. package/src/drizzle/oauth-connected-collection.ts +324 -0
  422. package/src/drizzle/oauth-connected-custody.ts +277 -0
  423. package/src/drizzle/oauth-connected-drivers.ts +465 -0
  424. package/src/drizzle/oauth-connected-flow.ts +441 -0
  425. package/src/drizzle/oauth-connected-input.ts +127 -0
  426. package/src/drizzle/oauth-connected-maintenance.ts +345 -0
  427. package/src/drizzle/oauth-connected-management.ts +365 -0
  428. package/src/drizzle/oauth-connected-model.ts +347 -0
  429. package/src/drizzle/oauth-connected-reference.ts +112 -0
  430. package/src/drizzle/oauth-connected-settlement.ts +226 -0
  431. package/src/drizzle/oauth-connected-state.ts +845 -0
  432. package/src/drizzle/oauth-connected-target.ts +264 -0
  433. package/src/drizzle/oauth-drivers.ts +569 -0
  434. package/src/drizzle/oauth-flow.ts +462 -0
  435. package/src/drizzle/oauth-input.ts +201 -0
  436. package/src/drizzle/oauth-model.ts +617 -0
  437. package/src/drizzle/oauth-mysql.ts +10 -0
  438. package/src/drizzle/oauth-owner.ts +29 -0
  439. package/src/drizzle/oauth-registration.ts +640 -0
  440. package/src/drizzle/oauth-state.ts +215 -0
  441. package/src/drizzle/oauth-target.ts +750 -0
  442. package/src/drizzle/passkey-drivers.ts +385 -0
  443. package/src/drizzle/passkey-kernel.ts +3 -0
  444. package/src/drizzle/passkey-model.ts +353 -0
  445. package/src/drizzle/passkey-registration-ceremony-model.ts +69 -0
  446. package/src/drizzle/passkey-state.ts +3 -0
  447. package/src/drizzle/passkey-target.ts +23 -0
  448. package/src/drizzle/passkey-write-drivers.ts +395 -0
  449. package/src/drizzle/passkey-write-model.ts +271 -0
  450. package/src/drizzle/passkey-write-target.ts +9 -0
  451. package/src/drizzle/password-model.ts +491 -0
  452. package/src/drizzle/password-prepared-model.ts +259 -0
  453. package/src/drizzle/password-prepared-sql.ts +1191 -0
  454. package/src/drizzle/password-prepared-state.ts +231 -0
  455. package/src/drizzle/password-prepared-target.ts +160 -0
  456. package/src/drizzle/password-registration.ts +374 -0
  457. package/src/drizzle/password-sql.ts +12 -0
  458. package/src/drizzle/password-target.ts +224 -0
  459. package/src/drizzle/pg-emails.ts +321 -0
  460. package/src/drizzle/pg-password-prepared.ts +205 -0
  461. package/src/drizzle/pg-passwords.ts +338 -0
  462. package/src/drizzle/pg-proofs.ts +191 -0
  463. package/src/drizzle/pg-sessions.ts +750 -0
  464. package/src/drizzle/pg.ts +984 -0
  465. package/src/drizzle/phone-model.ts +190 -0
  466. package/src/drizzle/phone-state.ts +21 -0
  467. package/src/drizzle/phone-target.ts +472 -0
  468. package/src/drizzle/proof-model.ts +398 -0
  469. package/src/drizzle/proof-sql.ts +9 -0
  470. package/src/drizzle/proof-target.ts +122 -0
  471. package/src/drizzle/query-operations.ts +37 -0
  472. package/src/drizzle/session-model.ts +370 -0
  473. package/src/drizzle/session-sql.ts +13 -0
  474. package/src/drizzle/session-target.ts +338 -0
  475. package/src/drizzle/sqlite-emails.ts +366 -0
  476. package/src/drizzle/sqlite-identity.ts +344 -0
  477. package/src/drizzle/sqlite-password-prepared.ts +260 -0
  478. package/src/drizzle/sqlite-passwords.ts +497 -0
  479. package/src/drizzle/sqlite-proofs.ts +202 -0
  480. package/src/drizzle/sqlite-sessions.ts +971 -0
  481. package/src/drizzle/sqlite.ts +705 -0
  482. package/src/drizzle/standalone-guard.ts +38 -0
  483. package/src/drizzle/step-up-model.ts +128 -0
  484. package/src/drizzle/step-up-state.ts +139 -0
  485. package/src/drizzle/totp-model.ts +92 -0
  486. package/src/drizzle/totp-state.ts +525 -0
  487. package/src/drizzle/totp-target.ts +308 -0
  488. package/src/drizzle/transaction-execution.ts +12 -0
  489. package/src/drizzle/transaction-mysql.ts +104 -0
  490. package/src/drizzle/transaction-owner.ts +10 -0
  491. package/src/index.ts +4 -0
  492. package/src/internal/configuration.ts +282 -0
  493. package/src/internal/drizzle-migrations.ts +30 -0
  494. package/src/internal/drizzle-postgres.ts +81 -0
  495. package/src/internal/drizzle-sqlite.ts +79 -0
  496. package/src/internal/email-kernel.ts +1532 -0
  497. package/src/internal/mapping-error.ts +36 -0
  498. package/src/internal/passkey/admission.ts +362 -0
  499. package/src/internal/passkey/credentials.ts +511 -0
  500. package/src/internal/passkey/enrollment.ts +326 -0
  501. package/src/internal/passkey/flow.ts +1062 -0
  502. package/src/internal/passkey/management.ts +422 -0
  503. package/src/internal/passkey/registration-ceremony.ts +283 -0
  504. package/src/internal/passkey/registration-custody.ts +91 -0
  505. package/src/internal/passkey/registration-write.ts +426 -0
  506. package/src/internal/passkey/state.ts +354 -0
  507. package/src/internal/passkey/target.ts +586 -0
  508. package/src/internal/passkey/write-state.ts +681 -0
  509. package/src/internal/passkey/write-target.ts +452 -0
  510. package/src/internal/passkey-kernel.ts +102 -0
  511. package/src/internal/passkeys.ts +597 -0
  512. package/src/internal/password-kernel.ts +2122 -0
  513. package/src/internal/persistence.ts +590 -0
  514. package/src/internal/phone-kernel.ts +843 -0
  515. package/src/internal/proof-kernel.ts +1949 -0
  516. package/src/internal/query-operations.ts +26 -0
  517. package/src/internal/registration.ts +160 -0
  518. package/src/internal/session-kernel.ts +2210 -0
  519. package/src/internal/sql-persistence.ts +45 -0
  520. package/src/internal/sql-query.ts +298 -0
  521. package/src/internal/sql-table.ts +89 -0
  522. package/src/internal/storage-mapping.ts +706 -0
  523. package/src/internal/storage-tables.ts +408 -0
  524. package/src/internal/storage-validation.ts +117 -0
  525. package/src/internal/transaction-execution-kernel.ts +317 -0
  526. package/src/internal/transaction-kernel.ts +582 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proof-target.mjs","names":[],"sources":["../../src/drizzle/proof-target.ts"],"sourcesContent":["import {\n coordinateCommit,\n hasCommitScope,\n LifecycleHooks,\n type HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\nimport { ProofUnavailable, ProofPersistence } from \"@yielded/auth/Proofs\";\n/* oxlint-disable no-explicit-any -- public driver entrypoints restore concrete Drizzle types. */\nimport { Effect, Layer } from \"effect\";\nimport type * as SqlError from \"effect/unstable/sql/SqlError\";\n\nimport {\n makeSqlProofPersistence,\n type ProofSqlConfiguration,\n type ProofSqlDatabase,\n type ProofSqlQuery,\n} from \"./proof-sql\";\nimport { sqlClientStandaloneGuard } from \"./standalone-guard\";\n\nexport interface ProofTargetConfiguration {\n readonly mode: \"interactive\" | \"synchronous\";\n readonly locking: boolean;\n readonly standaloneGuard: Effect.Effect<void, ProofUnavailable>;\n readonly coordinatorGuard?: Effect.Effect<void, ProofUnavailable>;\n readonly insertIfAbsent: (\n query: ProofSqlQuery,\n selfKey: string,\n selfValue: unknown,\n ) => ProofSqlQuery;\n}\n\ninterface TransactionOwner<Transaction> {\n readonly transaction: <A, E, R>(\n body: (transaction: Transaction) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | SqlError.SqlError, R>;\n}\n\nexport type ProofCoordinatorError<E> =\n | E\n | ProofUnavailable\n | HookConfigurationError\n | SqlError.SqlError;\n\nexport const sqlClientProofStandaloneGuard = (\n database: unknown,\n): Effect.Effect<void, ProofUnavailable> =>\n sqlClientStandaloneGuard(database, () => ProofUnavailable.make({}));\n\nconst options = (\n configuration: ProofTargetConfiguration,\n coordinated = false,\n): ProofSqlConfiguration => ({\n mode: configuration.mode,\n locking: configuration.locking,\n\n standaloneGuard: !coordinated ? configuration.standaloneGuard : Effect.void,\n insertIfAbsent: configuration.insertIfAbsent,\n coordinated,\n});\n\nexport const makeTargetProofPersistenceServices = (\n database: any,\n mapping: any,\n configuration: ProofTargetConfiguration,\n) =>\n Effect.gen(function* () {\n return {\n proofPersistence: yield* makeSqlProofPersistence(database, mapping, options(configuration)),\n };\n });\n\n/**\n * The native transaction is the root commit owner. Interruption or owner failure\n * rolls it back and discards the journal. No owner effect is retried. Native\n * transaction-acquisition `SqlError`s are exposed; caller errors, including\n * Drizzle query wrappers, propagate unchanged.\n */\nexport const coordinateTargetProofPersistence = <Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: ProofTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly proofPersistence: ProofPersistence[\"Service\"] },\n ) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, ProofCoordinatorError<E>, R | LifecycleHooks> =>\n Effect.gen(function* (): Effect.fn.Return<A, ProofCoordinatorError<E>, R | LifecycleHooks> {\n const hooks = yield* LifecycleHooks;\n\n if (yield* hasCommitScope) return yield* ProofUnavailable.make({});\n yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;\n\n const result = yield* coordinateCommit(\n () =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n return yield* owner(transaction, {\n proofPersistence: yield* makeSqlProofPersistence(\n transaction as unknown as ProofSqlDatabase,\n mapping,\n options(configuration, true),\n ),\n });\n }),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.provideService(LifecycleHooks, hooks));\n\n return result.value;\n });\n\nexport const proofPersistenceLayer = (\n services: Effect.Effect<\n { readonly proofPersistence: ProofPersistence[\"Service\"] },\n never,\n LifecycleHooks\n >,\n) =>\n Layer.effect(\n ProofPersistence,\n Effect.map(services, (value) => value.proofPersistence),\n );\n"],"mappings":";;;;;;AA2CA,MAAa,iCACX,aAEA,yBAAyB,gBAAgB,iBAAiB,KAAK,CAAC,CAAC,CAAC;AAEpE,MAAM,WACJ,eACA,cAAc,WACa;CAC3B,MAAM,cAAc;CACpB,SAAS,cAAc;CAEvB,iBAAiB,CAAC,cAAc,cAAc,kBAAkB,OAAO;CACvE,gBAAgB,cAAc;CAC9B;AACF;AAEA,MAAa,sCACX,UACA,SACA,kBAEA,OAAO,IAAI,aAAa;CACtB,OAAO,EACL,kBAAkB,OAAO,wBAAwB,UAAU,SAAS,QAAQ,aAAa,CAAC,EAC5F;AACF,CAAC;;;;;;;AAQH,MAAa,oCACX,UACA,SACA,eACA,UAKA,OAAO,IAAI,aAAgF;CACzF,MAAM,QAAQ,OAAO;CAErB,IAAI,OAAO,gBAAgB,OAAO,OAAO,iBAAiB,KAAK,CAAC,CAAC;CACjE,OAAO,cAAc,oBAAoB,cAAc;CAkBvD,QAAO,OAhBe,uBAElB,SAAS,aAAa,gBACpB,OAAO,IAAI,aAAa;EACtB,OAAO,OAAO,MAAM,aAAa,EAC/B,kBAAkB,OAAO,wBACvB,aACA,SACA,QAAQ,eAAe,IAAI,CAC7B,EACF,CAAC;CACH,CAAC,CACH,GACF,EAAE,MAAM,cAAc,KAAK,CAC7B,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,KAAK,CAAC,EAAA,CAErC;AAChB,CAAC;AAEH,MAAa,yBACX,aAMA,MAAM,OACJ,kBACA,OAAO,IAAI,WAAW,UAAU,MAAM,gBAAgB,CACxD"}
@@ -0,0 +1,26 @@
1
+ import { column, updateValues } from "./model.mjs";
2
+ import { balancedD1And, compactD1GeneratedStatement } from "./d1-generated-statement.mjs";
3
+ import { and, asc, eq, getTableColumns, gt, gte, inArray, isNull, lte, notExists, or, sql } from "drizzle-orm";
4
+ //#region src/drizzle/query-operations.ts
5
+ const drizzleQueryOperations = {
6
+ and,
7
+ asc,
8
+ or,
9
+ eq,
10
+ gt,
11
+ gte,
12
+ lte,
13
+ inArray,
14
+ isNull,
15
+ notExists,
16
+ sql,
17
+ getTableColumns,
18
+ column,
19
+ updateValues,
20
+ balancedD1And,
21
+ compactD1GeneratedStatement
22
+ };
23
+ //#endregion
24
+ export { drizzleQueryOperations };
25
+
26
+ //# sourceMappingURL=query-operations.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-operations.mjs","names":[],"sources":["../../src/drizzle/query-operations.ts"],"sourcesContent":["import {\n and,\n asc,\n or,\n eq,\n gt,\n gte,\n lte,\n inArray,\n isNull,\n notExists,\n sql,\n getTableColumns,\n} from \"drizzle-orm\";\n\nimport type { QueryOperations } from \"../internal/query-operations\";\nimport { balancedD1And, compactD1GeneratedStatement } from \"./d1-generated-statement\";\nimport { column, updateValues } from \"./model\";\n\nexport const drizzleQueryOperations: QueryOperations = {\n and,\n asc,\n or,\n eq,\n gt,\n gte,\n lte,\n inArray,\n isNull,\n notExists,\n sql,\n getTableColumns,\n column,\n updateValues,\n balancedD1And,\n compactD1GeneratedStatement,\n};\n"],"mappings":";;;;AAmBA,MAAa,yBAA0C;CACrD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
@@ -0,0 +1,200 @@
1
+ import { PersistenceMappingError } from "../internal/mapping-error.mjs";
2
+ import { SubjectIdCodec } from "./model.mjs";
3
+ import { DateTime, Effect } from "effect";
4
+ import { TokenDigest } from "@yielded/auth/Schema";
5
+ import { AuthenticationEvidence, AuthenticationRequirement, PendingAuthenticationRecord, PendingAuthenticationState, SecurityRevision, SessionId, StatefulSessionRecord } from "@yielded/auth/Sessions";
6
+ import { InferInsertModel, InferSelectModel, SQL, Table } from "drizzle-orm";
7
+ //#region src/drizzle/session-model.d.ts
8
+ type ColumnKey<T extends Table> = Extract<keyof T["_"]["columns"], string>;
9
+ interface SessionIdCodec<NativeId> {
10
+ readonly toNative: (id: SessionId) => Effect.Effect<NativeId, PersistenceMappingError>;
11
+ readonly toSession: (id: NativeId) => Effect.Effect<SessionId, PersistenceMappingError>;
12
+ readonly equals: (left: NativeId, right: NativeId) => boolean;
13
+ }
14
+ interface SessionSubjectTables<Subject extends Table, NativeId> {
15
+ readonly subject: {
16
+ readonly table: Subject;
17
+ readonly id: ColumnKey<Subject>;
18
+ readonly status: ColumnKey<Subject>;
19
+ readonly securityRevision: ColumnKey<Subject>;
20
+ readonly isActiveStatus: (value: unknown) => boolean;
21
+ readonly decodeRequirement: (row: InferSelectModel<Subject>) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;
22
+ readonly nextSecurityRevision?: (current: SecurityRevision) => Effect.Effect<SecurityRevision, PersistenceMappingError>;
23
+ readonly nextSecurityRevisionSync?: (current: SecurityRevision) => SecurityRevision;
24
+ };
25
+ readonly subjectId: SubjectIdCodec<NativeId>;
26
+ }
27
+ interface SessionAuthorityTables<Subject extends Table, Credential extends Table, NativeId> extends SessionSubjectTables<Subject, NativeId> {
28
+ readonly credential: {
29
+ readonly table: Credential;
30
+ readonly subjectId: ColumnKey<Credential>;
31
+ readonly credentialId: ColumnKey<Credential>;
32
+ readonly revision: ColumnKey<Credential>;
33
+ /** Optional consumer status predicate; omitted means every stored credential row is active. */
34
+ readonly status?: ColumnKey<Credential>;
35
+ readonly isActiveStatus?: (value: unknown) => boolean;
36
+ };
37
+ }
38
+ interface SessionFlowTables<Flow extends Table, NativeSubjectId> {
39
+ readonly flow: {
40
+ readonly table: Flow;
41
+ readonly flowId: ColumnKey<Flow>;
42
+ readonly subjectId: ColumnKey<Flow>;
43
+ readonly state: ColumnKey<Flow>;
44
+ readonly pendingDigest: ColumnKey<Flow>;
45
+ readonly dedupUntil: ColumnKey<Flow>;
46
+ readonly pendingStateValue: unknown;
47
+ readonly establishedStateValue: unknown;
48
+ readonly encodeInstant: (instant: DateTime.Utc) => unknown;
49
+ readonly decodeInstant: (native: unknown) => Effect.Effect<DateTime.Utc, PersistenceMappingError>;
50
+ readonly encodePendingInsert: (input: {
51
+ readonly evidence: AuthenticationEvidence;
52
+ readonly subjectId: NativeSubjectId;
53
+ readonly pendingDigest: TokenDigest;
54
+ readonly dedupUntil: DateTime.Utc;
55
+ }) => InferInsertModel<Flow>;
56
+ readonly encodeEstablishedInsert: (input: {
57
+ readonly evidence: AuthenticationEvidence;
58
+ readonly subjectId: NativeSubjectId;
59
+ readonly dedupUntil: DateTime.Utc;
60
+ }) => InferInsertModel<Flow>;
61
+ };
62
+ }
63
+ interface StatefulSessionTables<Claims, Session extends Table, Flow extends Table, NativeSubjectId, NativeSessionId> extends SessionFlowTables<Flow, NativeSubjectId> {
64
+ readonly session: {
65
+ readonly table: Session;
66
+ readonly sessionId: ColumnKey<Session>;
67
+ readonly subjectId: ColumnKey<Session>;
68
+ readonly digest: ColumnKey<Session>;
69
+ readonly version: ColumnKey<Session>;
70
+ readonly securityRevision: ColumnKey<Session>;
71
+ readonly issuedAt: ColumnKey<Session>;
72
+ readonly expiresAt: ColumnKey<Session>;
73
+ readonly absoluteExpiresAt: ColumnKey<Session>;
74
+ readonly encodeInstant: (instant: DateTime.Utc) => unknown;
75
+ readonly encodeInsert: (record: StatefulSessionRecord<Claims>, ids: {
76
+ readonly subjectId: NativeSubjectId;
77
+ readonly sessionId: NativeSessionId;
78
+ }) => InferInsertModel<Session>;
79
+ /** Persist the prepared credentialVersion and retain exact private provenance. */
80
+ readonly encodeRotation: (record: StatefulSessionRecord<Claims>) => Partial<InferInsertModel<Session>>;
81
+ readonly decode: (row: InferSelectModel<Session>) => Effect.Effect<StatefulSessionRecord<Claims>, PersistenceMappingError>;
82
+ readonly allocateId?: Effect.Effect<NativeSessionId, PersistenceMappingError>;
83
+ readonly allocateIdSync?: () => NativeSessionId;
84
+ readonly allocateVersion?: Effect.Effect<SecurityRevision, PersistenceMappingError>;
85
+ readonly allocateVersionSync?: () => SecurityRevision;
86
+ };
87
+ readonly sessionId: SessionIdCodec<NativeSessionId>;
88
+ }
89
+ interface PendingAuthenticationTables<Claims, Pending extends Table, Flow extends Table, NativeSubjectId> extends SessionFlowTables<Flow, NativeSubjectId> {
90
+ readonly pending: {
91
+ readonly table: Pending;
92
+ readonly digest: ColumnKey<Pending>;
93
+ readonly version: ColumnKey<Pending>;
94
+ readonly flowId: ColumnKey<Pending>;
95
+ readonly subjectId: ColumnKey<Pending>;
96
+ readonly bindingDigest: ColumnKey<Pending>;
97
+ readonly expiresAt: ColumnKey<Pending>;
98
+ readonly attemptLimit: ColumnKey<Pending>;
99
+ readonly failedAttempts: ColumnKey<Pending>;
100
+ readonly consumed: ColumnKey<Pending>;
101
+ readonly encodeInstant: (instant: DateTime.Utc) => unknown;
102
+ readonly encodeInsert: (record: PendingAuthenticationRecord<Claims>, input: {
103
+ readonly subjectId: NativeSubjectId;
104
+ readonly failedAttempts: 0;
105
+ readonly consumed: false;
106
+ }) => InferInsertModel<Pending>;
107
+ readonly decode: (row: InferSelectModel<Pending>) => Effect.Effect<PendingAuthenticationRecord<Claims>, PersistenceMappingError>;
108
+ /** Decodes original evidence and storage guards only. The internal pending
109
+ * context lookup must not execute unrelated consumer Claims transforms. */
110
+ readonly decodeContext: (row: InferSelectModel<Pending>) => Effect.Effect<PendingAuthenticationState, PersistenceMappingError>;
111
+ readonly allocateVersion?: Effect.Effect<SecurityRevision, PersistenceMappingError>;
112
+ readonly allocateVersionSync?: () => SecurityRevision;
113
+ };
114
+ }
115
+ interface SignedSessionValidityTables<Tombstone extends Table, NativeSubjectId, NativeSessionId> {
116
+ readonly tombstone: {
117
+ readonly table: Tombstone;
118
+ readonly subjectId: ColumnKey<Tombstone>;
119
+ readonly sessionId: ColumnKey<Tombstone>;
120
+ readonly absoluteExpiresAt: ColumnKey<Tombstone>;
121
+ readonly encodeInstant: (instant: DateTime.Utc) => unknown;
122
+ readonly decodeInstant: (native: unknown) => Effect.Effect<DateTime.Utc, PersistenceMappingError>;
123
+ readonly encodeInsert: (input: {
124
+ readonly subjectId: NativeSubjectId;
125
+ readonly sessionId: NativeSessionId;
126
+ readonly absoluteExpiresAt: DateTime.Utc;
127
+ }) => InferInsertModel<Tombstone>;
128
+ };
129
+ readonly sessionId: SessionIdCodec<NativeSessionId>;
130
+ }
131
+ interface RequiredSessionConstraints {
132
+ readonly sessionDigest: "unique(session.digest)";
133
+ readonly flowId: "unique(flow.flowId)";
134
+ }
135
+ interface RequiredPendingAuthenticationConstraints {
136
+ readonly pendingDigest: "unique(pending.digest)";
137
+ readonly pendingFlow: "unique(pending.flowId)";
138
+ readonly flowId: "unique(flow.flowId)";
139
+ }
140
+ interface RequiredStatefulPendingConstraints extends RequiredSessionConstraints, RequiredPendingAuthenticationConstraints {}
141
+ interface RequiredSignedValidityConstraints {
142
+ readonly tombstoneOwner: "unique(tombstone.subjectId,tombstone.sessionId)";
143
+ }
144
+ declare const requiredSessionConstraints: RequiredSessionConstraints;
145
+ declare const requiredPendingAuthenticationConstraints: RequiredPendingAuthenticationConstraints;
146
+ declare const requiredStatefulPendingConstraints: RequiredStatefulPendingConstraints;
147
+ declare const requiredSignedValidityConstraints: RequiredSignedValidityConstraints;
148
+ interface SessionConstraintClassifier {
149
+ /**
150
+ * Match only the named unique constraints declared by this mapping. Broad
151
+ * SQL/constraint classifiers can relabel application or NOT NULL failures as
152
+ * a domain conflict.
153
+ */
154
+ readonly isConstraintConflict: (cause: unknown) => boolean;
155
+ }
156
+ type AuthenticationAuthorityMapping<Claims, Subject extends Table, Credential extends Table, Flow extends Table, Pending extends Table, NativeSubjectId> = SessionAuthorityTables<Subject, Credential, NativeSubjectId> & SessionConstraintClassifier & ({
157
+ /** Omit for single-factor authority installations. Pending input then fails closed. */
158
+ readonly pending?: undefined;
159
+ } | {
160
+ readonly pending: PendingAuthenticationTables<Claims, Pending, Flow, NativeSubjectId>;
161
+ readonly constraints: RequiredPendingAuthenticationConstraints;
162
+ });
163
+ type StatefulSessionMapping<Claims, Subject extends Table, Credential extends Table, Session extends Table, Flow extends Table, Pending extends Table, NativeSubjectId, NativeSessionId> = SessionAuthorityTables<Subject, Credential, NativeSubjectId> & StatefulSessionTables<Claims, Session, Flow, NativeSubjectId, NativeSessionId> & SessionConstraintClassifier & ({
164
+ /** Omit when this session module does not support pending MFA completion. */
165
+ readonly pending?: undefined;
166
+ readonly constraints: RequiredSessionConstraints;
167
+ } | {
168
+ readonly pending: PendingAuthenticationTables<Claims, Pending, Flow, NativeSubjectId>["pending"];
169
+ readonly constraints: RequiredStatefulPendingConstraints;
170
+ });
171
+ type PendingAuthenticationMapping<Claims, Subject extends Table, Credential extends Table, Pending extends Table, Flow extends Table, NativeSubjectId> = SessionAuthorityTables<Subject, Credential, NativeSubjectId> & PendingAuthenticationTables<Claims, Pending, Flow, NativeSubjectId> & SessionConstraintClassifier & {
172
+ readonly constraints: RequiredPendingAuthenticationConstraints;
173
+ };
174
+ type SignedSessionValidityMapping<Subject extends Table, Tombstone extends Table, NativeSubjectId, NativeSessionId> = SessionSubjectTables<Subject, NativeSubjectId> & SignedSessionValidityTables<Tombstone, NativeSubjectId, NativeSessionId> & SessionConstraintClassifier & {
175
+ readonly constraints: RequiredSignedValidityConstraints;
176
+ };
177
+ /** D1 evaluates these expressions inside the atomic batch, after queueing delay.
178
+ * `engineNow` must use the exact native representation of every mapped instant
179
+ * column. `engineNowMillis` is Unix epoch milliseconds for proof freshness.
180
+ * Changes to the consumer's factor policy MUST bump subject.securityRevision.
181
+ * Supply the authoritative primary D1 database, never a replica-affined
182
+ * `withSession` handle, because verification and security revision reads must
183
+ * observe completed revocation writes across clients.
184
+ */
185
+ interface D1SessionClockMapping {
186
+ readonly d1: {
187
+ readonly engineNow: SQL;
188
+ readonly engineNowMillis: SQL;
189
+ readonly activeSubjectStatusValue: unknown;
190
+ /** Required when `credential.status` is mapped. */
191
+ readonly activeCredentialStatusValue?: unknown;
192
+ };
193
+ }
194
+ type D1AuthenticationAuthorityMapping<Claims, Subject extends Table, Credential extends Table, Flow extends Table, Pending extends Table, NativeSubjectId> = AuthenticationAuthorityMapping<Claims, Subject, Credential, Flow, Pending, NativeSubjectId> & D1SessionClockMapping;
195
+ type D1PendingAuthenticationMapping<Claims, Subject extends Table, Credential extends Table, Pending extends Table, Flow extends Table, NativeSubjectId> = PendingAuthenticationMapping<Claims, Subject, Credential, Pending, Flow, NativeSubjectId> & D1SessionClockMapping;
196
+ type D1StatefulSessionMapping<Claims, Subject extends Table, Credential extends Table, Session extends Table, Flow extends Table, Pending extends Table, NativeSubjectId, NativeSessionId> = StatefulSessionMapping<Claims, Subject, Credential, Session, Flow, Pending, NativeSubjectId, NativeSessionId> & D1SessionClockMapping;
197
+ type D1SignedSessionValidityMapping<Subject extends Table, Tombstone extends Table, NativeSubjectId, NativeSessionId> = SignedSessionValidityMapping<Subject, Tombstone, NativeSubjectId, NativeSessionId> & D1SessionClockMapping;
198
+ //#endregion
199
+ export { AuthenticationAuthorityMapping, D1AuthenticationAuthorityMapping, D1PendingAuthenticationMapping, D1SessionClockMapping, D1SignedSessionValidityMapping, D1StatefulSessionMapping, PendingAuthenticationMapping, PendingAuthenticationTables, RequiredPendingAuthenticationConstraints, RequiredSessionConstraints, RequiredSignedValidityConstraints, RequiredStatefulPendingConstraints, SessionAuthorityTables, SessionConstraintClassifier, SessionFlowTables, SessionIdCodec, SessionSubjectTables, SignedSessionValidityMapping, SignedSessionValidityTables, StatefulSessionMapping, StatefulSessionTables, requiredPendingAuthenticationConstraints, requiredSessionConstraints, requiredSignedValidityConstraints, requiredStatefulPendingConstraints };
200
+ //# sourceMappingURL=session-model.d.mts.map
@@ -0,0 +1,20 @@
1
+ import "@yielded/auth/Sessions";
2
+ //#region src/drizzle/session-model.ts
3
+ const requiredSessionConstraints = {
4
+ sessionDigest: "unique(session.digest)",
5
+ flowId: "unique(flow.flowId)"
6
+ };
7
+ const requiredPendingAuthenticationConstraints = {
8
+ pendingDigest: "unique(pending.digest)",
9
+ pendingFlow: "unique(pending.flowId)",
10
+ flowId: "unique(flow.flowId)"
11
+ };
12
+ const requiredStatefulPendingConstraints = {
13
+ ...requiredSessionConstraints,
14
+ ...requiredPendingAuthenticationConstraints
15
+ };
16
+ const requiredSignedValidityConstraints = { tombstoneOwner: "unique(tombstone.subjectId,tombstone.sessionId)" };
17
+ //#endregion
18
+ export { requiredPendingAuthenticationConstraints, requiredSessionConstraints, requiredSignedValidityConstraints, requiredStatefulPendingConstraints };
19
+
20
+ //# sourceMappingURL=session-model.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-model.mjs","names":[],"sources":["../../src/drizzle/session-model.ts"],"sourcesContent":["import type { TokenDigest } from \"@yielded/auth/Schema\";\nimport {\n type AuthenticationRequirement,\n type AuthenticationEvidence,\n type SecurityRevision,\n type SessionId,\n type PendingAuthenticationRecord,\n type PendingAuthenticationState,\n type StatefulSessionRecord,\n} from \"@yielded/auth/Sessions\";\nimport type { InferInsertModel, InferSelectModel, SQL, Table } from \"drizzle-orm\";\nimport type { DateTime, Effect } from \"effect\";\n\nimport type { PersistenceMappingError, SubjectIdCodec } from \"./model\";\n\ntype ColumnKey<T extends Table> = Extract<keyof T[\"_\"][\"columns\"], string>;\n\nexport interface SessionIdCodec<NativeId> {\n readonly toNative: (id: SessionId) => Effect.Effect<NativeId, PersistenceMappingError>;\n readonly toSession: (id: NativeId) => Effect.Effect<SessionId, PersistenceMappingError>;\n readonly equals: (left: NativeId, right: NativeId) => boolean;\n}\n\nexport interface SessionSubjectTables<Subject extends Table, NativeId> {\n readonly subject: {\n readonly table: Subject;\n readonly id: ColumnKey<Subject>;\n readonly status: ColumnKey<Subject>;\n readonly securityRevision: ColumnKey<Subject>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly decodeRequirement: (\n row: InferSelectModel<Subject>,\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n readonly nextSecurityRevision?: (\n current: SecurityRevision,\n ) => Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly nextSecurityRevisionSync?: (current: SecurityRevision) => SecurityRevision;\n };\n readonly subjectId: SubjectIdCodec<NativeId>;\n}\n\nexport interface SessionAuthorityTables<\n Subject extends Table,\n Credential extends Table,\n NativeId,\n> extends SessionSubjectTables<Subject, NativeId> {\n readonly credential: {\n readonly table: Credential;\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly revision: ColumnKey<Credential>;\n /** Optional consumer status predicate; omitted means every stored credential row is active. */\n readonly status?: ColumnKey<Credential>;\n readonly isActiveStatus?: (value: unknown) => boolean;\n };\n}\n\nexport interface SessionFlowTables<Flow extends Table, NativeSubjectId> {\n readonly flow: {\n readonly table: Flow;\n readonly flowId: ColumnKey<Flow>;\n readonly subjectId: ColumnKey<Flow>;\n readonly state: ColumnKey<Flow>;\n readonly pendingDigest: ColumnKey<Flow>;\n readonly dedupUntil: ColumnKey<Flow>;\n readonly pendingStateValue: unknown;\n readonly establishedStateValue: unknown;\n readonly encodeInstant: (instant: DateTime.Utc) => unknown;\n readonly decodeInstant: (\n native: unknown,\n ) => Effect.Effect<DateTime.Utc, PersistenceMappingError>;\n readonly encodePendingInsert: (input: {\n readonly evidence: AuthenticationEvidence;\n readonly subjectId: NativeSubjectId;\n readonly pendingDigest: TokenDigest;\n readonly dedupUntil: DateTime.Utc;\n }) => InferInsertModel<Flow>;\n readonly encodeEstablishedInsert: (input: {\n readonly evidence: AuthenticationEvidence;\n readonly subjectId: NativeSubjectId;\n readonly dedupUntil: DateTime.Utc;\n }) => InferInsertModel<Flow>;\n };\n}\n\nexport interface StatefulSessionTables<\n Claims,\n Session extends Table,\n Flow extends Table,\n NativeSubjectId,\n NativeSessionId,\n> extends SessionFlowTables<Flow, NativeSubjectId> {\n readonly session: {\n readonly table: Session;\n readonly sessionId: ColumnKey<Session>;\n readonly subjectId: ColumnKey<Session>;\n readonly digest: ColumnKey<Session>;\n readonly version: ColumnKey<Session>;\n readonly securityRevision: ColumnKey<Session>;\n readonly issuedAt: ColumnKey<Session>;\n readonly expiresAt: ColumnKey<Session>;\n readonly absoluteExpiresAt: ColumnKey<Session>;\n readonly encodeInstant: (instant: DateTime.Utc) => unknown;\n readonly encodeInsert: (\n record: StatefulSessionRecord<Claims>,\n ids: { readonly subjectId: NativeSubjectId; readonly sessionId: NativeSessionId },\n ) => InferInsertModel<Session>;\n /** Persist the prepared credentialVersion and retain exact private provenance. */\n readonly encodeRotation: (\n record: StatefulSessionRecord<Claims>,\n ) => Partial<InferInsertModel<Session>>;\n readonly decode: (\n row: InferSelectModel<Session>,\n ) => Effect.Effect<StatefulSessionRecord<Claims>, PersistenceMappingError>;\n readonly allocateId?: Effect.Effect<NativeSessionId, PersistenceMappingError>;\n readonly allocateIdSync?: () => NativeSessionId;\n readonly allocateVersion?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateVersionSync?: () => SecurityRevision;\n };\n readonly sessionId: SessionIdCodec<NativeSessionId>;\n}\n\nexport interface PendingAuthenticationTables<\n Claims,\n Pending extends Table,\n Flow extends Table,\n NativeSubjectId,\n> extends SessionFlowTables<Flow, NativeSubjectId> {\n readonly pending: {\n readonly table: Pending;\n readonly digest: ColumnKey<Pending>;\n readonly version: ColumnKey<Pending>;\n readonly flowId: ColumnKey<Pending>;\n readonly subjectId: ColumnKey<Pending>;\n readonly bindingDigest: ColumnKey<Pending>;\n readonly expiresAt: ColumnKey<Pending>;\n readonly attemptLimit: ColumnKey<Pending>;\n readonly failedAttempts: ColumnKey<Pending>;\n readonly consumed: ColumnKey<Pending>;\n readonly encodeInstant: (instant: DateTime.Utc) => unknown;\n readonly encodeInsert: (\n record: PendingAuthenticationRecord<Claims>,\n input: {\n readonly subjectId: NativeSubjectId;\n readonly failedAttempts: 0;\n readonly consumed: false;\n },\n ) => InferInsertModel<Pending>;\n readonly decode: (\n row: InferSelectModel<Pending>,\n ) => Effect.Effect<PendingAuthenticationRecord<Claims>, PersistenceMappingError>;\n /** Decodes original evidence and storage guards only. The internal pending\n * context lookup must not execute unrelated consumer Claims transforms. */\n readonly decodeContext: (\n row: InferSelectModel<Pending>,\n ) => Effect.Effect<PendingAuthenticationState, PersistenceMappingError>;\n readonly allocateVersion?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateVersionSync?: () => SecurityRevision;\n };\n}\n\nexport interface SignedSessionValidityTables<\n Tombstone extends Table,\n NativeSubjectId,\n NativeSessionId,\n> {\n readonly tombstone: {\n readonly table: Tombstone;\n readonly subjectId: ColumnKey<Tombstone>;\n readonly sessionId: ColumnKey<Tombstone>;\n readonly absoluteExpiresAt: ColumnKey<Tombstone>;\n readonly encodeInstant: (instant: DateTime.Utc) => unknown;\n readonly decodeInstant: (\n native: unknown,\n ) => Effect.Effect<DateTime.Utc, PersistenceMappingError>;\n readonly encodeInsert: (input: {\n readonly subjectId: NativeSubjectId;\n readonly sessionId: NativeSessionId;\n readonly absoluteExpiresAt: DateTime.Utc;\n }) => InferInsertModel<Tombstone>;\n };\n readonly sessionId: SessionIdCodec<NativeSessionId>;\n}\n\nexport interface RequiredSessionConstraints {\n readonly sessionDigest: \"unique(session.digest)\";\n readonly flowId: \"unique(flow.flowId)\";\n}\n\nexport interface RequiredPendingAuthenticationConstraints {\n readonly pendingDigest: \"unique(pending.digest)\";\n readonly pendingFlow: \"unique(pending.flowId)\";\n readonly flowId: \"unique(flow.flowId)\";\n}\n\nexport interface RequiredStatefulPendingConstraints\n extends RequiredSessionConstraints, RequiredPendingAuthenticationConstraints {}\n\nexport interface RequiredSignedValidityConstraints {\n readonly tombstoneOwner: \"unique(tombstone.subjectId,tombstone.sessionId)\";\n}\n\nexport const requiredSessionConstraints: RequiredSessionConstraints = {\n sessionDigest: \"unique(session.digest)\",\n flowId: \"unique(flow.flowId)\",\n};\n\nexport const requiredPendingAuthenticationConstraints: RequiredPendingAuthenticationConstraints = {\n pendingDigest: \"unique(pending.digest)\",\n pendingFlow: \"unique(pending.flowId)\",\n flowId: \"unique(flow.flowId)\",\n};\n\nexport const requiredStatefulPendingConstraints: RequiredStatefulPendingConstraints = {\n ...requiredSessionConstraints,\n ...requiredPendingAuthenticationConstraints,\n};\n\nexport const requiredSignedValidityConstraints: RequiredSignedValidityConstraints = {\n tombstoneOwner: \"unique(tombstone.subjectId,tombstone.sessionId)\",\n};\n\nexport interface SessionConstraintClassifier {\n /**\n * Match only the named unique constraints declared by this mapping. Broad\n * SQL/constraint classifiers can relabel application or NOT NULL failures as\n * a domain conflict.\n */\n readonly isConstraintConflict: (cause: unknown) => boolean;\n}\n\nexport type AuthenticationAuthorityMapping<\n Claims,\n Subject extends Table,\n Credential extends Table,\n Flow extends Table,\n Pending extends Table,\n NativeSubjectId,\n> = SessionAuthorityTables<Subject, Credential, NativeSubjectId> &\n SessionConstraintClassifier &\n (\n | {\n /** Omit for single-factor authority installations. Pending input then fails closed. */\n readonly pending?: undefined;\n }\n | {\n readonly pending: PendingAuthenticationTables<Claims, Pending, Flow, NativeSubjectId>;\n readonly constraints: RequiredPendingAuthenticationConstraints;\n }\n );\n\nexport type StatefulSessionMapping<\n Claims,\n Subject extends Table,\n Credential extends Table,\n Session extends Table,\n Flow extends Table,\n Pending extends Table,\n NativeSubjectId,\n NativeSessionId,\n> = SessionAuthorityTables<Subject, Credential, NativeSubjectId> &\n StatefulSessionTables<Claims, Session, Flow, NativeSubjectId, NativeSessionId> &\n SessionConstraintClassifier &\n (\n | {\n /** Omit when this session module does not support pending MFA completion. */\n readonly pending?: undefined;\n readonly constraints: RequiredSessionConstraints;\n }\n | {\n readonly pending: PendingAuthenticationTables<\n Claims,\n Pending,\n Flow,\n NativeSubjectId\n >[\"pending\"];\n readonly constraints: RequiredStatefulPendingConstraints;\n }\n );\n\nexport type PendingAuthenticationMapping<\n Claims,\n Subject extends Table,\n Credential extends Table,\n Pending extends Table,\n Flow extends Table,\n NativeSubjectId,\n> = SessionAuthorityTables<Subject, Credential, NativeSubjectId> &\n PendingAuthenticationTables<Claims, Pending, Flow, NativeSubjectId> &\n SessionConstraintClassifier & {\n readonly constraints: RequiredPendingAuthenticationConstraints;\n };\n\nexport type SignedSessionValidityMapping<\n Subject extends Table,\n Tombstone extends Table,\n NativeSubjectId,\n NativeSessionId,\n> = SessionSubjectTables<Subject, NativeSubjectId> &\n SignedSessionValidityTables<Tombstone, NativeSubjectId, NativeSessionId> &\n SessionConstraintClassifier & {\n readonly constraints: RequiredSignedValidityConstraints;\n };\n\n/** D1 evaluates these expressions inside the atomic batch, after queueing delay.\n * `engineNow` must use the exact native representation of every mapped instant\n * column. `engineNowMillis` is Unix epoch milliseconds for proof freshness.\n * Changes to the consumer's factor policy MUST bump subject.securityRevision.\n * Supply the authoritative primary D1 database, never a replica-affined\n * `withSession` handle, because verification and security revision reads must\n * observe completed revocation writes across clients.\n */\nexport interface D1SessionClockMapping {\n readonly d1: {\n readonly engineNow: SQL;\n readonly engineNowMillis: SQL;\n readonly activeSubjectStatusValue: unknown;\n /** Required when `credential.status` is mapped. */\n readonly activeCredentialStatusValue?: unknown;\n };\n}\n\nexport type D1AuthenticationAuthorityMapping<\n Claims,\n Subject extends Table,\n Credential extends Table,\n Flow extends Table,\n Pending extends Table,\n NativeSubjectId,\n> = AuthenticationAuthorityMapping<Claims, Subject, Credential, Flow, Pending, NativeSubjectId> &\n D1SessionClockMapping;\n\nexport type D1PendingAuthenticationMapping<\n Claims,\n Subject extends Table,\n Credential extends Table,\n Pending extends Table,\n Flow extends Table,\n NativeSubjectId,\n> = PendingAuthenticationMapping<Claims, Subject, Credential, Pending, Flow, NativeSubjectId> &\n D1SessionClockMapping;\n\nexport type D1StatefulSessionMapping<\n Claims,\n Subject extends Table,\n Credential extends Table,\n Session extends Table,\n Flow extends Table,\n Pending extends Table,\n NativeSubjectId,\n NativeSessionId,\n> = StatefulSessionMapping<\n Claims,\n Subject,\n Credential,\n Session,\n Flow,\n Pending,\n NativeSubjectId,\n NativeSessionId\n> &\n D1SessionClockMapping;\n\nexport type D1SignedSessionValidityMapping<\n Subject extends Table,\n Tombstone extends Table,\n NativeSubjectId,\n NativeSessionId,\n> = SignedSessionValidityMapping<Subject, Tombstone, NativeSubjectId, NativeSessionId> &\n D1SessionClockMapping;\n"],"mappings":";;AA0MA,MAAa,6BAAyD;CACpE,eAAe;CACf,QAAQ;AACV;AAEA,MAAa,2CAAqF;CAChG,eAAe;CACf,aAAa;CACb,QAAQ;AACV;AAEA,MAAa,qCAAyE;CACpF,GAAG;CACH,GAAG;AACL;AAEA,MAAa,oCAAuE,EAClF,gBAAgB,kDAClB"}
@@ -0,0 +1,8 @@
1
+ import { CurrentSessionSql, makeSessionKernel } from "../internal/session-kernel.mjs";
2
+ import { drizzleQueryOperations } from "./query-operations.mjs";
3
+ //#region src/drizzle/session-sql.ts
4
+ const { makeSqlAuthenticationAuthority, makeSqlPendingAuthentication, makeSqlStatefulSessions, makeSqlSignedValidity, makeSqlSessionStepUp } = makeSessionKernel(drizzleQueryOperations);
5
+ //#endregion
6
+ export { CurrentSessionSql, makeSqlAuthenticationAuthority, makeSqlPendingAuthentication, makeSqlSessionStepUp, makeSqlSignedValidity, makeSqlStatefulSessions };
7
+
8
+ //# sourceMappingURL=session-sql.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-sql.mjs","names":[],"sources":["../../src/drizzle/session-sql.ts"],"sourcesContent":["import { makeSessionKernel } from \"../internal/session-kernel\";\nimport { drizzleQueryOperations } from \"./query-operations\";\nexport type { SessionSqlDatabase } from \"../internal/session-kernel\";\nexport { CurrentSessionSql } from \"../internal/session-kernel\";\nexport type { SessionSqlOptions } from \"../internal/session-kernel\";\n\nexport const {\n makeSqlAuthenticationAuthority,\n makeSqlPendingAuthentication,\n makeSqlStatefulSessions,\n makeSqlSignedValidity,\n makeSqlSessionStepUp,\n} = makeSessionKernel(drizzleQueryOperations);\n"],"mappings":";;;AAMA,MAAa,EACX,gCACA,8BACA,yBACA,uBACA,yBACE,kBAAkB,sBAAsB"}
@@ -0,0 +1,28 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
3
+ import { AuthenticationAuthority, PendingAuthentication, SessionRepository, SessionStepUpPersistence, SessionUnavailable, SignedSessionValidity, StatefulSessionPersistence } from "@yielded/auth/Sessions";
4
+ import "effect/unstable/sql/SqlError";
5
+ //#region src/drizzle/session-target.d.ts
6
+ declare const authenticationAuthorityLayer: (services: Effect.Effect<{
7
+ readonly authenticationAuthority: AuthenticationAuthority["Service"];
8
+ }, never, LifecycleHooks>) => Layer.Layer<AuthenticationAuthority, never, LifecycleHooks>;
9
+ declare const statefulSessionLayers: <Claims>(module: {
10
+ readonly StatefulSessionPersistence: any;
11
+ readonly SessionRepository: any;
12
+ }, services: Effect.Effect<{
13
+ readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;
14
+ readonly sessionRepository: SessionRepository;
15
+ }, never, LifecycleHooks>) => Layer.Layer<unknown, never, LifecycleHooks>;
16
+ declare const pendingAuthenticationLayer: <Claims>(module: {
17
+ readonly PendingAuthentication: any;
18
+ }, services: Effect.Effect<{
19
+ readonly pendingAuthentication: PendingAuthentication<Claims>;
20
+ }, never, LifecycleHooks>) => Layer.Layer<unknown, never, LifecycleHooks>;
21
+ declare const signedSessionValidityLayer: (module: {
22
+ readonly SignedSessionValidity: any;
23
+ }, services: Effect.Effect<{
24
+ readonly signedSessionValidity: SignedSessionValidity;
25
+ }, never, LifecycleHooks>) => Layer.Layer<unknown, never, LifecycleHooks>;
26
+ //#endregion
27
+ export { authenticationAuthorityLayer, pendingAuthenticationLayer, signedSessionValidityLayer, statefulSessionLayers };
28
+ //# sourceMappingURL=session-target.d.mts.map
@@ -0,0 +1,47 @@
1
+ import { CurrentSessionSql } from "../internal/session-kernel.mjs";
2
+ import { makeSqlAuthenticationAuthority, makeSqlPendingAuthentication, makeSqlSessionStepUp, makeSqlSignedValidity, makeSqlStatefulSessions } from "./session-sql.mjs";
3
+ import { sqlClientStandaloneGuard } from "./standalone-guard.mjs";
4
+ import { Effect, Layer } from "effect";
5
+ import { coordinateCommit, hasCommitScope } from "@yielded/auth/Hooks";
6
+ import { AuthenticationAuthority, SessionUnavailable } from "@yielded/auth/Sessions";
7
+ //#region src/drizzle/session-target.ts
8
+ const sqlClientSessionStandaloneGuard = (database) => sqlClientStandaloneGuard(database, () => SessionUnavailable.make({}));
9
+ const options = (configuration, transactionBound = false) => ({
10
+ mode: configuration.mode,
11
+ locking: configuration.locking,
12
+ standaloneGuard: transactionBound ? Effect.void : configuration.standaloneGuard
13
+ });
14
+ const makeTargetAuthenticationAuthorityServices = (database, mapping, configuration) => Effect.map(makeSqlAuthenticationAuthority(database, mapping, options(configuration)), (authenticationAuthority) => ({ authenticationAuthority }));
15
+ const makeTargetPendingAuthenticationServices = (database, mapping, configuration) => Effect.map(makeSqlPendingAuthentication(database, mapping, options(configuration)), (pendingAuthentication) => ({ pendingAuthentication }));
16
+ const makeTargetStatefulSessionServices = (database, mapping, configuration) => makeSqlStatefulSessions(database, mapping, options(configuration));
17
+ const makeTargetSignedSessionValidityServices = (database, mapping, configuration) => Effect.map(makeSqlSignedValidity(database, mapping, options(configuration)), (signedSessionValidity) => ({ signedSessionValidity }));
18
+ /**
19
+ * The native transaction is the root commit owner. Interruption or owner
20
+ * failure rolls it back and discards the child journal; this adapter performs
21
+ * no hidden retry. A caller that can safely retry must rerun the complete owner
22
+ * operation and prepare fresh bearer material. The low-level coordinator keeps
23
+ * caller failures intact, including Drizzle query wrappers, and exposes a
24
+ * native `SqlError` when transaction acquisition fails. Captured service
25
+ * operations normalize their own driver failures to `SessionUnavailable`.
26
+ */
27
+ const coordinate = (database, configuration, make, owner) => Effect.gen(function* () {
28
+ if (yield* hasCommitScope) return yield* SessionUnavailable.make({});
29
+ yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;
30
+ return (yield* coordinateCommit(() => database.transaction((transaction) => Effect.gen(function* () {
31
+ return yield* owner(transaction, yield* make(transaction));
32
+ }).pipe(Effect.provideService(CurrentSessionSql, transaction))), { mode: configuration.mode })).value;
33
+ });
34
+ const coordinateTargetAuthenticationAuthority = (database, mapping, configuration, owner) => coordinate(database, configuration, (transaction) => Effect.map(makeSqlAuthenticationAuthority(transaction, mapping, options(configuration, true)), (authenticationAuthority) => ({ authenticationAuthority })), owner);
35
+ const coordinateTargetPendingAuthentication = (database, mapping, configuration, owner) => coordinate(database, configuration, (transaction) => Effect.map(makeSqlPendingAuthentication(transaction, mapping, options(configuration, true)), (pendingAuthentication) => ({ pendingAuthentication })), owner);
36
+ const coordinateTargetStatefulSessions = (database, mapping, configuration, owner) => coordinate(database, configuration, (transaction) => makeSqlStatefulSessions(transaction, mapping, options(configuration, true)), owner);
37
+ const coordinateTargetSignedSessionValidity = (database, mapping, configuration, owner) => coordinate(database, configuration, (transaction) => Effect.map(makeSqlSignedValidity(transaction, mapping, options(configuration, true)), (signedSessionValidity) => ({ signedSessionValidity })), owner);
38
+ const authenticationAuthorityLayer = (services) => Layer.effect(AuthenticationAuthority, Effect.map(services, (value) => value.authenticationAuthority));
39
+ const statefulSessionLayers = (module, services) => Layer.merge(Layer.effect(module.StatefulSessionPersistence, Effect.map(services, (value) => value.statefulSessionPersistence)), Layer.effect(module.SessionRepository, Effect.map(services, (value) => value.sessionRepository)));
40
+ const pendingAuthenticationLayer = (module, services) => Layer.effect(module.PendingAuthentication, Effect.map(services, (value) => value.pendingAuthentication));
41
+ const signedSessionValidityLayer = (module, services) => Layer.effect(module.SignedSessionValidity, Effect.map(services, (value) => value.signedSessionValidity));
42
+ const makeTargetSessionStepUpServices = (database, mapping, target, configuration) => Effect.map(makeSqlSessionStepUp(database, mapping, options(configuration)), (sessionStepUpPersistence) => ({ sessionStepUpPersistence: target.of(sessionStepUpPersistence) }));
43
+ const coordinateTargetSessionStepUp = (database, mapping, target, configuration, owner) => coordinate(database, configuration, (transaction) => Effect.map(makeSqlSessionStepUp(transaction, mapping, options(configuration, true)), (sessionStepUpPersistence) => ({ sessionStepUpPersistence: target.of(sessionStepUpPersistence) })), owner);
44
+ //#endregion
45
+ export { authenticationAuthorityLayer, coordinateTargetAuthenticationAuthority, coordinateTargetPendingAuthentication, coordinateTargetSessionStepUp, coordinateTargetSignedSessionValidity, coordinateTargetStatefulSessions, makeTargetAuthenticationAuthorityServices, makeTargetPendingAuthenticationServices, makeTargetSessionStepUpServices, makeTargetSignedSessionValidityServices, makeTargetStatefulSessionServices, pendingAuthenticationLayer, signedSessionValidityLayer, sqlClientSessionStandaloneGuard, statefulSessionLayers };
46
+
47
+ //# sourceMappingURL=session-target.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-target.mjs","names":[],"sources":["../../src/drizzle/session-target.ts"],"sourcesContent":["import {\n coordinateCommit,\n hasCommitScope,\n type LifecycleHooks,\n type HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\nimport {\n AuthenticationAuthority,\n SessionUnavailable,\n type PendingAuthentication,\n type SessionRepository,\n type SignedSessionValidity,\n type StatefulSessionPersistence,\n type SessionStepUpPersistence,\n} from \"@yielded/auth/Sessions\";\n/* oxlint-disable no-explicit-any -- target entrypoints restore each concrete Drizzle database/table type. */\nimport { type Context, Effect, Layer } from \"effect\";\nimport type * as SqlError from \"effect/unstable/sql/SqlError\";\n\nimport {\n makeSqlAuthenticationAuthority,\n makeSqlPendingAuthentication,\n makeSqlSignedValidity,\n makeSqlStatefulSessions,\n makeSqlSessionStepUp,\n CurrentSessionSql,\n type SessionSqlDatabase,\n type SessionSqlOptions,\n} from \"./session-sql\";\nimport { sqlClientStandaloneGuard } from \"./standalone-guard\";\n\nexport interface SessionTargetConfiguration {\n readonly mode: \"interactive\" | \"synchronous\";\n readonly locking: boolean;\n readonly standaloneGuard: Effect.Effect<void, SessionUnavailable>;\n readonly coordinatorGuard?: Effect.Effect<void, SessionUnavailable>;\n}\n\ninterface TransactionOwner<Transaction> {\n readonly transaction: <A, E, R>(\n body: (transaction: Transaction) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | SqlError.SqlError, R>;\n}\n\ntype CoordinatorError<E> = E | SessionUnavailable | HookConfigurationError | SqlError.SqlError;\n\nexport const sqlClientSessionStandaloneGuard = (\n database: unknown,\n): Effect.Effect<void, SessionUnavailable> =>\n sqlClientStandaloneGuard(database, () => SessionUnavailable.make({}));\n\nconst options = (\n configuration: SessionTargetConfiguration,\n transactionBound = false,\n): SessionSqlOptions => ({\n mode: configuration.mode,\n locking: configuration.locking,\n standaloneGuard: transactionBound ? Effect.void : configuration.standaloneGuard,\n});\n\nexport const makeTargetAuthenticationAuthorityServices = <Claims>(\n database: any,\n mapping: any,\n configuration: SessionTargetConfiguration,\n) =>\n Effect.map(\n makeSqlAuthenticationAuthority<Claims>(database, mapping, options(configuration)),\n (authenticationAuthority) => ({ authenticationAuthority }),\n );\n\nexport const makeTargetPendingAuthenticationServices = <Claims>(\n database: any,\n mapping: any,\n configuration: SessionTargetConfiguration,\n) =>\n Effect.map(\n makeSqlPendingAuthentication<Claims>(database, mapping, options(configuration)),\n (pendingAuthentication) => ({ pendingAuthentication }),\n );\n\nexport const makeTargetStatefulSessionServices = <Claims>(\n database: any,\n mapping: any,\n configuration: SessionTargetConfiguration,\n) => makeSqlStatefulSessions<Claims>(database, mapping, options(configuration));\n\nexport const makeTargetSignedSessionValidityServices = (\n database: any,\n mapping: any,\n configuration: SessionTargetConfiguration,\n) =>\n Effect.map(\n makeSqlSignedValidity(database, mapping, options(configuration)),\n (signedSessionValidity) => ({\n signedSessionValidity,\n }),\n );\n\n/**\n * The native transaction is the root commit owner. Interruption or owner\n * failure rolls it back and discards the child journal; this adapter performs\n * no hidden retry. A caller that can safely retry must rerun the complete owner\n * operation and prepare fresh bearer material. The low-level coordinator keeps\n * caller failures intact, including Drizzle query wrappers, and exposes a\n * native `SqlError` when transaction acquisition fails. Captured service\n * operations normalize their own driver failures to `SessionUnavailable`.\n */\nconst coordinate = <Transaction, Services, A, E, R>(\n database: TransactionOwner<Transaction>,\n configuration: SessionTargetConfiguration,\n make: (transaction: Transaction) => Effect.Effect<Services, never, LifecycleHooks>,\n owner: (transaction: Transaction, services: Services) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, CoordinatorError<E>, R | LifecycleHooks> =>\n Effect.gen(function* (): Effect.fn.Return<A, CoordinatorError<E>, R | LifecycleHooks> {\n if (yield* hasCommitScope) return yield* SessionUnavailable.make({});\n yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;\n\n const result = yield* coordinateCommit(\n () =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n const services = yield* make(transaction);\n\n return yield* owner(transaction, services);\n }).pipe(\n Effect.provideService(CurrentSessionSql, transaction as unknown as SessionSqlDatabase),\n ),\n ),\n { mode: configuration.mode },\n );\n\n return result.value;\n });\n\nexport const coordinateTargetAuthenticationAuthority = <Claims, Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly authenticationAuthority: AuthenticationAuthority[\"Service\"] },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinate(\n database,\n configuration,\n (transaction) =>\n Effect.map(\n makeSqlAuthenticationAuthority<Claims>(\n transaction as unknown as SessionSqlDatabase,\n mapping,\n options(configuration, true),\n ),\n (authenticationAuthority) => ({ authenticationAuthority }),\n ),\n owner,\n );\n\nexport const coordinateTargetPendingAuthentication = <Claims, Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly pendingAuthentication: PendingAuthentication<Claims> },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinate(\n database,\n configuration,\n (transaction) =>\n Effect.map(\n makeSqlPendingAuthentication<Claims>(\n transaction as unknown as SessionSqlDatabase,\n mapping,\n options(configuration, true),\n ),\n (pendingAuthentication) => ({ pendingAuthentication }),\n ),\n owner,\n );\n\nexport const coordinateTargetStatefulSessions = <Claims, Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: {\n readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;\n readonly sessionRepository: SessionRepository;\n },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinate(\n database,\n configuration,\n (transaction) =>\n makeSqlStatefulSessions<Claims>(\n transaction as unknown as SessionSqlDatabase,\n mapping,\n options(configuration, true),\n ),\n owner,\n );\n\nexport const coordinateTargetSignedSessionValidity = <Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly signedSessionValidity: SignedSessionValidity },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinate(\n database,\n configuration,\n (transaction) =>\n Effect.map(\n makeSqlSignedValidity(\n transaction as unknown as SessionSqlDatabase,\n mapping,\n options(configuration, true),\n ),\n (signedSessionValidity) => ({ signedSessionValidity }),\n ),\n owner,\n );\n\nexport const authenticationAuthorityLayer = (\n services: Effect.Effect<\n {\n readonly authenticationAuthority: AuthenticationAuthority[\"Service\"];\n },\n never,\n LifecycleHooks\n >,\n) =>\n Layer.effect(\n AuthenticationAuthority,\n Effect.map(services, (value) => value.authenticationAuthority),\n );\n\nexport const statefulSessionLayers = <Claims>(\n module: {\n readonly StatefulSessionPersistence: any;\n readonly SessionRepository: any;\n },\n services: Effect.Effect<\n {\n readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;\n readonly sessionRepository: SessionRepository;\n },\n never,\n LifecycleHooks\n >,\n) =>\n Layer.merge(\n Layer.effect(\n module.StatefulSessionPersistence,\n Effect.map(services, (value) => value.statefulSessionPersistence),\n ),\n Layer.effect(\n module.SessionRepository,\n Effect.map(services, (value) => value.sessionRepository),\n ),\n );\n\nexport const pendingAuthenticationLayer = <Claims>(\n module: { readonly PendingAuthentication: any },\n services: Effect.Effect<\n {\n readonly pendingAuthentication: PendingAuthentication<Claims>;\n },\n never,\n LifecycleHooks\n >,\n) =>\n Layer.effect(\n module.PendingAuthentication,\n Effect.map(services, (value) => value.pendingAuthentication),\n );\n\nexport const signedSessionValidityLayer = (\n module: { readonly SignedSessionValidity: any },\n services: Effect.Effect<\n {\n readonly signedSessionValidity: SignedSessionValidity;\n },\n never,\n LifecycleHooks\n >,\n) =>\n Layer.effect(\n module.SignedSessionValidity,\n Effect.map(services, (value) => value.signedSessionValidity),\n );\n\nexport const makeTargetSessionStepUpServices = <Claims, Id>(\n database: any,\n mapping: any,\n target: Context.Service<Id, SessionStepUpPersistence<Claims>>,\n configuration: SessionTargetConfiguration,\n) =>\n Effect.map(\n makeSqlSessionStepUp<Claims>(database, mapping, options(configuration)),\n (sessionStepUpPersistence) => ({\n sessionStepUpPersistence: target.of(sessionStepUpPersistence),\n }),\n );\n\nexport const coordinateTargetSessionStepUp = <Claims, Id, Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n target: Context.Service<Id, SessionStepUpPersistence<Claims>>,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly sessionStepUpPersistence: SessionStepUpPersistence<Claims> },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinate(\n database,\n configuration,\n (transaction) =>\n Effect.map(\n makeSqlSessionStepUp<Claims>(\n transaction as unknown as SessionSqlDatabase,\n mapping,\n options(configuration, true),\n ),\n (sessionStepUpPersistence) => ({\n sessionStepUpPersistence: target.of(sessionStepUpPersistence),\n }),\n ),\n owner,\n );\n"],"mappings":";;;;;;;AA8CA,MAAa,mCACX,aAEA,yBAAyB,gBAAgB,mBAAmB,KAAK,CAAC,CAAC,CAAC;AAEtE,MAAM,WACJ,eACA,mBAAmB,WACI;CACvB,MAAM,cAAc;CACpB,SAAS,cAAc;CACvB,iBAAiB,mBAAmB,OAAO,OAAO,cAAc;AAClE;AAEA,MAAa,6CACX,UACA,SACA,kBAEA,OAAO,IACL,+BAAuC,UAAU,SAAS,QAAQ,aAAa,CAAC,IAC/E,6BAA6B,EAAE,wBAAwB,EAC1D;AAEF,MAAa,2CACX,UACA,SACA,kBAEA,OAAO,IACL,6BAAqC,UAAU,SAAS,QAAQ,aAAa,CAAC,IAC7E,2BAA2B,EAAE,sBAAsB,EACtD;AAEF,MAAa,qCACX,UACA,SACA,kBACG,wBAAgC,UAAU,SAAS,QAAQ,aAAa,CAAC;AAE9E,MAAa,2CACX,UACA,SACA,kBAEA,OAAO,IACL,sBAAsB,UAAU,SAAS,QAAQ,aAAa,CAAC,IAC9D,2BAA2B,EAC1B,sBACF,EACF;;;;;;;;;;AAWF,MAAM,cACJ,UACA,eACA,MACA,UAEA,OAAO,IAAI,aAA2E;CACpF,IAAI,OAAO,gBAAgB,OAAO,OAAO,mBAAmB,KAAK,CAAC,CAAC;CACnE,OAAO,cAAc,oBAAoB,cAAc;CAgBvD,QAAO,OAde,uBAElB,SAAS,aAAa,gBACpB,OAAO,IAAI,aAAa;EAGtB,OAAO,OAAO,MAAM,aAAa,OAFT,KAAK,WAAW,CAEC;CAC3C,CAAC,CAAC,CAAC,KACD,OAAO,eAAe,mBAAmB,WAA4C,CACvF,CACF,GACF,EAAE,MAAM,cAAc,KAAK,CAC7B,EAAA,CAEc;AAChB,CAAC;AAEH,MAAa,2CACX,UACA,SACA,eACA,UAKA,WACE,UACA,gBACC,gBACC,OAAO,IACL,+BACE,aACA,SACA,QAAQ,eAAe,IAAI,CAC7B,IACC,6BAA6B,EAAE,wBAAwB,EAC1D,GACF,KACF;AAEF,MAAa,yCACX,UACA,SACA,eACA,UAKA,WACE,UACA,gBACC,gBACC,OAAO,IACL,6BACE,aACA,SACA,QAAQ,eAAe,IAAI,CAC7B,IACC,2BAA2B,EAAE,sBAAsB,EACtD,GACF,KACF;AAEF,MAAa,oCACX,UACA,SACA,eACA,UAQA,WACE,UACA,gBACC,gBACC,wBACE,aACA,SACA,QAAQ,eAAe,IAAI,CAC7B,GACF,KACF;AAEF,MAAa,yCACX,UACA,SACA,eACA,UAKA,WACE,UACA,gBACC,gBACC,OAAO,IACL,sBACE,aACA,SACA,QAAQ,eAAe,IAAI,CAC7B,IACC,2BAA2B,EAAE,sBAAsB,EACtD,GACF,KACF;AAEF,MAAa,gCACX,aAQA,MAAM,OACJ,yBACA,OAAO,IAAI,WAAW,UAAU,MAAM,uBAAuB,CAC/D;AAEF,MAAa,yBACX,QAIA,aASA,MAAM,MACJ,MAAM,OACJ,OAAO,4BACP,OAAO,IAAI,WAAW,UAAU,MAAM,0BAA0B,CAClE,GACA,MAAM,OACJ,OAAO,mBACP,OAAO,IAAI,WAAW,UAAU,MAAM,iBAAiB,CACzD,CACF;AAEF,MAAa,8BACX,QACA,aAQA,MAAM,OACJ,OAAO,uBACP,OAAO,IAAI,WAAW,UAAU,MAAM,qBAAqB,CAC7D;AAEF,MAAa,8BACX,QACA,aAQA,MAAM,OACJ,OAAO,uBACP,OAAO,IAAI,WAAW,UAAU,MAAM,qBAAqB,CAC7D;AAEF,MAAa,mCACX,UACA,SACA,QACA,kBAEA,OAAO,IACL,qBAA6B,UAAU,SAAS,QAAQ,aAAa,CAAC,IACrE,8BAA8B,EAC7B,0BAA0B,OAAO,GAAG,wBAAwB,EAC9D,EACF;AAEF,MAAa,iCACX,UACA,SACA,QACA,eACA,UAKA,WACE,UACA,gBACC,gBACC,OAAO,IACL,qBACE,aACA,SACA,QAAQ,eAAe,IAAI,CAC7B,IACC,8BAA8B,EAC7B,0BAA0B,OAAO,GAAG,wBAAwB,EAC9D,EACF,GACF,KACF"}
@@ -0,0 +1,45 @@
1
+ import { coordinateTargetEmailAddress, coordinateTargetEmailRegistration, makeTargetEmailAddressServices, makeTargetEmailRegistrationServices, makeTargetEmailSignInServices } from "./email-target.mjs";
2
+ import { Context, Effect } from "effect";
3
+ import { EmailAddressPersistence } from "@yielded/auth/Email";
4
+ //#region src/drizzle/sqlite-emails.ts
5
+ const sqliteEmailConfiguration = (mode, standaloneGuard, proofStandaloneGuard, coordinatorGuard) => ({
6
+ mode,
7
+ locking: false,
8
+ standaloneGuard,
9
+ ...coordinatorGuard === void 0 ? {} : { coordinatorGuard },
10
+ generatedSubjectRows: (query) => query.returning(),
11
+ proof: {
12
+ mode,
13
+ locking: false,
14
+ standaloneGuard: proofStandaloneGuard,
15
+ insertIfAbsent: (query) => query.onConflictDoNothing()
16
+ }
17
+ });
18
+ const makeSqliteEmailTarget = (configuration) => {
19
+ const configurationFor = (database) => typeof configuration === "function" ? configuration(database) : configuration;
20
+ function coordinateEmailAddress(acquire, options, body) {
21
+ return Effect.flatMap(acquire, (database) => coordinateTargetEmailAddress(database, options.mapping, options.proofMapping, configurationFor(database), (transaction, services) => {
22
+ const provided = Context.make(EmailAddressPersistence, services.emailAddressPersistence);
23
+ const work = Effect.provideContext(body, provided);
24
+ return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
25
+ }));
26
+ }
27
+ function coordinateEmailRegistration(acquire, options, body) {
28
+ return Effect.flatMap(acquire, (database) => coordinateTargetEmailRegistration(database, options.mapping, options.proofMapping, configurationFor(database), (transaction, services) => {
29
+ const provided = Context.make(options.target, services.registrationAuthority);
30
+ const work = Effect.provideContext(body, provided);
31
+ return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
32
+ }));
33
+ }
34
+ return {
35
+ makeEmailSignInServices: (database, mapping) => makeTargetEmailSignInServices(database, mapping, configurationFor(database)),
36
+ makeEmailAddressServices: (database, mapping, proofMapping) => makeTargetEmailAddressServices(database, mapping, proofMapping, configurationFor(database)),
37
+ coordinateEmailAddress,
38
+ makeEmailRegistrationServices: (database, mapping, proofMapping) => makeTargetEmailRegistrationServices(database, mapping, proofMapping, configurationFor(database)),
39
+ coordinateEmailRegistration
40
+ };
41
+ };
42
+ //#endregion
43
+ export { makeSqliteEmailTarget, sqliteEmailConfiguration };
44
+
45
+ //# sourceMappingURL=sqlite-emails.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-emails.mjs","names":[],"sources":["../../src/drizzle/sqlite-emails.ts"],"sourcesContent":["import { EmailAddressPersistence, type EmailUnavailable } from \"@yielded/auth/Email\";\nimport type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\n/* oxlint-disable no-explicit-any -- proof mapping tables are independently typed by the proof owner; this driver forwards them unchanged to the shared target. */\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectLibsqlDatabase } from \"drizzle-orm/effect-libsql\";\nimport type { EffectSQLiteBunDatabase } from \"drizzle-orm/effect-sqlite-bun\";\nimport type { EffectSQLiteDoDatabase as DODatabase } from \"drizzle-orm/effect-sqlite-do\";\nimport type { EffectSQLiteNodeDatabase as NodeDatabase } from \"drizzle-orm/effect-sqlite-node\";\nimport type { EffectSQLiteWasmDatabase as WasmDatabase } from \"drizzle-orm/effect-sqlite-wasm\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/unstable/sql/SqlError\";\n\nimport type {\n EmailAddressMapping,\n EmailRegistrationMapping,\n EmailSignInMapping,\n} from \"./email-model\";\nimport type { EmailRegistrationAuthority } from \"./email-registration\";\nimport type { EmailSqlQuery } from \"./email-sql\";\nimport {\n coordinateTargetEmailAddress,\n coordinateTargetEmailRegistration,\n makeTargetEmailAddressServices,\n makeTargetEmailRegistrationServices,\n makeTargetEmailSignInServices,\n type EmailTargetConfiguration,\n} from \"./email-target\";\nimport type { ProofPersistenceMapping } from \"./proof-model\";\nimport type { ProofSqlQuery } from \"./proof-sql\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\nexport type SqliteEmailDatabase =\n | NodeDatabase<AnyRelations>\n | EffectSQLiteBunDatabase<AnyRelations>\n | EffectLibsqlDatabase<AnyRelations>\n | WasmDatabase<AnyRelations>\n | DODatabase<AnyRelations>;\n\ntype TransactionOf<D extends SqliteEmailDatabase> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\ntype ProofMapping = ProofPersistenceMapping<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>;\n\nexport const sqliteEmailConfiguration = (\n mode: \"interactive\" | \"synchronous\",\n standaloneGuard: EmailTargetConfiguration[\"standaloneGuard\"],\n proofStandaloneGuard: EmailTargetConfiguration[\"proof\"][\"standaloneGuard\"],\n coordinatorGuard?: EmailTargetConfiguration[\"coordinatorGuard\"],\n): EmailTargetConfiguration => ({\n mode,\n locking: false,\n standaloneGuard,\n ...(coordinatorGuard === undefined ? {} : { coordinatorGuard }),\n generatedSubjectRows: (query: EmailSqlQuery) => query.returning(),\n proof: {\n mode,\n locking: false,\n standaloneGuard: proofStandaloneGuard,\n insertIfAbsent: (query: ProofSqlQuery) => query.onConflictDoNothing(),\n },\n});\n\nexport const makeSqliteEmailTarget = <\n D extends SqliteEmailDatabase,\n Synchronous extends boolean = false,\n>(\n configuration: EmailTargetConfiguration | ((database: D) => EmailTargetConfiguration),\n) => {\n const configurationFor = (database: D) =>\n typeof configuration === \"function\" ? configuration(database) : configuration;\n\n function coordinateEmailAddress<\n Database extends D,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n M extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, Synchronous extends true ? NoInfer<EmailAddressPersistence> : R>,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, EmailAddressPersistence>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateEmailAddress<\n Database extends D,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n M extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<\n Out,\n E,\n Synchronous extends true ? NoInfer<EmailAddressPersistence | TxId> : R\n >,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, EmailAddressPersistence | TxId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateEmailAddress<\n Database extends D,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n M extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, EmailAddressPersistence> | LifecycleHooks | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetEmailAddress<\n TransactionOf<Database>,\n Out,\n E,\n Exclude<R, EmailAddressPersistence>\n >(\n database,\n options.mapping,\n options.proofMapping,\n configurationFor(database),\n (\n transaction: TransactionOf<Database>,\n services: { readonly emailAddressPersistence: EmailAddressPersistence[\"Service\"] },\n ) => {\n const provided = Context.make(EmailAddressPersistence, services.emailAddressPersistence);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n }\n function coordinateEmailRegistration<\n Database extends D,\n TargetId,\n Registration,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n Rq extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, Synchronous extends true ? NoInfer<TargetId> : R>,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, TargetId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateEmailRegistration<\n Database extends D,\n TargetId,\n Registration,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n Rq extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<Out, E, Synchronous extends true ? NoInfer<TargetId | TxId> : R>,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, TargetId | TxId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateEmailRegistration<\n Database extends D,\n TargetId,\n Registration,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n Rq extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetEmailRegistration<\n Registration,\n TransactionOf<Database>,\n Out,\n E,\n Exclude<R, TargetId>\n >(\n database,\n options.mapping,\n options.proofMapping,\n configurationFor(database),\n (\n transaction: TransactionOf<Database>,\n services: { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },\n ) => {\n const provided = Context.make(options.target, services.registrationAuthority);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n }\n\n return {\n makeEmailSignInServices: <\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n NativeId,\n >(\n database: D,\n mapping: EmailSignInMapping<S, I, C, NativeId>,\n ) => makeTargetEmailSignInServices(database, mapping, configurationFor(database)),\n makeEmailAddressServices: <\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n M extends AnySQLiteTable,\n NativeId,\n >(\n database: D,\n mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>,\n proofMapping: ProofMapping,\n ) =>\n makeTargetEmailAddressServices(database, mapping, proofMapping, configurationFor(database)),\n coordinateEmailAddress,\n makeEmailRegistrationServices: <\n Registration,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n Rq extends AnySQLiteTable,\n NativeId,\n >(\n database: D,\n mapping: EmailRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,\n proofMapping: ProofMapping,\n ) =>\n makeTargetEmailRegistrationServices<Registration>(\n database,\n mapping,\n proofMapping,\n configurationFor(database),\n ),\n coordinateEmailRegistration,\n };\n};\n"],"mappings":";;;;AAuDA,MAAa,4BACX,MACA,iBACA,sBACA,sBAC8B;CAC9B;CACA,SAAS;CACT;CACA,GAAI,qBAAqB,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB;CAC7D,uBAAuB,UAAyB,MAAM,UAAU;CAChE,OAAO;EACL;EACA,SAAS;EACT,iBAAiB;EACjB,iBAAiB,UAAyB,MAAM,oBAAoB;CACtE;AACF;AAEA,MAAa,yBAIX,kBACG;CACH,MAAM,oBAAoB,aACxB,OAAO,kBAAkB,aAAa,cAAc,QAAQ,IAAI;CAgElE,SAAS,uBAgBP,SACA,SAKA,MAKA;EACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,6BAME,UACA,QAAQ,SACR,QAAQ,cACR,iBAAiB,QAAQ,IAEvB,aACA,aACG;GACH,MAAM,WAAW,QAAQ,KAAK,yBAAyB,SAAS,uBAAuB;GACvF,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;GAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;EAC1F,CACF,CACF;CACF;CAiEA,SAAS,4BAkBP,SACA,SAMA,MAKA;EACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,kCAOE,UACA,QAAQ,SACR,QAAQ,cACR,iBAAiB,QAAQ,IAEvB,aACA,aACG;GACH,MAAM,WAAW,QAAQ,KAAK,QAAQ,QAAQ,SAAS,qBAAqB;GAC5E,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;GAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;EAC1F,CACF,CACF;CACF;CAEA,OAAO;EACL,0BAME,UACA,YACG,8BAA8B,UAAU,SAAS,iBAAiB,QAAQ,CAAC;EAChF,2BAQE,UACA,SACA,iBAEA,+BAA+B,UAAU,SAAS,cAAc,iBAAiB,QAAQ,CAAC;EAC5F;EACA,gCASE,UACA,SACA,iBAEA,oCACE,UACA,SACA,cACA,iBAAiB,QAAQ,CAC3B;EACF;CACF;AACF"}
@@ -0,0 +1,91 @@
1
+ import { PersistenceMappingError, isMappedConstraintConflict } from "../internal/mapping-error.mjs";
2
+ import { column, provisioningFingerprint } from "./model.mjs";
3
+ import { Cause, Effect, Schema } from "effect";
4
+ import { reportPersistenceFailure } from "@yielded/auth/Persistence";
5
+ import { ExternalIdentityMutation, IdentityConflict, IdentityUnavailable, SubjectProvisioned, SubjectProvisioner } from "@yielded/auth/Identity";
6
+ import { and, eq } from "drizzle-orm";
7
+ //#region src/drizzle/sqlite-identity.ts
8
+ const unavailable = () => IdentityUnavailable.make();
9
+ const isIdentityFailure = Schema.is(Schema.Union([IdentityConflict, IdentityUnavailable]));
10
+ const mapUnavailable = (effect) => reportPersistenceFailure(effect, isIdentityFailure).pipe(Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, (error) => isIdentityFailure(error) ? error : unavailable()))));
11
+ const makeSqliteSubjectProvisioningServices = (database, mapping, mode) => {
12
+ const db = database;
13
+ const requestTable = mapping.provisioningRequest.table;
14
+ const requestIdColumn = column(requestTable, mapping.provisioningRequest.requestId);
15
+ const requestFingerprintColumn = column(requestTable, mapping.provisioningRequest.fingerprint);
16
+ const requestSubjectColumn = column(requestTable, mapping.provisioningRequest.subjectId);
17
+ const identifierTable = mapping.identifier.table;
18
+ const identifierNamespaceColumn = column(identifierTable, mapping.identifier.namespace);
19
+ const identifierValueColumn = column(identifierTable, mapping.identifier.value);
20
+ const subjectIdColumn = column(mapping.subject.table, mapping.subject.id);
21
+ const findReceipt = Effect.fn("DrizzleSqliteIdentity.findReceipt")(function* (requestId) {
22
+ return (yield* db.select({
23
+ fingerprint: requestFingerprintColumn,
24
+ subjectId: requestSubjectColumn
25
+ }).from(requestTable).where(eq(requestIdColumn, requestId)).limit(1))[0];
26
+ });
27
+ const provision = Effect.fn("DrizzleSqliteIdentity.provision")(function* (input) {
28
+ if (mode === "synchronous" && mapping.subject.allocateId !== void 0 && mapping.subject.allocateIdSync === void 0) return yield* unavailable();
29
+ const fingerprint = provisioningFingerprint(input);
30
+ const existing = yield* findReceipt(input.requestId);
31
+ if (existing !== void 0) {
32
+ if (existing.fingerprint !== fingerprint) return yield* IdentityConflict.make();
33
+ const subjectId = yield* mapping.subjectId.toSubject(existing.subjectId);
34
+ return SubjectProvisioned.make({ subjectId });
35
+ }
36
+ const nativeId = yield* db.transaction((tx) => Effect.gen(function* () {
37
+ const allocated = mode === "synchronous" ? mapping.subject.allocateIdSync?.() : mapping.subject.allocateId === void 0 ? mapping.subject.allocateIdSync?.() : yield* mapping.subject.allocateId;
38
+ const nativeId = (yield* tx.insert(mapping.subject.table).values(mapping.subject.encodeInsert(input, allocated)).returning({ id: subjectIdColumn }))[0]?.id ?? allocated;
39
+ if (nativeId === void 0) return yield* PersistenceMappingError.make({
40
+ operation: "provisionSubject.generatedId",
41
+ cause: /* @__PURE__ */ new Error("subject insert did not return its native id")
42
+ });
43
+ if (input.identifier !== void 0) yield* tx.insert(identifierTable).values(mapping.identifier.encodeInsert(input.identifier, nativeId, input.verifiedAt));
44
+ yield* tx.insert(requestTable).values(mapping.provisioningRequest.encodeInsert(input.requestId, fingerprint, nativeId));
45
+ return nativeId;
46
+ })).pipe(Effect.catchCause((cause) => {
47
+ if (cause.reasons.length === 0 || !cause.reasons.every((reason) => Cause.isFailReason(reason) && isMappedConstraintConflict(mapping.isConstraintConflict, reason.error))) return Effect.failCause(cause);
48
+ return findReceipt(input.requestId).pipe(Effect.flatMap((receipt) => {
49
+ if (receipt !== void 0 && receipt.fingerprint === fingerprint) return Effect.succeed(receipt.subjectId);
50
+ if (input.identifier === void 0) return IdentityConflict.make();
51
+ return db.select({ subjectId: column(identifierTable, mapping.identifier.subjectId) }).from(identifierTable).where(and(eq(identifierNamespaceColumn, input.identifier.namespace), eq(identifierValueColumn, input.identifier.value))).limit(1).pipe(Effect.flatMap(() => IdentityConflict.make()));
52
+ }));
53
+ }));
54
+ const subjectId = yield* mapping.subjectId.toSubject(nativeId);
55
+ return SubjectProvisioned.make({ subjectId });
56
+ }, mapUnavailable);
57
+ return { subjectProvisioner: SubjectProvisioner.of({ provision }) };
58
+ };
59
+ const makeSqliteExternalIdentityServices = (database, mapping) => {
60
+ const db = database;
61
+ const externalTable = mapping.externalIdentity.table;
62
+ const externalProviderColumn = column(externalTable, mapping.externalIdentity.provider);
63
+ const externalIssuerColumn = column(externalTable, mapping.externalIdentity.issuer);
64
+ const externalSubjectColumn = column(externalTable, mapping.externalIdentity.subject);
65
+ const externalSubjectIdColumn = column(externalTable, mapping.externalIdentity.subjectId);
66
+ const subjectIdColumn = column(mapping.subject.table, mapping.subject.id);
67
+ const subjectStatusColumn = column(mapping.subject.table, mapping.subject.status);
68
+ const bind = Effect.fn("DrizzleSqliteIdentity.bindExternalIdentity")(function* (subjectId, identity) {
69
+ const nativeId = yield* mapping.subjectId.toNative(subjectId);
70
+ if ((yield* db.transaction((tx) => Effect.gen(function* () {
71
+ const subjects = yield* tx.select({ status: subjectStatusColumn }).from(mapping.subject.table).where(eq(subjectIdColumn, nativeId)).limit(1);
72
+ if (subjects[0] === void 0 || !mapping.subject.isActiveStatus(subjects[0].status)) return { _tag: "conflict" };
73
+ const links = yield* tx.select({ subjectId: externalSubjectIdColumn }).from(externalTable).where(and(eq(externalProviderColumn, identity.provider), eq(externalIssuerColumn, identity.issuer), eq(externalSubjectColumn, identity.subject))).limit(1);
74
+ if (links[0] !== void 0) return mapping.subjectId.equals(links[0].subjectId, nativeId) ? { _tag: "bound" } : { _tag: "conflict" };
75
+ yield* tx.insert(externalTable).values(mapping.externalIdentity.encodeInsert(identity, nativeId));
76
+ return { _tag: "bound" };
77
+ })).pipe(Effect.catchCause((cause) => {
78
+ if (cause.reasons.length === 0 || !cause.reasons.every((reason) => Cause.isFailReason(reason) && isMappedConstraintConflict(mapping.isConstraintConflict, reason.error))) return Effect.failCause(cause);
79
+ return db.select({ subjectId: externalSubjectIdColumn }).from(externalTable).where(and(eq(externalProviderColumn, identity.provider), eq(externalIssuerColumn, identity.issuer), eq(externalSubjectColumn, identity.subject))).limit(1).pipe(Effect.map((rows) => rows[0] !== void 0 && mapping.subjectId.equals(rows[0].subjectId, nativeId) ? { _tag: "bound" } : { _tag: "conflict" }));
80
+ })))._tag === "conflict") return yield* IdentityConflict.make();
81
+ }, mapUnavailable);
82
+ return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) };
83
+ };
84
+ const makeSqliteIdentityServices = (database, mapping, mode) => ({
85
+ ...makeSqliteSubjectProvisioningServices(database, mapping, mode),
86
+ ...makeSqliteExternalIdentityServices(database, mapping)
87
+ });
88
+ //#endregion
89
+ export { makeSqliteExternalIdentityServices, makeSqliteIdentityServices, makeSqliteSubjectProvisioningServices };
90
+
91
+ //# sourceMappingURL=sqlite-identity.mjs.map