@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,290 @@
1
+ import { PersistenceMappingError, isMappedConstraintConflict } from "../internal/mapping-error.mjs";
2
+ import { column, provisioningFingerprint, requireStandaloneConsume, updateValues } from "./model.mjs";
3
+ import { Cause, Context, DateTime, Duration, Effect, Schema } from "effect";
4
+ import { AuthStoreDecisions, reportPersistenceFailure } from "@yielded/auth/Persistence";
5
+ import { VerifiedEmail } from "@yielded/auth/Schema";
6
+ import { ExternalIdentityMutation, IdentityConflict, IdentityUnavailable, SubjectProvisioned, SubjectProvisioner } from "@yielded/auth/Identity";
7
+ import { AuthStore, EmailOtpRejected } from "@yielded/auth/AuthStore";
8
+ import { AuthRateLimited, AuthStoreError, InvalidRegistration } from "@yielded/auth/Errors";
9
+ import { InvalidOAuthState, OAuthStateDecisions, OAuthStateStore } from "@yielded/auth/OAuth";
10
+ import { and, eq, gt, lt, lte, ne, or, sql } from "drizzle-orm";
11
+ import "drizzle-orm/pg-core";
12
+ //#region src/drizzle/pg.ts
13
+ const storeReadError = () => AuthStoreError.make({ message: "Auth store read failed" });
14
+ const storeWriteError = () => AuthStoreError.make({ message: "Auth store write failed" });
15
+ const isStoreFailure = Schema.is(AuthStoreError);
16
+ const mapStoreFailure = (failure) => (effect) => reportPersistenceFailure(effect, isStoreFailure).pipe(Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, failure))));
17
+ const mapStoreReadFailure = mapStoreFailure(storeReadError);
18
+ const mapStoreWriteFailure = mapStoreFailure(storeWriteError);
19
+ const identityUnavailable = () => IdentityUnavailable.make();
20
+ const isIdentityFailure = Schema.is(Schema.Union([IdentityConflict, IdentityUnavailable]));
21
+ const mapIdentityFailure = (effect) => reportPersistenceFailure(effect, isIdentityFailure).pipe(Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, (error) => isIdentityFailure(error) ? error : identityUnavailable()))));
22
+ const selected = (row) => row;
23
+ const makePgAuthStoreServices = (database, mapping) => {
24
+ const db = database;
25
+ const challengeTable = mapping.challenge.table;
26
+ const challengeColumns = mapping.challenge.columns;
27
+ const pgChallenge = {
28
+ challengeId: column(challengeTable, challengeColumns.challengeId),
29
+ tokenDigest: column(challengeTable, challengeColumns.tokenDigest),
30
+ namespace: column(challengeTable, challengeColumns.namespace),
31
+ value: column(challengeTable, challengeColumns.value),
32
+ purpose: column(challengeTable, challengeColumns.purpose),
33
+ otpKeyId: column(challengeTable, challengeColumns.otpKeyId),
34
+ otpDigest: column(challengeTable, challengeColumns.otpDigest),
35
+ issuedAt: column(challengeTable, challengeColumns.issuedAt),
36
+ expiresAt: column(challengeTable, challengeColumns.expiresAt),
37
+ attemptLimit: column(challengeTable, challengeColumns.attemptLimit),
38
+ failedAttempts: column(challengeTable, challengeColumns.failedAttempts),
39
+ consumed: column(challengeTable, challengeColumns.consumed)
40
+ };
41
+ const registrationTable = mapping.registration.table;
42
+ const registrationColumns = mapping.registration.columns;
43
+ const registration = {
44
+ tokenDigest: column(registrationTable, registrationColumns.tokenDigest),
45
+ expiresAt: column(registrationTable, registrationColumns.expiresAt),
46
+ consumed: column(registrationTable, registrationColumns.consumed)
47
+ };
48
+ const issueChallenge = Effect.fn("DrizzlePgAuthStore.issueChallenge")(function* (input) {
49
+ const now = yield* DateTime.now;
50
+ const cooldownCutoff = DateTime.mapEpochMillis(now, (millis) => millis - Duration.toMillis(input.resendCooldown));
51
+ if ((yield* Effect.suspend(() => {
52
+ const values = mapping.challenge.encodeInsert(input, {
53
+ namespace: mapping.challenge.identifierNamespace,
54
+ failedAttempts: 0,
55
+ consumed: false
56
+ });
57
+ const nativeNow = mapping.challenge.encodeInstant(now);
58
+ const nativeCutoff = mapping.challenge.encodeInstant(cooldownCutoff);
59
+ const nativeIssuedAt = mapping.challenge.encodeInstant(input.issuedAt);
60
+ const preservedAttempts = sql`case when ${gt(pgChallenge.expiresAt, nativeNow)} then ${pgChallenge.failedAttempts} else 0 end`;
61
+ const update = mapping.challenge.encodeUpdate(input, {
62
+ namespace: mapping.challenge.identifierNamespace,
63
+ failedAttempts: preservedAttempts,
64
+ consumed: false
65
+ });
66
+ return db.insert(challengeTable).values(values).onConflictDoUpdate({
67
+ target: [
68
+ pgChallenge.namespace,
69
+ pgChallenge.value,
70
+ pgChallenge.purpose
71
+ ],
72
+ set: update,
73
+ setWhere: and(ne(pgChallenge.challengeId, input.challengeId), lt(pgChallenge.issuedAt, nativeIssuedAt), or(eq(pgChallenge.consumed, true), lte(pgChallenge.issuedAt, nativeCutoff)))
74
+ }).returning();
75
+ }).pipe(mapStoreWriteFailure)).length > 0) return;
76
+ const existing = yield* Effect.suspend(() => db.select().from(challengeTable).where(and(eq(pgChallenge.namespace, mapping.challenge.identifierNamespace), eq(pgChallenge.value, input.email), eq(pgChallenge.purpose, input.purpose))).limit(1)).pipe(mapStoreReadFailure);
77
+ const decoded = existing[0] === void 0 ? void 0 : yield* Effect.suspend(() => mapping.challenge.decode(selected(existing[0]))).pipe(mapStoreReadFailure);
78
+ const retryAfterSeconds = decoded === void 0 ? Math.max(1, Math.ceil(Duration.toMillis(input.resendCooldown) / 1e3)) : Math.max(1, Math.ceil((DateTime.toEpochMillis(decoded.challenge.issuedAt) + Duration.toMillis(input.resendCooldown) - DateTime.toEpochMillis(now)) / 1e3));
79
+ return yield* AuthRateLimited.make({ retryAfterSeconds });
80
+ });
81
+ const consumeChallengeDecision = Effect.fn("DrizzlePgAuthStore.consumeChallengeDecision")(function* (input) {
82
+ const now = yield* DateTime.now;
83
+ const alternatives = Object.entries(input.otpDigests).map(([keyId, digest]) => and(eq(pgChallenge.otpKeyId, keyId), eq(pgChallenge.otpDigest, digest)));
84
+ const matches = alternatives.length === 0 ? sql`false` : or(...alternatives);
85
+ const rows = yield* Effect.suspend(() => db.update(challengeTable).set(updateValues([[challengeColumns.consumed, sql`case when ${matches} then true else ${pgChallenge.consumed} end`], [challengeColumns.failedAttempts, sql`${pgChallenge.failedAttempts} + case when ${matches} then 0 else 1 end`]])).where(and(eq(pgChallenge.tokenDigest, input.tokenDigest), eq(pgChallenge.consumed, false), gt(pgChallenge.expiresAt, mapping.challenge.encodeInstant(now)), sql`${pgChallenge.failedAttempts} < ${pgChallenge.attemptLimit}`)).returning()).pipe(mapStoreWriteFailure);
86
+ if (rows[0] === void 0) return {
87
+ _tag: "rejected",
88
+ reason: "missing_challenge"
89
+ };
90
+ const decoded = yield* Effect.suspend(() => mapping.challenge.decode(selected(rows[0]))).pipe(mapStoreReadFailure);
91
+ if (!decoded.consumed) return {
92
+ _tag: "rejected",
93
+ reason: "bad_code"
94
+ };
95
+ return {
96
+ _tag: "accepted",
97
+ value: VerifiedEmail.make({
98
+ email: decoded.challenge.email,
99
+ purpose: decoded.challenge.purpose
100
+ })
101
+ };
102
+ });
103
+ const consumeChallenge = Effect.fn("DrizzlePgAuthStore.consumeChallenge")(function* (input) {
104
+ yield* requireStandaloneConsume(db);
105
+ const decision = yield* consumeChallengeDecision(input);
106
+ return decision._tag === "accepted" ? decision.value : yield* EmailOtpRejected.make({ reason: decision.reason });
107
+ });
108
+ const issueRegistration = Effect.fn("DrizzlePgAuthStore.issueRegistration")(function* (input) {
109
+ yield* Effect.suspend(() => db.insert(registrationTable).values(mapping.registration.encodeInsert(input, false))).pipe(mapStoreWriteFailure);
110
+ });
111
+ const inspectRegistration = Effect.fn("DrizzlePgAuthStore.inspectRegistration")(function* (tokenDigest) {
112
+ const now = yield* DateTime.now;
113
+ const rows = yield* Effect.suspend(() => db.select().from(registrationTable).where(and(eq(registration.tokenDigest, tokenDigest), eq(registration.consumed, false), gt(registration.expiresAt, mapping.registration.encodeInstant(now)))).limit(1)).pipe(mapStoreReadFailure);
114
+ if (rows[0] === void 0) return yield* InvalidRegistration.make();
115
+ return (yield* Effect.suspend(() => mapping.registration.decode(selected(rows[0]))).pipe(mapStoreReadFailure)).registration;
116
+ });
117
+ const consumeRegistrationDecision = Effect.fn("DrizzlePgAuthStore.consumeRegistrationDecision")(function* (input) {
118
+ const now = yield* DateTime.now;
119
+ return (yield* Effect.suspend(() => db.update(registrationTable).set(updateValues([[registrationColumns.consumed, true]])).where(and(eq(registration.tokenDigest, input.tokenDigest), eq(registration.consumed, false), gt(registration.expiresAt, mapping.registration.encodeInstant(now)))).returning({ consumed: registration.consumed })).pipe(mapStoreWriteFailure)).length === 0 ? { _tag: "rejected" } : {
120
+ _tag: "accepted",
121
+ value: void 0
122
+ };
123
+ });
124
+ const consumeRegistration = Effect.fn("DrizzlePgAuthStore.consumeRegistration")(function* (input) {
125
+ yield* requireStandaloneConsume(db);
126
+ if ((yield* consumeRegistrationDecision(input))._tag === "rejected") return yield* InvalidRegistration.make();
127
+ });
128
+ return {
129
+ authStore: AuthStore.of({
130
+ issueChallenge,
131
+ consumeChallenge,
132
+ issueRegistration,
133
+ inspectRegistration,
134
+ consumeRegistration
135
+ }),
136
+ decisions: {
137
+ consumeChallenge: consumeChallengeDecision,
138
+ consumeRegistration: consumeRegistrationDecision
139
+ }
140
+ };
141
+ };
142
+ const makePgOAuthStateServices = (database, mapping) => {
143
+ const db = database;
144
+ const stateTable = mapping.oauthState.table;
145
+ const stateColumns = mapping.oauthState.columns;
146
+ const state = {
147
+ stateDigest: column(stateTable, stateColumns.stateDigest),
148
+ expiresAt: column(stateTable, stateColumns.expiresAt),
149
+ consumed: column(stateTable, stateColumns.consumed)
150
+ };
151
+ const issue = Effect.fn("DrizzlePgOAuthStateStore.issue")(function* (input) {
152
+ yield* Effect.suspend(() => db.insert(stateTable).values(mapping.oauthState.encodeInsert(input, false))).pipe(mapStoreWriteFailure);
153
+ });
154
+ const consumeDecision = Effect.fn("DrizzlePgOAuthStateStore.consumeDecision")(function* (digest) {
155
+ const now = yield* DateTime.now;
156
+ const rows = yield* Effect.suspend(() => db.update(stateTable).set(updateValues([[stateColumns.consumed, true]])).where(and(eq(state.stateDigest, digest), eq(state.consumed, false), gt(state.expiresAt, mapping.oauthState.encodeInstant(now)))).returning()).pipe(mapStoreWriteFailure);
157
+ if (rows[0] === void 0) return { _tag: "rejected" };
158
+ return {
159
+ _tag: "accepted",
160
+ value: (yield* Effect.suspend(() => mapping.oauthState.decode(selected(rows[0]))).pipe(mapStoreReadFailure)).state
161
+ };
162
+ });
163
+ const consume = Effect.fn("DrizzlePgOAuthStateStore.consume")(function* (digest) {
164
+ yield* requireStandaloneConsume(db);
165
+ const decision = yield* consumeDecision(digest);
166
+ return decision._tag === "accepted" ? decision.value : yield* InvalidOAuthState.make();
167
+ });
168
+ return {
169
+ oauthStateStore: OAuthStateStore.of({
170
+ issue,
171
+ consume
172
+ }),
173
+ decisions: { consumeOAuthState: consumeDecision }
174
+ };
175
+ };
176
+ const makePgAuthServices = (database, mapping) => {
177
+ const auth = makePgAuthStoreServices(database, mapping);
178
+ const oauth = makePgOAuthStateServices(database, mapping);
179
+ return {
180
+ ...auth,
181
+ ...oauth,
182
+ decisions: {
183
+ ...auth.decisions,
184
+ ...oauth.decisions
185
+ }
186
+ };
187
+ };
188
+ function coordinatePgAuthStoreTransaction(acquire, options, body) {
189
+ return Effect.flatMap(acquire, (database) => database.transaction((transaction) => {
190
+ const decisions = makePgAuthStoreServices(transaction, options.mapping).decisions;
191
+ const provided = Context.make(AuthStoreDecisions, decisions);
192
+ const work = Effect.provideContext(body, provided);
193
+ return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
194
+ }));
195
+ }
196
+ function coordinatePgOAuthStateTransaction(acquire, options, body) {
197
+ return Effect.flatMap(acquire, (database) => database.transaction((transaction) => {
198
+ const decisions = makePgOAuthStateServices(transaction, options.mapping).decisions;
199
+ const provided = Context.make(OAuthStateDecisions, decisions);
200
+ const work = Effect.provideContext(body, provided);
201
+ return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
202
+ }));
203
+ }
204
+ function coordinatePgAuthTransaction(acquire, options, body) {
205
+ return Effect.flatMap(acquire, (database) => database.transaction((transaction) => {
206
+ const decisions = makePgAuthServices(transaction, options.mapping).decisions;
207
+ const provided = Context.make(AuthStoreDecisions, decisions).pipe(Context.add(OAuthStateDecisions, decisions));
208
+ const work = Effect.provideContext(body, provided);
209
+ return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
210
+ }));
211
+ }
212
+ const makePgSubjectProvisioningServices = (database, mapping) => {
213
+ const db = database;
214
+ const requestTable = mapping.provisioningRequest.table;
215
+ const requestIdColumn = column(requestTable, mapping.provisioningRequest.requestId);
216
+ const requestFingerprintColumn = column(requestTable, mapping.provisioningRequest.fingerprint);
217
+ const requestSubjectColumn = column(requestTable, mapping.provisioningRequest.subjectId);
218
+ const identifierTable = mapping.identifier.table;
219
+ const identifierNamespaceColumn = column(identifierTable, mapping.identifier.namespace);
220
+ const identifierValueColumn = column(identifierTable, mapping.identifier.value);
221
+ const findReceipt = Effect.fn("DrizzlePgIdentity.findReceipt")(function* (requestId) {
222
+ return (yield* db.select({
223
+ fingerprint: requestFingerprintColumn,
224
+ subjectId: requestSubjectColumn
225
+ }).from(requestTable).where(eq(requestIdColumn, requestId)).limit(1))[0];
226
+ });
227
+ const provision = Effect.fn("DrizzlePgIdentity.provision")(function* (input) {
228
+ const fingerprint = provisioningFingerprint(input);
229
+ const existing = yield* findReceipt(input.requestId);
230
+ if (existing !== void 0) {
231
+ if (existing.fingerprint !== fingerprint) return yield* IdentityConflict.make();
232
+ const id = yield* mapping.subjectId.toSubject(existing.subjectId);
233
+ return SubjectProvisioned.make({ subjectId: id });
234
+ }
235
+ const nativeId = yield* db.transaction((tx) => Effect.gen(function* () {
236
+ const allocated = mapping.subject.allocateId === void 0 ? void 0 : yield* mapping.subject.allocateId;
237
+ const nativeId = (yield* tx.insert(mapping.subject.table).values(mapping.subject.encodeInsert(input, allocated)).returning({ id: column(mapping.subject.table, mapping.subject.id) }))[0]?.id ?? allocated;
238
+ if (nativeId === void 0) return yield* PersistenceMappingError.make({
239
+ operation: "provisionSubject.generatedId",
240
+ cause: /* @__PURE__ */ new Error("subject insert did not return its native id")
241
+ });
242
+ if (input.identifier !== void 0) yield* tx.insert(identifierTable).values(mapping.identifier.encodeInsert(input.identifier, nativeId, input.verifiedAt));
243
+ yield* tx.insert(requestTable).values(mapping.provisioningRequest.encodeInsert(input.requestId, fingerprint, nativeId));
244
+ return nativeId;
245
+ })).pipe(Effect.catchCause((cause) => {
246
+ if (cause.reasons.length === 0 || !cause.reasons.every((reason) => Cause.isFailReason(reason) && isMappedConstraintConflict(mapping.isConstraintConflict, reason.error))) return Effect.failCause(cause);
247
+ return findReceipt(input.requestId).pipe(Effect.flatMap((receipt) => {
248
+ if (receipt !== void 0 && receipt.fingerprint === fingerprint) return Effect.succeed(receipt.subjectId);
249
+ if (input.identifier === void 0) return IdentityConflict.make();
250
+ 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()));
251
+ }));
252
+ }));
253
+ const subjectId = yield* mapping.subjectId.toSubject(nativeId);
254
+ return SubjectProvisioned.make({ subjectId });
255
+ }, mapIdentityFailure);
256
+ return { subjectProvisioner: SubjectProvisioner.of({ provision }) };
257
+ };
258
+ const makePgExternalIdentityServices = (database, mapping) => {
259
+ const db = database;
260
+ const externalTable = mapping.externalIdentity.table;
261
+ const externalProviderColumn = column(externalTable, mapping.externalIdentity.provider);
262
+ const externalIssuerColumn = column(externalTable, mapping.externalIdentity.issuer);
263
+ const externalSubjectColumn = column(externalTable, mapping.externalIdentity.subject);
264
+ const externalSubjectIdColumn = column(externalTable, mapping.externalIdentity.subjectId);
265
+ const subjectIdColumn = column(mapping.subject.table, mapping.subject.id);
266
+ const subjectStatusColumn = column(mapping.subject.table, mapping.subject.status);
267
+ const bind = Effect.fn("DrizzlePgIdentity.bindExternalIdentity")(function* (subjectId, identity) {
268
+ const nativeId = yield* mapping.subjectId.toNative(subjectId);
269
+ if ((yield* db.transaction((tx) => Effect.gen(function* () {
270
+ const subjects = yield* tx.select({ status: subjectStatusColumn }).from(mapping.subject.table).where(eq(subjectIdColumn, nativeId)).for("update").limit(1);
271
+ if (subjects[0] === void 0 || !mapping.subject.isActiveStatus(subjects[0].status)) return { _tag: "conflict" };
272
+ const links = yield* tx.select({ subjectId: externalSubjectIdColumn }).from(externalTable).where(and(eq(externalProviderColumn, identity.provider), eq(externalIssuerColumn, identity.issuer), eq(externalSubjectColumn, identity.subject))).for("update").limit(1);
273
+ if (links[0] !== void 0) return mapping.subjectId.equals(links[0].subjectId, nativeId) ? { _tag: "bound" } : { _tag: "conflict" };
274
+ yield* tx.insert(externalTable).values(mapping.externalIdentity.encodeInsert(identity, nativeId));
275
+ return { _tag: "bound" };
276
+ })).pipe(Effect.catchCause((cause) => {
277
+ if (cause.reasons.length === 0 || !cause.reasons.every((reason) => Cause.isFailReason(reason) && isMappedConstraintConflict(mapping.isConstraintConflict, reason.error))) return Effect.failCause(cause);
278
+ 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" }));
279
+ })))._tag === "conflict") return yield* IdentityConflict.make();
280
+ }, mapIdentityFailure);
281
+ return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) };
282
+ };
283
+ const makePgIdentityServices = (database, mapping) => ({
284
+ ...makePgSubjectProvisioningServices(database, mapping),
285
+ ...makePgExternalIdentityServices(database, mapping)
286
+ });
287
+ //#endregion
288
+ export { coordinatePgAuthStoreTransaction, coordinatePgAuthTransaction, coordinatePgOAuthStateTransaction, makePgAuthServices, makePgAuthStoreServices, makePgExternalIdentityServices, makePgIdentityServices, makePgOAuthStateServices, makePgSubjectProvisioningServices };
289
+
290
+ //# sourceMappingURL=pg.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg.mjs","names":[],"sources":["../../src/drizzle/pg.ts"],"sourcesContent":["import { AuthStore, EmailOtpRejected } from \"@yielded/auth/AuthStore\";\nimport { AuthRateLimited, AuthStoreError, InvalidRegistration } from \"@yielded/auth/Errors\";\nimport {\n ExternalIdentityMutation,\n IdentityConflict,\n IdentityUnavailable,\n SubjectProvisioned,\n type ExternalIdentity,\n SubjectProvisioner,\n type SubjectProvisioningInput,\n} from \"@yielded/auth/Identity\";\nimport {\n InvalidOAuthState,\n OAuthStateDecisions,\n OAuthStateStore,\n type OAuthState,\n} from \"@yielded/auth/OAuth\";\nimport { AuthStoreDecisions, reportPersistenceFailure } from \"@yielded/auth/Persistence\";\nimport {\n VerifiedEmail,\n type ConsumeChallenge,\n type ConsumeRegistration,\n type NewChallenge,\n type NewRegistration,\n type SubjectId,\n type TokenDigest,\n} from \"@yielded/auth/Schema\";\n/* oxlint-disable no-explicit-any -- Drizzle's generic query builders lose the concrete consumer table through a runtime column map. Assertions stay in this adapter. */\nimport {\n and,\n eq,\n gt,\n lt,\n lte,\n ne,\n or,\n sql,\n type AnyRelations,\n type InferSelectModel,\n} from \"drizzle-orm\";\nimport type { EffectPgDatabase as PgliteDatabase } from \"drizzle-orm/effect-pglite\";\nimport type { EffectPgDatabase as PgDatabase } from \"drizzle-orm/effect-postgres\";\nimport { type AnyPgTable, type PgColumn } from \"drizzle-orm/pg-core\";\nimport { Cause, Context, DateTime, Duration, Effect, Layer, Schema } from \"effect\";\nimport type { SqlError } from \"effect/unstable/sql/SqlError\";\n\nimport {\n column,\n PersistenceMappingError,\n isMappedConstraintConflict,\n provisioningFingerprint,\n requireStandaloneConsume,\n updateValues,\n type AuthTables,\n type AuthStoreTables,\n type ChallengeConsumeDecision,\n type ConsumeDecision,\n type ExternalIdentityTables,\n type IdentityTables,\n type OAuthStateTables,\n type SubjectProvisioningTables,\n} from \"./model\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\ntype Database = PgDatabase<AnyRelations> | PgliteDatabase<AnyRelations>;\ntype RuntimeDatabase = PgDatabase<any> & Parameters<typeof requireStandaloneConsume>[0];\ntype TransactionOf<D extends Database> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\n\nconst storeReadError = () => AuthStoreError.make({ message: \"Auth store read failed\" });\nconst storeWriteError = () => AuthStoreError.make({ message: \"Auth store write failed\" });\nconst isStoreFailure = Schema.is(AuthStoreError);\n\nconst mapStoreFailure =\n (failure: () => AuthStoreError) =>\n <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, AuthStoreError, R> =>\n reportPersistenceFailure(effect, isStoreFailure).pipe(\n Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, failure))),\n );\n\nconst mapStoreReadFailure = mapStoreFailure(storeReadError);\nconst mapStoreWriteFailure = mapStoreFailure(storeWriteError);\nconst identityUnavailable = () => IdentityUnavailable.make();\nconst isIdentityFailure = Schema.is(Schema.Union([IdentityConflict, IdentityUnavailable]));\n\nconst mapIdentityFailure = <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n reportPersistenceFailure(effect, isIdentityFailure).pipe(\n Effect.catchCause((cause) =>\n Effect.failCause(\n Cause.map(cause, (error) => (isIdentityFailure(error) ? error : identityUnavailable())),\n ),\n ),\n );\n\nconst selected = <T extends AnyPgTable>(row: unknown): InferSelectModel<T> =>\n row as InferSelectModel<T>;\n\nexport const makePgAuthStoreServices = <C extends AnyPgTable, R extends AnyPgTable>(\n database: Database,\n mapping: AuthStoreTables<C, R>,\n) => {\n const db = database as RuntimeDatabase;\n const challengeTable = mapping.challenge.table;\n const challengeColumns = mapping.challenge.columns;\n\n const challenge = {\n challengeId: column(challengeTable, challengeColumns.challengeId),\n tokenDigest: column(challengeTable, challengeColumns.tokenDigest),\n namespace: column(challengeTable, challengeColumns.namespace),\n value: column(challengeTable, challengeColumns.value),\n purpose: column(challengeTable, challengeColumns.purpose),\n otpKeyId: column(challengeTable, challengeColumns.otpKeyId),\n otpDigest: column(challengeTable, challengeColumns.otpDigest),\n issuedAt: column(challengeTable, challengeColumns.issuedAt),\n expiresAt: column(challengeTable, challengeColumns.expiresAt),\n attemptLimit: column(challengeTable, challengeColumns.attemptLimit),\n failedAttempts: column(challengeTable, challengeColumns.failedAttempts),\n consumed: column(challengeTable, challengeColumns.consumed),\n } as const;\n\n const pgChallenge = challenge as Record<keyof typeof challenge, PgColumn>;\n const registrationTable = mapping.registration.table;\n const registrationColumns = mapping.registration.columns;\n\n const registration = {\n tokenDigest: column(registrationTable, registrationColumns.tokenDigest),\n expiresAt: column(registrationTable, registrationColumns.expiresAt),\n consumed: column(registrationTable, registrationColumns.consumed),\n } as const;\n\n const issueChallenge = Effect.fn(\"DrizzlePgAuthStore.issueChallenge\")(function* (\n input: NewChallenge,\n ) {\n const now = yield* DateTime.now;\n\n const cooldownCutoff = DateTime.mapEpochMillis(\n now,\n (millis) => millis - Duration.toMillis(input.resendCooldown),\n );\n\n const rows = yield* Effect.suspend(() => {\n const values = mapping.challenge.encodeInsert(input, {\n namespace: mapping.challenge.identifierNamespace,\n failedAttempts: 0,\n consumed: false,\n });\n\n const nativeNow = mapping.challenge.encodeInstant(now);\n const nativeCutoff = mapping.challenge.encodeInstant(cooldownCutoff);\n const nativeIssuedAt = mapping.challenge.encodeInstant(input.issuedAt);\n const preservedAttempts = sql`case when ${gt(pgChallenge.expiresAt, nativeNow)} then ${pgChallenge.failedAttempts} else 0 end`;\n\n const update = mapping.challenge.encodeUpdate(input, {\n namespace: mapping.challenge.identifierNamespace,\n failedAttempts: preservedAttempts as any,\n consumed: false,\n });\n\n return db\n .insert(challengeTable as any)\n .values(values as any)\n .onConflictDoUpdate({\n target: [pgChallenge.namespace, pgChallenge.value, pgChallenge.purpose],\n set: update as any,\n setWhere: and(\n ne(pgChallenge.challengeId, input.challengeId),\n lt(pgChallenge.issuedAt, nativeIssuedAt),\n or(eq(pgChallenge.consumed, true), lte(pgChallenge.issuedAt, nativeCutoff)),\n ),\n })\n .returning();\n }).pipe(mapStoreWriteFailure);\n\n if (rows.length > 0) return;\n\n const existing = yield* Effect.suspend(() =>\n db\n .select()\n .from(challengeTable as any)\n .where(\n and(\n eq(pgChallenge.namespace, mapping.challenge.identifierNamespace),\n eq(pgChallenge.value, input.email),\n eq(pgChallenge.purpose, input.purpose),\n ),\n )\n .limit(1),\n ).pipe(mapStoreReadFailure);\n\n const decoded =\n existing[0] === undefined\n ? undefined\n : yield* Effect.suspend(() => mapping.challenge.decode(selected<C>(existing[0]))).pipe(\n mapStoreReadFailure,\n );\n\n const retryAfterSeconds =\n decoded === undefined\n ? Math.max(1, Math.ceil(Duration.toMillis(input.resendCooldown) / 1000))\n : Math.max(\n 1,\n Math.ceil(\n (DateTime.toEpochMillis(decoded.challenge.issuedAt) +\n Duration.toMillis(input.resendCooldown) -\n DateTime.toEpochMillis(now)) /\n 1000,\n ),\n );\n\n return yield* AuthRateLimited.make({ retryAfterSeconds });\n });\n\n const consumeChallengeDecision = Effect.fn(\"DrizzlePgAuthStore.consumeChallengeDecision\")(\n function* (\n input: ConsumeChallenge,\n ): Effect.fn.Return<ChallengeConsumeDecision, AuthStoreError> {\n const now = yield* DateTime.now;\n\n const alternatives = Object.entries(input.otpDigests).map(([keyId, digest]) =>\n and(eq(pgChallenge.otpKeyId, keyId), eq(pgChallenge.otpDigest, digest)),\n );\n\n const matches = alternatives.length === 0 ? sql<boolean>`false` : or(...alternatives)!;\n\n const rows = yield* Effect.suspend(() =>\n db\n .update(challengeTable as any)\n .set(\n updateValues<C>([\n [\n challengeColumns.consumed,\n sql`case when ${matches} then true else ${pgChallenge.consumed} end`,\n ],\n [\n challengeColumns.failedAttempts,\n sql`${pgChallenge.failedAttempts} + case when ${matches} then 0 else 1 end`,\n ],\n ]) as any,\n )\n .where(\n and(\n eq(pgChallenge.tokenDigest, input.tokenDigest),\n eq(pgChallenge.consumed, false),\n gt(pgChallenge.expiresAt, mapping.challenge.encodeInstant(now)),\n sql`${pgChallenge.failedAttempts} < ${pgChallenge.attemptLimit}`,\n ),\n )\n .returning(),\n ).pipe(mapStoreWriteFailure);\n\n if (rows[0] === undefined) {\n return { _tag: \"rejected\", reason: \"missing_challenge\" };\n }\n\n const decoded = yield* Effect.suspend(() =>\n mapping.challenge.decode(selected<C>(rows[0])),\n ).pipe(mapStoreReadFailure);\n\n if (!decoded.consumed) return { _tag: \"rejected\", reason: \"bad_code\" };\n\n return {\n _tag: \"accepted\",\n value: VerifiedEmail.make({\n email: decoded.challenge.email,\n purpose: decoded.challenge.purpose,\n }),\n };\n },\n );\n\n const consumeChallenge = Effect.fn(\"DrizzlePgAuthStore.consumeChallenge\")(function* (\n input: ConsumeChallenge,\n ) {\n yield* requireStandaloneConsume(db);\n const decision = yield* consumeChallengeDecision(input);\n\n return decision._tag === \"accepted\"\n ? decision.value\n : yield* EmailOtpRejected.make({ reason: decision.reason });\n });\n\n const issueRegistration = Effect.fn(\"DrizzlePgAuthStore.issueRegistration\")(function* (\n input: NewRegistration,\n ) {\n yield* Effect.suspend(() =>\n db\n .insert(registrationTable as any)\n .values(mapping.registration.encodeInsert(input, false) as any),\n ).pipe(mapStoreWriteFailure);\n });\n\n const inspectRegistration = Effect.fn(\"DrizzlePgAuthStore.inspectRegistration\")(function* (\n tokenDigest: TokenDigest,\n ) {\n const now = yield* DateTime.now;\n\n const rows = yield* Effect.suspend(() =>\n db\n .select()\n .from(registrationTable as any)\n .where(\n and(\n eq(registration.tokenDigest, tokenDigest),\n eq(registration.consumed, false),\n gt(registration.expiresAt, mapping.registration.encodeInstant(now)),\n ),\n )\n .limit(1),\n ).pipe(mapStoreReadFailure);\n\n if (rows[0] === undefined) return yield* InvalidRegistration.make();\n\n const decoded = yield* Effect.suspend(() =>\n mapping.registration.decode(selected<R>(rows[0])),\n ).pipe(mapStoreReadFailure);\n\n return decoded.registration;\n });\n\n const consumeRegistrationDecision = Effect.fn(\"DrizzlePgAuthStore.consumeRegistrationDecision\")(\n function* (\n input: ConsumeRegistration,\n ): Effect.fn.Return<ConsumeDecision<void>, AuthStoreError> {\n const now = yield* DateTime.now;\n\n const rows = yield* Effect.suspend(() =>\n db\n .update(registrationTable as any)\n .set(updateValues<R>([[registrationColumns.consumed, true]]) as any)\n .where(\n and(\n eq(registration.tokenDigest, input.tokenDigest),\n eq(registration.consumed, false),\n gt(registration.expiresAt, mapping.registration.encodeInstant(now)),\n ),\n )\n .returning({ consumed: registration.consumed as PgColumn }),\n ).pipe(mapStoreWriteFailure);\n\n return rows.length === 0 ? { _tag: \"rejected\" } : { _tag: \"accepted\", value: undefined };\n },\n );\n\n const consumeRegistration = Effect.fn(\"DrizzlePgAuthStore.consumeRegistration\")(function* (\n input: ConsumeRegistration,\n ) {\n yield* requireStandaloneConsume(db);\n const decision = yield* consumeRegistrationDecision(input);\n\n if (decision._tag === \"rejected\") return yield* InvalidRegistration.make();\n });\n\n return {\n authStore: AuthStore.of({\n issueChallenge,\n consumeChallenge,\n issueRegistration,\n inspectRegistration,\n consumeRegistration,\n }),\n decisions: {\n consumeChallenge: consumeChallengeDecision,\n consumeRegistration: consumeRegistrationDecision,\n },\n } as const;\n};\n\nexport const makePgOAuthStateServices = <S extends AnyPgTable>(\n database: Database,\n mapping: OAuthStateTables<S>,\n) => {\n const db = database as RuntimeDatabase;\n const stateTable = mapping.oauthState.table;\n const stateColumns = mapping.oauthState.columns;\n\n const state = {\n stateDigest: column(stateTable, stateColumns.stateDigest),\n expiresAt: column(stateTable, stateColumns.expiresAt),\n consumed: column(stateTable, stateColumns.consumed),\n } as const;\n\n const issue = Effect.fn(\"DrizzlePgOAuthStateStore.issue\")(function* (input: OAuthState) {\n yield* Effect.suspend(() =>\n db.insert(stateTable as any).values(mapping.oauthState.encodeInsert(input, false) as any),\n ).pipe(mapStoreWriteFailure);\n });\n\n const consumeDecision = Effect.fn(\"DrizzlePgOAuthStateStore.consumeDecision\")(function* (\n digest: TokenDigest,\n ): Effect.fn.Return<ConsumeDecision<OAuthState>, AuthStoreError> {\n const now = yield* DateTime.now;\n\n const rows = yield* Effect.suspend(() =>\n db\n .update(stateTable as any)\n .set(updateValues<S>([[stateColumns.consumed, true]]) as any)\n .where(\n and(\n eq(state.stateDigest, digest),\n eq(state.consumed, false),\n gt(state.expiresAt, mapping.oauthState.encodeInstant(now)),\n ),\n )\n .returning(),\n ).pipe(mapStoreWriteFailure);\n\n if (rows[0] === undefined) return { _tag: \"rejected\" };\n\n const decoded = yield* Effect.suspend(() =>\n mapping.oauthState.decode(selected<S>(rows[0])),\n ).pipe(mapStoreReadFailure);\n\n return { _tag: \"accepted\", value: decoded.state };\n });\n\n const consume = Effect.fn(\"DrizzlePgOAuthStateStore.consume\")(function* (digest: TokenDigest) {\n yield* requireStandaloneConsume(db);\n const decision = yield* consumeDecision(digest);\n\n return decision._tag === \"accepted\" ? decision.value : yield* InvalidOAuthState.make();\n });\n\n return {\n oauthStateStore: OAuthStateStore.of({ issue, consume }),\n decisions: { consumeOAuthState: consumeDecision },\n } as const;\n};\n\nexport const makePgAuthServices = <\n C extends AnyPgTable,\n R extends AnyPgTable,\n S extends AnyPgTable,\n>(\n database: Database,\n mapping: AuthTables<C, R, S>,\n) => {\n const auth = makePgAuthStoreServices(database, mapping);\n const oauth = makePgOAuthStateServices(database, mapping);\n\n return { ...auth, ...oauth, decisions: { ...auth.decisions, ...oauth.decisions } } as const;\n};\n\n/**\n * Owns the native outer commit. Keep rejection as a decision value inside the\n * owner; interruption before commit rolls back. Retry an unknown commit outcome\n * only with the same stable request identity.\n */\nexport function coordinatePgAuthStoreTransaction<\n D extends Database,\n C extends AnyPgTable,\n R extends AnyPgTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: AuthStoreTables<C, R>; readonly transaction?: never },\n body: Effect.Effect<A, E, Requirements>,\n): Effect.Effect<\n A,\n E | DatabaseError | SqlError,\n Exclude<Requirements, AuthStoreDecisions> | DatabaseRequirements\n>;\n\nexport function coordinatePgAuthStoreTransaction<\n D extends Database,\n C extends AnyPgTable,\n R extends AnyPgTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthStoreTables<C, R>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, Requirements>,\n): Effect.Effect<\n A,\n E | DatabaseError | SqlError,\n Exclude<Requirements, AuthStoreDecisions | TxId> | DatabaseRequirements\n>;\n\nexport function coordinatePgAuthStoreTransaction<\n D extends Database,\n C extends AnyPgTable,\n R extends AnyPgTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthStoreTables<C, R>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, Requirements>,\n) {\n return Effect.flatMap(acquire, (database) =>\n database.transaction<A, E, Exclude<Requirements, AuthStoreDecisions>>((transaction) => {\n const decisions = makePgAuthStoreServices(transaction as never, options.mapping).decisions;\n const provided = Context.make(AuthStoreDecisions, decisions);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(\n work,\n options.transaction,\n options.transaction.of(transaction as TransactionOf<D>),\n );\n }),\n );\n}\n\nexport function coordinatePgOAuthStateTransaction<\n D extends Database,\n S extends AnyPgTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: OAuthStateTables<S>; readonly transaction?: never },\n body: Effect.Effect<A, E, Requirements>,\n): Effect.Effect<\n A,\n E | DatabaseError | SqlError,\n Exclude<Requirements, OAuthStateDecisions> | DatabaseRequirements\n>;\n\nexport function coordinatePgOAuthStateTransaction<\n D extends Database,\n S extends AnyPgTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthStateTables<S>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, Requirements>,\n): Effect.Effect<\n A,\n E | DatabaseError | SqlError,\n Exclude<Requirements, OAuthStateDecisions | TxId> | DatabaseRequirements\n>;\n\nexport function coordinatePgOAuthStateTransaction<\n D extends Database,\n S extends AnyPgTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthStateTables<S>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, Requirements>,\n) {\n return Effect.flatMap(acquire, (database) =>\n database.transaction<A, E, Exclude<Requirements, OAuthStateDecisions>>((transaction) => {\n const decisions = makePgOAuthStateServices(transaction as never, options.mapping).decisions;\n const provided = Context.make(OAuthStateDecisions, decisions);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(\n work,\n options.transaction,\n options.transaction.of(transaction as TransactionOf<D>),\n );\n }),\n );\n}\n\nexport function coordinatePgAuthTransaction<\n D extends Database,\n C extends AnyPgTable,\n R extends AnyPgTable,\n S extends AnyPgTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: AuthTables<C, R, S>; readonly transaction?: never },\n body: Effect.Effect<A, E, Requirements>,\n): Effect.Effect<\n A,\n E | DatabaseError | SqlError,\n Exclude<Requirements, AuthStoreDecisions | OAuthStateDecisions> | DatabaseRequirements\n>;\n\nexport function coordinatePgAuthTransaction<\n D extends Database,\n C extends AnyPgTable,\n R extends AnyPgTable,\n S extends AnyPgTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthTables<C, R, S>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, Requirements>,\n): Effect.Effect<\n A,\n E | DatabaseError | SqlError,\n Exclude<Requirements, AuthStoreDecisions | OAuthStateDecisions | TxId> | DatabaseRequirements\n>;\n\nexport function coordinatePgAuthTransaction<\n D extends Database,\n C extends AnyPgTable,\n R extends AnyPgTable,\n S extends AnyPgTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthTables<C, R, S>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, Requirements>,\n) {\n return Effect.flatMap(acquire, (database) =>\n database.transaction<A, E, Exclude<Requirements, AuthStoreDecisions | OAuthStateDecisions>>(\n (transaction) => {\n const decisions = makePgAuthServices(transaction as never, options.mapping).decisions;\n\n const provided = Context.make(AuthStoreDecisions, decisions).pipe(\n Context.add(OAuthStateDecisions, decisions),\n );\n\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(\n work,\n options.transaction,\n options.transaction.of(transaction as TransactionOf<D>),\n );\n },\n ),\n );\n}\n\nexport const makePgSubjectProvisioningServices = <\n Subject extends AnyPgTable,\n Identifier extends AnyPgTable,\n Request extends AnyPgTable,\n NativeId,\n>(\n database: Database,\n mapping: SubjectProvisioningTables<Subject, Identifier, Request, NativeId>,\n) => {\n const db = database as RuntimeDatabase;\n const requestTable = mapping.provisioningRequest.table;\n const requestIdColumn = column(requestTable, mapping.provisioningRequest.requestId);\n const requestFingerprintColumn = column(requestTable, mapping.provisioningRequest.fingerprint);\n const requestSubjectColumn = column(requestTable, mapping.provisioningRequest.subjectId);\n const identifierTable = mapping.identifier.table;\n const identifierNamespaceColumn = column(identifierTable, mapping.identifier.namespace);\n const identifierValueColumn = column(identifierTable, mapping.identifier.value);\n\n const findReceipt = Effect.fn(\"DrizzlePgIdentity.findReceipt\")(function* (requestId: string) {\n const rows = yield* db\n .select({\n fingerprint: requestFingerprintColumn as PgColumn,\n subjectId: requestSubjectColumn as PgColumn,\n })\n .from(requestTable as any)\n .where(eq(requestIdColumn, requestId))\n .limit(1);\n\n return rows[0];\n });\n\n const provision = Effect.fn(\"DrizzlePgIdentity.provision\")(function* (\n input: SubjectProvisioningInput,\n ) {\n const fingerprint = provisioningFingerprint(input);\n const existing = yield* findReceipt(input.requestId);\n\n if (existing !== undefined) {\n if (existing.fingerprint !== fingerprint) return yield* IdentityConflict.make();\n const id = yield* mapping.subjectId.toSubject(existing.subjectId as NativeId);\n\n return SubjectProvisioned.make({ subjectId: id });\n }\n\n const attempt = db.transaction((tx) =>\n Effect.gen(function* () {\n const allocated =\n mapping.subject.allocateId === undefined ? undefined : yield* mapping.subject.allocateId;\n\n const inserted = yield* tx\n .insert(mapping.subject.table as any)\n .values(mapping.subject.encodeInsert(input, allocated) as any)\n .returning({ id: column(mapping.subject.table, mapping.subject.id) as PgColumn });\n\n const nativeId = (inserted[0]?.id ?? allocated) as NativeId | undefined;\n\n if (nativeId === undefined) {\n return yield* PersistenceMappingError.make({\n operation: \"provisionSubject.generatedId\",\n cause: new Error(\"subject insert did not return its native id\"),\n });\n }\n if (input.identifier !== undefined) {\n yield* tx\n .insert(identifierTable as any)\n .values(\n mapping.identifier.encodeInsert(input.identifier, nativeId, input.verifiedAt) as any,\n );\n }\n yield* tx\n .insert(requestTable as any)\n .values(\n mapping.provisioningRequest.encodeInsert(input.requestId, fingerprint, nativeId) as any,\n );\n\n return nativeId;\n }),\n );\n\n const nativeId = yield* attempt.pipe(\n Effect.catchCause(\n (\n cause,\n ): Effect.Effect<\n NativeId,\n | Effect.Error<typeof attempt>\n | Effect.Error<ReturnType<typeof findReceipt>>\n | IdentityConflict\n > => {\n if (\n cause.reasons.length === 0 ||\n !cause.reasons.every(\n (reason) =>\n Cause.isFailReason(reason) &&\n isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),\n )\n )\n return Effect.failCause(cause);\n\n return findReceipt(input.requestId).pipe(\n Effect.flatMap((receipt) => {\n if (receipt !== undefined && receipt.fingerprint === fingerprint) {\n return Effect.succeed(receipt.subjectId as NativeId);\n }\n if (input.identifier === undefined) return IdentityConflict.make();\n\n return db\n .select({\n subjectId: column(identifierTable, mapping.identifier.subjectId) as PgColumn,\n })\n .from(identifierTable as any)\n .where(\n and(\n eq(identifierNamespaceColumn, input.identifier.namespace),\n eq(identifierValueColumn, input.identifier.value),\n ),\n )\n .limit(1)\n .pipe(Effect.flatMap(() => IdentityConflict.make()));\n }),\n );\n },\n ),\n );\n\n const subjectId = yield* mapping.subjectId.toSubject(nativeId);\n\n return SubjectProvisioned.make({ subjectId });\n }, mapIdentityFailure);\n\n return {\n subjectProvisioner: SubjectProvisioner.of({ provision }),\n } as const;\n};\n\nexport const makePgExternalIdentityServices = <\n Subject extends AnyPgTable,\n External extends AnyPgTable,\n NativeId,\n>(\n database: Database,\n mapping: ExternalIdentityTables<Subject, External, NativeId>,\n) => {\n const db = database as RuntimeDatabase;\n const externalTable = mapping.externalIdentity.table;\n\n const externalProviderColumn = column(\n externalTable,\n mapping.externalIdentity.provider,\n ) as PgColumn;\n\n const externalIssuerColumn = column(externalTable, mapping.externalIdentity.issuer) as PgColumn;\n const externalSubjectColumn = column(externalTable, mapping.externalIdentity.subject) as PgColumn;\n\n const externalSubjectIdColumn = column(\n externalTable,\n mapping.externalIdentity.subjectId,\n ) as PgColumn;\n\n const subjectIdColumn = column(mapping.subject.table, mapping.subject.id) as PgColumn;\n const subjectStatusColumn = column(mapping.subject.table, mapping.subject.status) as PgColumn;\n\n const bind = Effect.fn(\"DrizzlePgIdentity.bindExternalIdentity\")(function* (\n subjectId: SubjectId,\n identity: ExternalIdentity,\n ) {\n const nativeId = yield* mapping.subjectId.toNative(subjectId);\n\n const decision = yield* db\n .transaction((tx) =>\n Effect.gen(function* () {\n const subjects = yield* tx\n .select({ status: subjectStatusColumn })\n .from(mapping.subject.table as any)\n .where(eq(subjectIdColumn, nativeId))\n .for(\"update\")\n .limit(1);\n\n if (subjects[0] === undefined || !mapping.subject.isActiveStatus(subjects[0].status))\n return { _tag: \"conflict\" } as const;\n\n const links = yield* tx\n .select({ subjectId: externalSubjectIdColumn })\n .from(externalTable as any)\n .where(\n and(\n eq(externalProviderColumn, identity.provider),\n eq(externalIssuerColumn, identity.issuer),\n eq(externalSubjectColumn, identity.subject),\n ),\n )\n .for(\"update\")\n .limit(1);\n\n if (links[0] !== undefined)\n return mapping.subjectId.equals(links[0].subjectId as NativeId, nativeId)\n ? ({ _tag: \"bound\" } as const)\n : ({ _tag: \"conflict\" } as const);\n yield* tx\n .insert(externalTable as any)\n .values(mapping.externalIdentity.encodeInsert(identity, nativeId) as any);\n\n return { _tag: \"bound\" } as const;\n }),\n )\n .pipe(\n Effect.catchCause((cause) => {\n if (\n cause.reasons.length === 0 ||\n !cause.reasons.every(\n (reason) =>\n Cause.isFailReason(reason) &&\n isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),\n )\n )\n return Effect.failCause(cause);\n\n return db\n .select({ subjectId: externalSubjectIdColumn })\n .from(externalTable as any)\n .where(\n and(\n eq(externalProviderColumn, identity.provider),\n eq(externalIssuerColumn, identity.issuer),\n eq(externalSubjectColumn, identity.subject),\n ),\n )\n .limit(1)\n .pipe(\n Effect.map((rows) =>\n rows[0] !== undefined &&\n mapping.subjectId.equals(rows[0].subjectId as NativeId, nativeId)\n ? ({ _tag: \"bound\" } as const)\n : ({ _tag: \"conflict\" } as const),\n ),\n );\n }),\n );\n\n if (decision._tag === \"conflict\") return yield* IdentityConflict.make();\n }, mapIdentityFailure);\n\n return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) } as const;\n};\n\nexport const makePgIdentityServices = <\n Subject extends AnyPgTable,\n Identifier extends AnyPgTable,\n External extends AnyPgTable,\n Request extends AnyPgTable,\n NativeId,\n>(\n database: Database,\n mapping: IdentityTables<Subject, Identifier, External, Request, NativeId>,\n) => ({\n ...makePgSubjectProvisioningServices(database, mapping),\n ...makePgExternalIdentityServices(database, mapping),\n});\n\nexport const pgLayers = <\n Id,\n C extends AnyPgTable,\n R extends AnyPgTable,\n S extends AnyPgTable,\n Subject extends AnyPgTable,\n Identifier extends AnyPgTable,\n External extends AnyPgTable,\n Request extends AnyPgTable,\n NativeId,\n>(\n database: Context.Service<Id, Database>,\n auth: AuthTables<C, R, S>,\n identity: IdentityTables<Subject, Identifier, External, Request, NativeId>,\n) => ({\n identity: Layer.merge(\n Layer.effect(\n SubjectProvisioner,\n database.use((db) => Effect.succeed(makePgIdentityServices(db, identity).subjectProvisioner)),\n ),\n Layer.effect(\n ExternalIdentityMutation,\n database.use((db) =>\n Effect.succeed(makePgIdentityServices(db, identity).externalIdentityMutation),\n ),\n ),\n ),\n authStore: Layer.effect(\n AuthStore,\n database.use((db) => Effect.succeed(makePgAuthServices(db, auth).authStore)),\n ),\n oauthStateStore: Layer.effect(\n OAuthStateStore,\n database.use((db) => Effect.succeed(makePgAuthServices(db, auth).oauthStateStore)),\n ),\n});\n"],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import { PersistenceMappingError } from "../internal/mapping-error.mjs";
2
+ import "./model.mjs";
3
+ import { AnyProofPersistenceMapping, ProofPersistenceMapping } from "./proof-model.mjs";
4
+ import { Effect, Layer } from "effect";
5
+ import { SubjectId } from "@yielded/auth/Schema";
6
+ import { AuthenticationRequirement } from "@yielded/auth/Sessions";
7
+ import { PhoneAdmission, PhoneAdmissionPolicy, PhoneLifecyclePolicy, PhoneNumber, PhonePersistence, PhoneSignInTargets } from "@yielded/auth/PhoneOtp";
8
+ import { InferInsertModel, InferSelectModel, SQL, Table } from "drizzle-orm";
9
+ //#region src/drizzle/phone-model.d.ts
10
+ declare const proofMapping: unique symbol;
11
+ /** Opaque same-owner proof mapping. The builder preserves the consumer's table codecs. */
12
+ interface PhoneProofCompletionMapping {
13
+ readonly [proofMapping]: AnyProofPersistenceMapping;
14
+ }
15
+ declare const phoneProofCompletionMapping: <Rq extends Table, S extends Table, G extends Table, Cn extends Table, Rs extends Table, A extends Table, F extends Table, C extends Table, Sub extends Table, I extends Table, Cr extends Table, N>(mapping: ProofPersistenceMapping<Rq, S, G, Cn, Rs, A, F, C, Sub, I, Cr, N>) => PhoneProofCompletionMapping;
16
+ type PhoneColumn<T extends Table> = Extract<keyof T["_"]["columns"], string>;
17
+ type PhoneMappingSource<M, R = never> = M | Effect.Effect<M, PersistenceMappingError, R>;
18
+ declare const requiredPhoneConstraints: {
19
+ readonly subject: "unique(id)";
20
+ readonly identifier: "unique(namespace,value)";
21
+ readonly credential: "unique(credentialId)";
22
+ readonly state: "unique(scope)";
23
+ };
24
+ /** Consumer-owned schema; encoders and allocators are synchronous and side-effect free.
25
+ * State stores permanent number custody and command tombstones, plus bounded admission
26
+ * counters. Never delete custody rows to make a recycled number eligible. A consumer's
27
+ * explicit recovery workflow may resolve custody only after independent authentication.
28
+ * Subject defaults own account provisioning; no email/profile schema is prescribed. */
29
+ interface PhoneMapping<S extends Table, I extends Table, C extends Table, T extends Table, N> {
30
+ readonly moduleId: string;
31
+ readonly policy: PhoneLifecyclePolicy;
32
+ readonly admission: PhoneAdmissionPolicy;
33
+ readonly constraints: typeof requiredPhoneConstraints;
34
+ readonly proofs: PhoneProofCompletionMapping;
35
+ readonly subjectIds: {
36
+ readonly toNative: (id: SubjectId) => N;
37
+ readonly toSubject: (id: N) => SubjectId;
38
+ readonly allocate: () => N;
39
+ };
40
+ readonly subject: {
41
+ readonly table: S;
42
+ readonly id: PhoneColumn<S>;
43
+ readonly securityRevision: PhoneColumn<S>;
44
+ readonly activeCondition: SQL;
45
+ readonly decodeRequirement: (row: InferSelectModel<S>) => AuthenticationRequirement;
46
+ /** Current action policy, independently from primary sign-in assurance. */
47
+ readonly decodeActionRequirement?: (row: InferSelectModel<S>, action: "verify" | "change") => AuthenticationRequirement;
48
+ readonly encodeInsert: (input: {
49
+ readonly id: N;
50
+ readonly securityRevision: string;
51
+ readonly phoneNumber: PhoneNumber;
52
+ }) => InferInsertModel<S>;
53
+ };
54
+ readonly identifier: {
55
+ readonly table: I;
56
+ readonly namespace: PhoneColumn<I>;
57
+ readonly value: PhoneColumn<I>;
58
+ readonly subjectId: PhoneColumn<I>;
59
+ readonly revision: PhoneColumn<I>;
60
+ readonly verifiedAt: PhoneColumn<I>;
61
+ readonly status: PhoneColumn<I>;
62
+ readonly activeCondition: SQL;
63
+ readonly encodeStatus: (active: boolean) => unknown;
64
+ readonly encodeInsert: (input: {
65
+ readonly phoneNumber: PhoneNumber;
66
+ readonly subjectId: N;
67
+ readonly revision: string;
68
+ readonly verifiedAtMillis: number;
69
+ readonly active: boolean;
70
+ }) => InferInsertModel<I>;
71
+ };
72
+ readonly credential: {
73
+ readonly table: C;
74
+ readonly id: PhoneColumn<C>;
75
+ readonly subjectId: PhoneColumn<C>;
76
+ readonly revision: PhoneColumn<C>;
77
+ readonly status: PhoneColumn<C>;
78
+ readonly activeCondition: SQL;
79
+ readonly encodeStatus: (active: boolean) => unknown;
80
+ readonly encodeInsert: (input: {
81
+ readonly credentialId: string;
82
+ readonly subjectId: N;
83
+ readonly revision: string;
84
+ readonly active: boolean;
85
+ }) => InferInsertModel<C>;
86
+ };
87
+ readonly state: {
88
+ readonly table: T;
89
+ readonly scope: PhoneColumn<T>;
90
+ readonly state: PhoneColumn<T>;
91
+ readonly version: PhoneColumn<T>;
92
+ readonly encodeInsert: (input: {
93
+ readonly scope: string;
94
+ readonly state: string;
95
+ readonly version: string;
96
+ }) => InferInsertModel<T>;
97
+ };
98
+ readonly encodeInstant: (millis: number) => unknown;
99
+ readonly engineNowMillis: SQL;
100
+ }
101
+ interface D1PhoneMapping {
102
+ readonly d1: {
103
+ readonly primary: true;
104
+ };
105
+ }
106
+ interface PhonePersistenceServices {
107
+ readonly phonePersistence: PhonePersistence["Service"];
108
+ readonly phoneAdmission: PhoneAdmission["Service"];
109
+ readonly phoneSignInTargets: PhoneSignInTargets["Service"];
110
+ }
111
+ /** Bundle phone storage, admission, and lookup with overridable crypto and hook defaults. */
112
+ declare const phonePersistenceLayer: <E, R>(services: Effect.Effect<PhonePersistenceServices, E, R>) => Layer.Layer<PhoneAdmission | PhonePersistence | PhoneSignInTargets, E, Exclude<Exclude<R, import("effect/Scope").Scope>, import("effect/Crypto").Crypto | import("@yielded/auth/Hooks").LifecycleHooks | import("@yielded/auth/WebCrypto").SubtleCrypto>>;
113
+ //#endregion
114
+ export { D1PhoneMapping, PhoneColumn, PhoneMapping, PhoneMappingSource, PhonePersistenceServices, PhoneProofCompletionMapping, phonePersistenceLayer, phoneProofCompletionMapping, requiredPhoneConstraints };
115
+ //# sourceMappingURL=phone-model.d.mts.map
@@ -0,0 +1,39 @@
1
+ import { Effect, Layer } from "effect";
2
+ import { cryptoLayer, hooksLayer } from "@yielded/auth/Persistence";
3
+ import { PhoneAdmission, PhonePersistence, PhoneSignInTargets } from "@yielded/auth/PhoneOtp";
4
+ //#region src/drizzle/phone-model.ts
5
+ const proofMapping = Symbol("effect-auth/phone/proofs");
6
+ const phoneProofCompletionMapping = (mapping) => Object.freeze({ [proofMapping]: Object.freeze({
7
+ ...mapping,
8
+ request: Object.freeze({ ...mapping.request }),
9
+ series: Object.freeze({ ...mapping.series }),
10
+ generation: Object.freeze({ ...mapping.generation }),
11
+ continuation: Object.freeze({ ...mapping.continuation }),
12
+ rateScope: Object.freeze({ ...mapping.rateScope }),
13
+ abuseEvent: Object.freeze({ ...mapping.abuseEvent }),
14
+ failureEvent: Object.freeze({ ...mapping.failureEvent }),
15
+ command: Object.freeze({ ...mapping.command }),
16
+ constraints: Object.freeze({ ...mapping.constraints }),
17
+ authority: Object.freeze({
18
+ ...mapping.authority,
19
+ identifier: Object.freeze({ ...mapping.authority.identifier }),
20
+ ...mapping.authority.subject === void 0 ? {} : { subject: Object.freeze({ ...mapping.authority.subject }) },
21
+ ...mapping.authority.credential === void 0 ? {} : { credential: Object.freeze({ ...mapping.authority.credential }) },
22
+ ...mapping.authority.subjectId === void 0 ? {} : { subjectId: Object.freeze({ ...mapping.authority.subjectId }) }
23
+ }),
24
+ ...mapping.d1 === void 0 ? {} : { d1: Object.freeze({ ...mapping.d1 }) }
25
+ }) });
26
+ /** @internal */
27
+ const phoneProofs = (mapping) => mapping[proofMapping];
28
+ const requiredPhoneConstraints = {
29
+ subject: "unique(id)",
30
+ identifier: "unique(namespace,value)",
31
+ credential: "unique(credentialId)",
32
+ state: "unique(scope)"
33
+ };
34
+ /** Bundle phone storage, admission, and lookup with overridable crypto and hook defaults. */
35
+ const phonePersistenceLayer = (services) => Layer.unwrap(Effect.map(services, (value) => Layer.mergeAll(Layer.succeed(PhonePersistence, value.phonePersistence), Layer.succeed(PhoneAdmission, value.phoneAdmission), Layer.succeed(PhoneSignInTargets, value.phoneSignInTargets)))).pipe(Layer.provide([cryptoLayer, hooksLayer]));
36
+ //#endregion
37
+ export { phonePersistenceLayer, phoneProofCompletionMapping, phoneProofs, requiredPhoneConstraints };
38
+
39
+ //# sourceMappingURL=phone-model.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone-model.mjs","names":[],"sources":["../../src/drizzle/phone-model.ts"],"sourcesContent":["import { cryptoLayer, hooksLayer } from \"@yielded/auth/Persistence\";\nimport {\n type PhoneAdmissionPolicy,\n type PhoneLifecyclePolicy,\n type PhoneNumber,\n PhoneAdmission,\n PhonePersistence,\n PhoneSignInTargets,\n} from \"@yielded/auth/PhoneOtp\";\nimport type { SubjectId } from \"@yielded/auth/Schema\";\nimport type { AuthenticationRequirement } from \"@yielded/auth/Sessions\";\nimport type { InferInsertModel, InferSelectModel, SQL, Table } from \"drizzle-orm\";\nimport { Effect, Layer } from \"effect\";\n\nimport type { PersistenceMappingError } from \"./model\";\nimport type { AnyProofPersistenceMapping, ProofPersistenceMapping } from \"./proof-model\";\nconst proofMapping = Symbol(\"effect-auth/phone/proofs\");\n\n/** Opaque same-owner proof mapping. The builder preserves the consumer's table codecs. */\nexport interface PhoneProofCompletionMapping {\n readonly [proofMapping]: AnyProofPersistenceMapping;\n}\n\nexport const phoneProofCompletionMapping = <\n Rq extends Table,\n S extends Table,\n G extends Table,\n Cn extends Table,\n Rs extends Table,\n A extends Table,\n F extends Table,\n C extends Table,\n Sub extends Table,\n I extends Table,\n Cr extends Table,\n N,\n>(\n mapping: ProofPersistenceMapping<Rq, S, G, Cn, Rs, A, F, C, Sub, I, Cr, N>,\n): PhoneProofCompletionMapping =>\n Object.freeze({\n [proofMapping]: Object.freeze({\n ...mapping,\n request: Object.freeze({ ...mapping.request }),\n series: Object.freeze({ ...mapping.series }),\n generation: Object.freeze({ ...mapping.generation }),\n continuation: Object.freeze({ ...mapping.continuation }),\n rateScope: Object.freeze({ ...mapping.rateScope }),\n abuseEvent: Object.freeze({ ...mapping.abuseEvent }),\n failureEvent: Object.freeze({ ...mapping.failureEvent }),\n command: Object.freeze({ ...mapping.command }),\n constraints: Object.freeze({ ...mapping.constraints }),\n authority: Object.freeze({\n ...mapping.authority,\n identifier: Object.freeze({ ...mapping.authority.identifier }),\n ...(mapping.authority.subject === undefined\n ? {}\n : { subject: Object.freeze({ ...mapping.authority.subject }) }),\n ...(mapping.authority.credential === undefined\n ? {}\n : { credential: Object.freeze({ ...mapping.authority.credential }) }),\n ...(mapping.authority.subjectId === undefined\n ? {}\n : { subjectId: Object.freeze({ ...mapping.authority.subjectId }) }),\n }),\n ...(mapping.d1 === undefined ? {} : { d1: Object.freeze({ ...mapping.d1 }) }),\n }) as unknown as AnyProofPersistenceMapping,\n });\n\n/** @internal */\nexport const phoneProofs = (mapping: PhoneProofCompletionMapping) => mapping[proofMapping];\nexport type PhoneColumn<T extends Table> = Extract<keyof T[\"_\"][\"columns\"], string>;\nexport type PhoneMappingSource<M, R = never> = M | Effect.Effect<M, PersistenceMappingError, R>;\n\nexport const requiredPhoneConstraints = {\n subject: \"unique(id)\",\n identifier: \"unique(namespace,value)\",\n credential: \"unique(credentialId)\",\n state: \"unique(scope)\",\n} as const;\n\n/** Consumer-owned schema; encoders and allocators are synchronous and side-effect free.\n * State stores permanent number custody and command tombstones, plus bounded admission\n * counters. Never delete custody rows to make a recycled number eligible. A consumer's\n * explicit recovery workflow may resolve custody only after independent authentication.\n * Subject defaults own account provisioning; no email/profile schema is prescribed. */\nexport interface PhoneMapping<\n S extends Table,\n I extends Table,\n C extends Table,\n T extends Table,\n N,\n> {\n readonly moduleId: string;\n readonly policy: PhoneLifecyclePolicy;\n readonly admission: PhoneAdmissionPolicy;\n readonly constraints: typeof requiredPhoneConstraints;\n readonly proofs: PhoneProofCompletionMapping;\n readonly subjectIds: {\n readonly toNative: (id: SubjectId) => N;\n readonly toSubject: (id: N) => SubjectId;\n readonly allocate: () => N;\n };\n readonly subject: {\n readonly table: S;\n readonly id: PhoneColumn<S>;\n readonly securityRevision: PhoneColumn<S>;\n readonly activeCondition: SQL;\n readonly decodeRequirement: (row: InferSelectModel<S>) => AuthenticationRequirement;\n /** Current action policy, independently from primary sign-in assurance. */\n readonly decodeActionRequirement?: (\n row: InferSelectModel<S>,\n action: \"verify\" | \"change\",\n ) => AuthenticationRequirement;\n readonly encodeInsert: (input: {\n readonly id: N;\n readonly securityRevision: string;\n readonly phoneNumber: PhoneNumber;\n }) => InferInsertModel<S>;\n };\n readonly identifier: {\n readonly table: I;\n readonly namespace: PhoneColumn<I>;\n readonly value: PhoneColumn<I>;\n readonly subjectId: PhoneColumn<I>;\n readonly revision: PhoneColumn<I>;\n readonly verifiedAt: PhoneColumn<I>;\n readonly status: PhoneColumn<I>;\n readonly activeCondition: SQL;\n readonly encodeStatus: (active: boolean) => unknown;\n readonly encodeInsert: (input: {\n readonly phoneNumber: PhoneNumber;\n readonly subjectId: N;\n readonly revision: string;\n readonly verifiedAtMillis: number;\n readonly active: boolean;\n }) => InferInsertModel<I>;\n };\n readonly credential: {\n readonly table: C;\n readonly id: PhoneColumn<C>;\n readonly subjectId: PhoneColumn<C>;\n readonly revision: PhoneColumn<C>;\n readonly status: PhoneColumn<C>;\n readonly activeCondition: SQL;\n readonly encodeStatus: (active: boolean) => unknown;\n readonly encodeInsert: (input: {\n readonly credentialId: string;\n readonly subjectId: N;\n readonly revision: string;\n readonly active: boolean;\n }) => InferInsertModel<C>;\n };\n readonly state: {\n readonly table: T;\n readonly scope: PhoneColumn<T>;\n readonly state: PhoneColumn<T>;\n readonly version: PhoneColumn<T>;\n readonly encodeInsert: (input: {\n readonly scope: string;\n readonly state: string;\n readonly version: string;\n }) => InferInsertModel<T>;\n };\n readonly encodeInstant: (millis: number) => unknown;\n readonly engineNowMillis: SQL;\n}\n\nexport interface D1PhoneMapping {\n readonly d1: { readonly primary: true };\n}\n\nexport interface PhonePersistenceServices {\n readonly phonePersistence: PhonePersistence[\"Service\"];\n readonly phoneAdmission: PhoneAdmission[\"Service\"];\n readonly phoneSignInTargets: PhoneSignInTargets[\"Service\"];\n}\n\n/** Bundle phone storage, admission, and lookup with overridable crypto and hook defaults. */\nexport const phonePersistenceLayer = <E, R>(\n services: Effect.Effect<PhonePersistenceServices, E, R>,\n) =>\n Layer.unwrap(\n Effect.map(services, (value) =>\n Layer.mergeAll(\n Layer.succeed(PhonePersistence, value.phonePersistence),\n Layer.succeed(PhoneAdmission, value.phoneAdmission),\n Layer.succeed(PhoneSignInTargets, value.phoneSignInTargets),\n ),\n ),\n ).pipe(Layer.provide([cryptoLayer, hooksLayer]));\n"],"mappings":";;;;AAgBA,MAAM,eAAe,OAAO,0BAA0B;AAOtD,MAAa,+BAcX,YAEA,OAAO,OAAO,GACX,eAAe,OAAO,OAAO;CAC5B,GAAG;CACH,SAAS,OAAO,OAAO,EAAE,GAAG,QAAQ,QAAQ,CAAC;CAC7C,QAAQ,OAAO,OAAO,EAAE,GAAG,QAAQ,OAAO,CAAC;CAC3C,YAAY,OAAO,OAAO,EAAE,GAAG,QAAQ,WAAW,CAAC;CACnD,cAAc,OAAO,OAAO,EAAE,GAAG,QAAQ,aAAa,CAAC;CACvD,WAAW,OAAO,OAAO,EAAE,GAAG,QAAQ,UAAU,CAAC;CACjD,YAAY,OAAO,OAAO,EAAE,GAAG,QAAQ,WAAW,CAAC;CACnD,cAAc,OAAO,OAAO,EAAE,GAAG,QAAQ,aAAa,CAAC;CACvD,SAAS,OAAO,OAAO,EAAE,GAAG,QAAQ,QAAQ,CAAC;CAC7C,aAAa,OAAO,OAAO,EAAE,GAAG,QAAQ,YAAY,CAAC;CACrD,WAAW,OAAO,OAAO;EACvB,GAAG,QAAQ;EACX,YAAY,OAAO,OAAO,EAAE,GAAG,QAAQ,UAAU,WAAW,CAAC;EAC7D,GAAI,QAAQ,UAAU,YAAY,KAAA,IAC9B,CAAC,IACD,EAAE,SAAS,OAAO,OAAO,EAAE,GAAG,QAAQ,UAAU,QAAQ,CAAC,EAAE;EAC/D,GAAI,QAAQ,UAAU,eAAe,KAAA,IACjC,CAAC,IACD,EAAE,YAAY,OAAO,OAAO,EAAE,GAAG,QAAQ,UAAU,WAAW,CAAC,EAAE;EACrE,GAAI,QAAQ,UAAU,cAAc,KAAA,IAChC,CAAC,IACD,EAAE,WAAW,OAAO,OAAO,EAAE,GAAG,QAAQ,UAAU,UAAU,CAAC,EAAE;CACrE,CAAC;CACD,GAAI,QAAQ,OAAO,KAAA,IAAY,CAAC,IAAI,EAAE,IAAI,OAAO,OAAO,EAAE,GAAG,QAAQ,GAAG,CAAC,EAAE;AAC7E,CAAC,EACH,CAAC;;AAGH,MAAa,eAAe,YAAyC,QAAQ;AAI7E,MAAa,2BAA2B;CACtC,SAAS;CACT,YAAY;CACZ,YAAY;CACZ,OAAO;AACT;;AAoGA,MAAa,yBACX,aAEA,MAAM,OACJ,OAAO,IAAI,WAAW,UACpB,MAAM,SACJ,MAAM,QAAQ,kBAAkB,MAAM,gBAAgB,GACtD,MAAM,QAAQ,gBAAgB,MAAM,cAAc,GAClD,MAAM,QAAQ,oBAAoB,MAAM,kBAAkB,CAC5D,CACF,CACF,CAAC,CAAC,KAAK,MAAM,QAAQ,CAAC,aAAa,UAAU,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { CurrentPhoneTransaction, makePhoneKernel } from "../internal/phone-kernel.mjs";
2
+ import { drizzleQueryOperations } from "./query-operations.mjs";
3
+ import { both, makeTransactionRows } from "./transaction-owner.mjs";
4
+ //#region src/drizzle/phone-state.ts
5
+ const { unavailable, equal, copiedRow, col, capturePhone, lookupPhone, admitPhone, preparePhoneMutation, cleanupPhoneAdmission } = makePhoneKernel(drizzleQueryOperations, {
6
+ both,
7
+ makeTransactionRows
8
+ });
9
+ const invariant = makePhoneKernel(drizzleQueryOperations, {
10
+ both,
11
+ makeTransactionRows
12
+ }).invariant;
13
+ //#endregion
14
+ export { CurrentPhoneTransaction, admitPhone, capturePhone, cleanupPhoneAdmission, equal, invariant, lookupPhone, preparePhoneMutation, unavailable };
15
+
16
+ //# sourceMappingURL=phone-state.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone-state.mjs","names":[],"sources":["../../src/drizzle/phone-state.ts"],"sourcesContent":["import { makePhoneKernel } from \"../internal/phone-kernel\";\nimport { drizzleQueryOperations } from \"./query-operations\";\nimport { both, makeTransactionRows } from \"./transaction-owner\";\nexport { CurrentPhoneTransaction } from \"../internal/phone-kernel\";\n\nexport const {\n unavailable,\n equal,\n copiedRow,\n col,\n capturePhone,\n lookupPhone,\n admitPhone,\n preparePhoneMutation,\n cleanupPhoneAdmission,\n} = makePhoneKernel(drizzleQueryOperations, { both, makeTransactionRows });\n\nexport const invariant: (value: unknown) => asserts value = makePhoneKernel(\n drizzleQueryOperations,\n { both, makeTransactionRows },\n).invariant;\n"],"mappings":";;;;AAKA,MAAa,EACX,aACA,OACA,WACA,KACA,cACA,aACA,YACA,sBACA,0BACE,gBAAgB,wBAAwB;CAAE;CAAM;AAAoB,CAAC;AAEzE,MAAa,YAA+C,gBAC1D,wBACA;CAAE;CAAM;AAAoB,CAC9B,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { PersistenceMappingError } from "../internal/mapping-error.mjs";
2
+ import "./model.mjs";
3
+ import "./transaction-owner.mjs";
4
+ import { TransactionCoordinatorError } from "../internal/transaction-execution-kernel.mjs";
5
+ import "./transaction-execution.mjs";
6
+ import "./phone-model.mjs";
7
+ import "./SuppliedService.mjs";
8
+ import { Effect } from "effect";
9
+ import { LifecycleHooks } from "@yielded/auth/Hooks";
10
+ import { PhoneAdmission, PhoneConfigurationError, PhoneOtpUnavailable, PhonePersistence, PhoneSignInTargets } from "@yielded/auth/PhoneOtp";
11
+ import { Table } from "drizzle-orm";
12
+ import { Statement } from "effect/unstable/sql/Statement";
13
+ //#region src/drizzle/phone-target.d.ts
14
+ type PhoneCoordinatorError<E> = TransactionCoordinatorError<E, PhoneOtpUnavailable> | PhoneConfigurationError | PersistenceMappingError;
15
+ //#endregion
16
+ export { PhoneCoordinatorError };
17
+ //# sourceMappingURL=phone-target.d.mts.map