@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,422 @@
1
+ /* oxlint-disable no-explicit-any -- existing mapped-row bridge; public adapters preserve table, ID, and Effect types. */
2
+
3
+ import {
4
+ PasskeyCredentialSummary,
5
+ PasskeyRemoved,
6
+ type PasskeyManagementPersistence,
7
+ } from "@yielded/auth/Passkey";
8
+ import type { SQL } from "drizzle-orm";
9
+ import { Effect, Schema } from "effect";
10
+
11
+ import type { PersistenceMappingError } from "../mapping-error";
12
+ import type { QueryOperations } from "../query-operations";
13
+ import type { makeTransactionKernel } from "../transaction-kernel";
14
+ import type { makePasskeyAdmissionKernel } from "./admission";
15
+ import type { makePasskeyCredentialsKernel } from "./credentials";
16
+ import { CurrentPasskeyTransaction } from "./state";
17
+ import type { makePasskeyStateKernel } from "./state";
18
+ import type { WriteSubject, makePasskeyWriteStateKernel } from "./write-state";
19
+
20
+ type Port = PasskeyManagementPersistence["Service"];
21
+
22
+ export const makePasskeyManagementKernel = (
23
+ operations: QueryOperations,
24
+ admission: Pick<ReturnType<typeof makePasskeyAdmissionKernel>, "lockAdmission">,
25
+ credentials: Pick<
26
+ ReturnType<typeof makePasskeyCredentialsKernel>,
27
+ "readModule" | "readPolicyGuards"
28
+ >,
29
+ state: Pick<
30
+ ReturnType<typeof makePasskeyStateKernel>,
31
+ "credentialKey" | "copiedRow" | "equal" | "invariant" | "sameCredential" | "sameRevision"
32
+ >,
33
+ writeState: Pick<
34
+ ReturnType<typeof makePasskeyWriteStateKernel>,
35
+ | "authorizeAction"
36
+ | "credentialRows"
37
+ | "currentSubject"
38
+ | "invalidate"
39
+ | "invalidationMatches"
40
+ | "jsonStorage"
41
+ | "managementPolicy"
42
+ | "metadataAllowed"
43
+ | "ownedCredential"
44
+ | "removeDigest"
45
+ | "summary"
46
+ >,
47
+ transactions: Pick<ReturnType<typeof makeTransactionKernel>, "both">,
48
+ ) => {
49
+ const { sql } = operations;
50
+ const { lockAdmission } = admission;
51
+ const { readModule, readPolicyGuards } = credentials;
52
+ const { credentialKey, copiedRow, equal, sameCredential, sameRevision } = state;
53
+ const invariant: (value: unknown) => asserts value = state.invariant;
54
+
55
+ const {
56
+ authorizeAction,
57
+ credentialRows,
58
+ currentSubject,
59
+ invalidate,
60
+ invalidationMatches,
61
+ jsonStorage,
62
+ managementPolicy,
63
+ metadataAllowed,
64
+ ownedCredential,
65
+ removeDigest,
66
+ summary,
67
+ } = writeState;
68
+
69
+ const { both } = transactions;
70
+
71
+ const decisionCodec = jsonStorage(
72
+ Schema.Union([
73
+ Schema.TaggedStruct("Renamed", { credential: PasskeyCredentialSummary }),
74
+ Schema.TaggedStruct("Removed", { result: PasskeyRemoved }),
75
+ ]),
76
+ );
77
+
78
+ const intentCodec = jsonStorage(
79
+ Schema.Struct({
80
+ operation: Schema.Literals(["rename", "remove"]),
81
+ credentialId: Schema.String,
82
+ name: Schema.optionalKey(Schema.String),
83
+ }),
84
+ );
85
+
86
+ const command = Effect.fn("passkey.managementCommand")(function* (
87
+ mapping: any,
88
+ subject: WriteSubject,
89
+ commandId: string,
90
+ credentialId: string,
91
+ intent: string,
92
+ ) {
93
+ const owner = yield* CurrentPasskeyTransaction;
94
+ const table = mapping.command;
95
+
96
+ const observation = yield* owner.read(
97
+ table.table,
98
+ equal(table.table, { [table.moduleId]: mapping.moduleId, [table.commandId]: commandId }),
99
+ { limit: 1 },
100
+ );
101
+
102
+ const row = observation.rows[0];
103
+
104
+ if (row === undefined) return { _tag: "New", observation } as const;
105
+ if (
106
+ !mapping.read.subjectIds.equals(row[table.subjectId], subject.nativeId) ||
107
+ row[table.credentialId] !== credentialId ||
108
+ row[table.intent] !== intent
109
+ )
110
+ return { _tag: "Rejected" } as const;
111
+
112
+ return { _tag: "Replay", decision: decisionCodec.decode(row[table.decision]) } as const;
113
+ });
114
+
115
+ const record = Effect.fn("passkey.recordManagementCommand")(function* (
116
+ mapping: any,
117
+ subject: WriteSubject,
118
+ commandId: string,
119
+ credentialId: string,
120
+ intent: string,
121
+ decision: Parameters<typeof decisionCodec.encode>[0],
122
+ retentionUntilMillis: number,
123
+ observation: any,
124
+ ) {
125
+ const owner = yield* CurrentPasskeyTransaction;
126
+ const table = mapping.command;
127
+
128
+ const inserted = yield* owner.insert(
129
+ table.table,
130
+ {
131
+ ...table.encodeInsert({
132
+ moduleId: mapping.moduleId,
133
+ subjectId: subject.nativeId,
134
+ commandId,
135
+ credentialId,
136
+ }),
137
+ [table.moduleId]: mapping.moduleId,
138
+ [table.commandId]: commandId,
139
+ [table.subjectId]: subject.nativeId,
140
+ [table.credentialId]: credentialId,
141
+ [table.intent]: intent,
142
+ [table.decision]: decisionCodec.encode(decision),
143
+ [table.retentionUntil]: mapping.clock.encodeInstant(retentionUntilMillis),
144
+ [table.version]: owner.marker,
145
+ },
146
+ { [table.moduleId]: mapping.moduleId, [table.commandId]: commandId },
147
+ );
148
+
149
+ observation.rows = inserted.rows;
150
+ });
151
+
152
+ const access = Effect.fn("passkey.managementAccess")(function* (
153
+ mapping: any,
154
+ moduleId: string,
155
+ subjectId: Parameters<Port["list"]>[0]["subjectId"],
156
+ mutation: boolean,
157
+ ) {
158
+ if (moduleId !== mapping.moduleId || (yield* readModule(mapping)) === undefined)
159
+ return undefined;
160
+ if (mutation) yield* lockAdmission(mapping);
161
+ const subject = yield* currentSubject(mapping, subjectId);
162
+
163
+ if (subject === undefined) return undefined;
164
+ yield* readPolicyGuards(mapping);
165
+
166
+ return (yield* metadataAllowed(mapping, subject)) ? subject : undefined;
167
+ });
168
+
169
+ const listCredentials = Effect.fn("passkey.listCredentials")(function* (
170
+ mapping: any,
171
+ input: Parameters<Port["list"]>[0],
172
+ ) {
173
+ const subject = yield* access(mapping, input.moduleId, input.subjectId, false);
174
+
175
+ invariant(subject !== undefined);
176
+ const rows = [...(yield* credentialRows(mapping, subject))];
177
+
178
+ rows.sort((left, right) => {
179
+ const a = left[mapping.read.credential.credentialId],
180
+ b = right[mapping.read.credential.credentialId];
181
+
182
+ return a < b ? -1 : a > b ? 1 : 0;
183
+ });
184
+
185
+ const eligible = rows.filter(
186
+ (row) =>
187
+ input.cursor === undefined || row[mapping.read.credential.credentialId] > input.cursor,
188
+ );
189
+
190
+ const page = eligible.slice(0, input.limit);
191
+ const credentials = [];
192
+
193
+ for (const row of page) {
194
+ invariant((yield* ownedCredential(mapping, subject, row)) !== undefined);
195
+ credentials.push(summary(mapping, row));
196
+ }
197
+
198
+ return {
199
+ credentials,
200
+ ...(eligible.length > input.limit ? { cursor: credentials.at(-1)!.credentialId } : {}),
201
+ };
202
+ });
203
+
204
+ const renameCredential = Effect.fn("passkey.renameCredential")(function* (
205
+ mapping: any,
206
+ input: Parameters<Port["rename"]>[0],
207
+ ) {
208
+ const subject = yield* access(mapping, input.moduleId, input.subjectId, true);
209
+
210
+ if (subject === undefined) return { _tag: "Rejected" } as const;
211
+
212
+ const intent = intentCodec.encode({
213
+ operation: "rename",
214
+ credentialId: input.credentialId,
215
+ name: input.name,
216
+ });
217
+
218
+ const prior = yield* command(mapping, subject, input.commandId, input.credentialId, intent);
219
+
220
+ if (prior._tag === "Rejected") return prior;
221
+ const rows = yield* credentialRows(mapping, subject);
222
+
223
+ const row = rows.find(
224
+ (item) => item[mapping.read.credential.credentialId] === input.credentialId,
225
+ );
226
+
227
+ if (row === undefined || (yield* ownedCredential(mapping, subject, row)) === undefined)
228
+ return { _tag: "Rejected" } as const;
229
+ if (prior._tag === "Replay")
230
+ return prior.decision._tag === "Renamed"
231
+ ? { ...prior.decision, replayed: true }
232
+ : ({ _tag: "Rejected" } as const);
233
+ const owner = yield* CurrentPasskeyTransaction;
234
+ const table = mapping.read.credential;
235
+
236
+ yield* owner.update(
237
+ table.table,
238
+ { [table.credentialId]: input.credentialId, [table.subjectId]: subject.nativeId },
239
+ { [mapping.write.credential.name]: input.name },
240
+ );
241
+ const credential = summary(mapping, { ...row, [mapping.write.credential.name]: input.name });
242
+
243
+ yield* record(
244
+ mapping,
245
+ subject,
246
+ input.commandId,
247
+ input.credentialId,
248
+ intent,
249
+ { _tag: "Renamed", credential },
250
+ input.retentionUntilMillis,
251
+ prior.observation,
252
+ );
253
+
254
+ return { _tag: "Renamed", credential, replayed: false } as const;
255
+ });
256
+
257
+ const inspectRemove = Effect.fn("passkey.inspectRemove")(function* (
258
+ mapping: any,
259
+ input: Parameters<Port["inspectRemove"]>[0],
260
+ ) {
261
+ const subject = yield* access(mapping, input.moduleId, input.subjectId, false);
262
+
263
+ if (subject === undefined) return { _tag: "Rejected" } as const;
264
+
265
+ const prior = yield* command(
266
+ mapping,
267
+ subject,
268
+ input.commandId,
269
+ input.credentialId,
270
+ intentCodec.encode({ operation: "remove", credentialId: input.credentialId }),
271
+ );
272
+
273
+ if (prior._tag === "Rejected") return prior;
274
+ if (prior._tag === "Replay")
275
+ return prior.decision._tag === "Removed"
276
+ ? ({ _tag: "Replay", result: { ...prior.decision.result, replayed: true } } as const)
277
+ : ({ _tag: "Rejected" } as const);
278
+
279
+ const row = (yield* credentialRows(mapping, subject)).find(
280
+ (item) => item[mapping.read.credential.credentialId] === input.credentialId,
281
+ );
282
+
283
+ const credential =
284
+ row === undefined ? undefined : yield* ownedCredential(mapping, subject, row);
285
+
286
+ return credential === undefined
287
+ ? ({ _tag: "Rejected" } as const)
288
+ : ({ _tag: "Target", credential } as const);
289
+ });
290
+
291
+ const removeCredential = Effect.fn("passkey.removeCredential")(function* (
292
+ mapping: any,
293
+ input: Parameters<Port["remove"]>[0],
294
+ ) {
295
+ const subject = yield* access(
296
+ mapping,
297
+ input.moduleId,
298
+ input.credential.revision.subjectId,
299
+ true,
300
+ );
301
+
302
+ if (subject === undefined) return { _tag: "Rejected" } as const;
303
+ const id = input.credential.credentialId;
304
+ const intent = intentCodec.encode({ operation: "remove", credentialId: id });
305
+ const prior = yield* command(mapping, subject, input.commandId, id, intent);
306
+
307
+ if (prior._tag === "Rejected") return prior;
308
+ if (prior._tag === "Replay")
309
+ return prior.decision._tag === "Removed"
310
+ ? ({ _tag: "Removed", result: { ...prior.decision.result, replayed: true } } as const)
311
+ : ({ _tag: "Rejected" } as const);
312
+
313
+ const row = (yield* credentialRows(mapping, subject)).find(
314
+ (item) => item[mapping.read.credential.credentialId] === id,
315
+ );
316
+
317
+ const credential =
318
+ row === undefined ? undefined : yield* ownedCredential(mapping, subject, row);
319
+
320
+ const policy = managementPolicy(mapping, subject);
321
+
322
+ if (
323
+ credential === undefined ||
324
+ !sameCredential(input.credential, credential) ||
325
+ !sameRevision(input.credential.revision, credential.revision) ||
326
+ !invalidationMatches(mapping, input.invalidation, policy) ||
327
+ !invalidationMatches(mapping, input.invalidation, input.management)
328
+ )
329
+ return { _tag: "Rejected" } as const;
330
+ if (
331
+ !(yield* authorizeAction(
332
+ mapping,
333
+ subject,
334
+ input.authorization,
335
+ {
336
+ action: "remove",
337
+ commandId: input.commandId,
338
+ flowId: input.commandId,
339
+ bindingDigest: removeDigest(mapping.moduleId, input.commandId, input.credential),
340
+ revision: input.credential.revision,
341
+ },
342
+ {
343
+ ...policy,
344
+ maximumEvidenceAgeMillis: Math.min(
345
+ policy.maximumEvidenceAgeMillis,
346
+ input.management.maximumEvidenceAgeMillis,
347
+ ),
348
+ },
349
+ ))
350
+ )
351
+ return { _tag: "Rejected" } as const;
352
+ const owner = yield* CurrentPasskeyTransaction;
353
+
354
+ const remainingEffect: Effect.Effect<SQL, PersistenceMappingError> =
355
+ mapping.write.policy.remainingSignIn(subject.nativeId, id, copiedRow(subject.row));
356
+
357
+ const remaining = yield* remainingEffect;
358
+
359
+ if (!(yield* owner.check(remaining))) return { _tag: "LastSignInMethod" } as const;
360
+ const read = mapping.read;
361
+ const table = read.credential;
362
+
363
+ yield* owner.update(
364
+ table.table,
365
+ { [table.credentialId]: id, [table.subjectId]: subject.nativeId },
366
+ {
367
+ [table.status]: mapping.write.credential.removedStatus,
368
+ [table.credentialRevision]: owner.marker,
369
+ },
370
+ );
371
+ const factor = read.authority;
372
+
373
+ yield* owner.update(
374
+ factor.table,
375
+ { [factor.subjectId]: subject.nativeId, [factor.credentialId]: id },
376
+ { [factor.status]: mapping.write.authority.removedStatus, [factor.revision]: owner.marker },
377
+ );
378
+ for (const observation of owner.observations) {
379
+ if (observation.table === table.table)
380
+ observation.rows = observation.rows.filter((item) => item[table.credentialId] !== id);
381
+ if (observation.table === factor.table)
382
+ observation.rows = observation.rows.filter((item) => item[factor.credentialId] !== id);
383
+ }
384
+ const tuple = read.credentialOwnership;
385
+
386
+ yield* owner.update(
387
+ tuple.table,
388
+ { [tuple.credentialKey]: credentialKey(credential.rpId, credential.protocolCredentialId) },
389
+ {
390
+ [tuple.state]: mapping.write.credentialOwnership.removedState,
391
+ [tuple.version]: owner.marker,
392
+ },
393
+ );
394
+ yield* invalidate(mapping, subject, input.invalidation);
395
+ owner.postconditions.push(
396
+ remaining,
397
+ sql`not exists(select 1 from ${table.table} where ${both(equal(table.table, { [table.credentialId]: id }), table.activeCondition)})`,
398
+ sql`not exists(select 1 from ${factor.table} where ${both(equal(factor.table, { [factor.subjectId]: subject.nativeId, [factor.credentialId]: id }), factor.activeCondition)})`,
399
+ );
400
+
401
+ const result = {
402
+ credentialId: credential.credentialId,
403
+ replayed: false,
404
+ invalidation: input.invalidation,
405
+ };
406
+
407
+ yield* record(
408
+ mapping,
409
+ subject,
410
+ input.commandId,
411
+ id,
412
+ intent,
413
+ { _tag: "Removed", result },
414
+ input.retentionUntilMillis,
415
+ prior.observation,
416
+ );
417
+
418
+ return { _tag: "Removed", result } as const;
419
+ });
420
+
421
+ return { listCredentials, renameCredential, inspectRemove, removeCredential };
422
+ };
@@ -0,0 +1,283 @@
1
+ /* oxlint-disable no-explicit-any -- existing mapped-row bridge; public adapters preserve table, ID, and Effect types. */
2
+
3
+ import {
4
+ PasskeyClaim,
5
+ type PasskeyAccess,
6
+ type PasskeyCeremony,
7
+ type PasskeyMethodPolicy,
8
+ snapshotPasskeySync,
9
+ } from "@yielded/auth/Passkey";
10
+ import { Effect } from "effect";
11
+
12
+ import type { QueryOperations } from "../query-operations";
13
+ import type { makeTransactionKernel } from "../transaction-kernel";
14
+ import type { makePasskeyAdmissionKernel } from "./admission";
15
+ import type { makePasskeyCredentialsKernel } from "./credentials";
16
+ import type { makePasskeyFlowKernel } from "./flow";
17
+ import type { makePasskeyRegistrationCustodyKernel } from "./registration-custody";
18
+ import { CurrentPasskeyTransaction } from "./state";
19
+ import type { makePasskeyStateKernel } from "./state";
20
+
21
+ export const makePasskeyRegistrationCeremonyKernel = (
22
+ operations: QueryOperations,
23
+ admission: Pick<
24
+ ReturnType<typeof makePasskeyAdmissionKernel>,
25
+ "admissionCondition" | "guardAdmission" | "guardChargeSet" | "lockAdmission" | "readCharges"
26
+ >,
27
+ credentials: Pick<
28
+ ReturnType<typeof makePasskeyCredentialsKernel>,
29
+ "readModule" | "readPolicyGuards"
30
+ >,
31
+ flow: Pick<
32
+ ReturnType<typeof makePasskeyFlowKernel>,
33
+ "compatiblePolicy" | "liveCondition" | "matchesAccess" | "readFlow" | "terminalFlow"
34
+ >,
35
+ registrationCustody: Pick<
36
+ ReturnType<typeof makePasskeyRegistrationCustodyKernel>,
37
+ "releaseRegistrationCustody"
38
+ >,
39
+ state: Pick<
40
+ ReturnType<typeof makePasskeyStateKernel>,
41
+ "ceremonyStorage" | "equal" | "handleKey" | "invariant" | "mappedColumns" | "policyStorage"
42
+ >,
43
+ transactions: Pick<ReturnType<typeof makeTransactionKernel>, "both">,
44
+ ) => {
45
+ const { sql } = operations;
46
+
47
+ const { admissionCondition, guardAdmission, guardChargeSet, lockAdmission, readCharges } =
48
+ admission;
49
+
50
+ const { readModule, readPolicyGuards } = credentials;
51
+ const { compatiblePolicy, liveCondition, matchesAccess, readFlow, terminalFlow } = flow;
52
+ const { releaseRegistrationCustody } = registrationCustody;
53
+ const { ceremonyStorage, equal, handleKey, mappedColumns, policyStorage } = state;
54
+ const invariant: (value: unknown) => asserts value = state.invariant;
55
+ const { both } = transactions;
56
+
57
+ /** The issuing registration authority owns the application value and reservation.
58
+ * This facet only compares its opaque custody and cannot issue or provision. */
59
+ const custody = Effect.fn("passkey.registrationCustody")(function* (
60
+ mapping: any,
61
+ ceremony: PasskeyCeremony,
62
+ pending: boolean,
63
+ ) {
64
+ const owner = yield* CurrentPasskeyTransaction;
65
+
66
+ invariant(ceremony.context._tag === "Registration");
67
+
68
+ const context = ceremony.context,
69
+ intent = mapping.intent,
70
+ handle = mapping.handle;
71
+
72
+ const identity = { [intent.moduleId]: mapping.moduleId, [intent.flowId]: ceremony.flowId };
73
+
74
+ const advisory = (yield* owner.read(intent.table, equal(intent.table, identity), {
75
+ limit: 1,
76
+ lock: false,
77
+ observe: false,
78
+ })).rows[0];
79
+
80
+ if (advisory === undefined) return false;
81
+ const hashedHandle = handleKey(ceremony.profile.rpId, context.userHandle);
82
+
83
+ const held = (yield* owner.read(
84
+ handle.table,
85
+ equal(handle.table, { [handle.handleKey]: hashedHandle }),
86
+ { limit: 1, columns: mappedColumns(handle) },
87
+ )).rows[0];
88
+
89
+ if (
90
+ held === undefined ||
91
+ !handle.isReservedState(held[handle.state]) ||
92
+ held[handle.handleKey] !== hashedHandle ||
93
+ held[handle.rpId] !== ceremony.profile.rpId ||
94
+ held[handle.userHandle] !== context.userHandle ||
95
+ held[handle.reservationId] !== advisory[intent.reservationId]
96
+ )
97
+ return false;
98
+ const heldCondition = sql`exists (select 1 from ${handle.table} where ${both(owner.exact(handle.table, held), handle.reservedCondition)})`;
99
+
100
+ if (!(yield* owner.check(heldCondition))) return false;
101
+
102
+ const row = (yield* owner.read(intent.table, equal(intent.table, identity), {
103
+ limit: 1,
104
+ columns: mappedColumns(intent),
105
+ })).rows[0];
106
+
107
+ if (
108
+ row === undefined ||
109
+ row[intent.commandId] !== ceremony.commandId ||
110
+ row[intent.fingerprint] !== context.fingerprint ||
111
+ row[intent.handleKey] !== hashedHandle ||
112
+ row[intent.reservationId] !== held[handle.reservationId] ||
113
+ row[intent.ceremonySnapshot] !== ceremonyStorage.encode(ceremony) ||
114
+ typeof row[intent.applicationSnapshot] !== "string" ||
115
+ new TextEncoder().encode(row[intent.applicationSnapshot]).length > 1048576 ||
116
+ (pending && !intent.isPendingState(row[intent.state]))
117
+ )
118
+ return false;
119
+ const condition = pending ? intent.pendingCondition : intent.custodyCondition;
120
+
121
+ if (
122
+ !(yield* owner.check(
123
+ sql`exists (select 1 from ${intent.table} where ${both(owner.exact(intent.table, row), condition)})`,
124
+ ))
125
+ )
126
+ return false;
127
+
128
+ return [
129
+ heldCondition,
130
+ sql`exists (select 1 from ${intent.table} where ${both(owner.exact(intent.table, row), condition)})`,
131
+ ];
132
+ });
133
+
134
+ const contextRegistration = Effect.fn("passkey.contextRegistration")(function* (
135
+ mapping: any,
136
+ access: PasskeyAccess,
137
+ ) {
138
+ const owner = yield* CurrentPasskeyTransaction;
139
+
140
+ if (access.moduleId !== mapping.moduleId) return undefined;
141
+ const current = yield* readModule(mapping);
142
+
143
+ if (current === undefined) return undefined;
144
+ yield* readPolicyGuards(mapping);
145
+ const table = mapping.flow;
146
+
147
+ const advisory = (yield* owner.read(
148
+ table.table,
149
+ equal(table.table, { [table.moduleId]: mapping.moduleId, [table.flowId]: access.flowId }),
150
+ { limit: 1, lock: false, observe: false },
151
+ )).rows[0];
152
+
153
+ if (advisory === undefined) return undefined;
154
+ const ceremony = ceremonyStorage.decode(advisory[table.snapshot]);
155
+
156
+ if (ceremony.purpose !== "registration" || !matchesAccess(ceremony, access)) return undefined;
157
+ const held = yield* custody(mapping, ceremony, true);
158
+
159
+ if (!held) return undefined;
160
+ const read = yield* readFlow(mapping, access.flowId);
161
+
162
+ if (
163
+ read === undefined ||
164
+ read.state !== "Pending" ||
165
+ ceremonyStorage.encode(read.ceremony) !== ceremonyStorage.encode(ceremony) ||
166
+ !compatiblePolicy(read.ceremony, read.policy, current) ||
167
+ !(yield* owner.check(liveCondition(mapping, ceremony)))
168
+ )
169
+ return undefined;
170
+ owner.postconditions.push(...held, liveCondition(mapping, ceremony));
171
+
172
+ return read.ceremony;
173
+ });
174
+
175
+ const claimRegistration = Effect.fn("passkey.claimRegistration")(function* (
176
+ mapping: any,
177
+ input: {
178
+ readonly access: PasskeyAccess;
179
+ readonly policy: PasskeyMethodPolicy;
180
+ readonly ceremony: PasskeyCeremony;
181
+ readonly claimId: string;
182
+ },
183
+ ) {
184
+ const owner = yield* CurrentPasskeyTransaction;
185
+ const current = yield* readModule(mapping);
186
+
187
+ if (current === undefined || input.access.moduleId !== mapping.moduleId)
188
+ return { _tag: "Rejected" } as const;
189
+ yield* lockAdmission(mapping);
190
+ yield* readPolicyGuards(mapping);
191
+ const held = yield* custody(mapping, input.ceremony, true);
192
+ const read = yield* readFlow(mapping, input.access.flowId);
193
+
194
+ if (
195
+ read === undefined ||
196
+ read.state !== "Pending" ||
197
+ !matchesAccess(read.ceremony, input.access)
198
+ )
199
+ return { _tag: "Rejected" } as const;
200
+ invariant(ceremonyStorage.encode(read.ceremony) === ceremonyStorage.encode(input.ceremony));
201
+ if (
202
+ !held ||
203
+ !compatiblePolicy(read.ceremony, read.policy, current) ||
204
+ policyStorage.encode(current) !== policyStorage.encode(input.policy) ||
205
+ !(yield* owner.check(liveCondition(mapping, read.ceremony))) ||
206
+ !(yield* owner.check(
207
+ admissionCondition(
208
+ mapping,
209
+ [read.policy, current],
210
+ read.ceremony,
211
+ undefined,
212
+ [],
213
+ false,
214
+ false,
215
+ ),
216
+ ))
217
+ ) {
218
+ if (held) yield* releaseRegistrationCustody(mapping, read.ceremony);
219
+ yield* terminalFlow(mapping, read, "Rejected");
220
+
221
+ return { _tag: "Rejected" } as const;
222
+ }
223
+ yield* readCharges(mapping, read.ceremony, read.policy, undefined);
224
+ const claimedAtMillis = yield* owner.now(mapping.clock);
225
+
226
+ const claim = snapshotPasskeySync(PasskeyClaim, {
227
+ ceremony: read.ceremony,
228
+ claimId: input.claimId,
229
+ claimedAtMillis,
230
+ claimExpiresAtMillis: Math.min(
231
+ claimedAtMillis + read.ceremony.claimLifetimeMillis,
232
+ read.ceremony.expiresAtMillis,
233
+ ),
234
+ });
235
+
236
+ const table = mapping.flow;
237
+
238
+ yield* owner.update(
239
+ table.table,
240
+ { [table.moduleId]: mapping.moduleId, [table.flowId]: read.ceremony.flowId },
241
+ {
242
+ [table.state]: table.states.Claimed,
243
+ [table.version]: owner.marker,
244
+ [table.claimId]: claim.claimId,
245
+ [table.claimedAt]: mapping.clock.encodeInstant(claim.claimedAtMillis),
246
+ [table.claimExpiresAt]: mapping.clock.encodeInstant(claim.claimExpiresAtMillis),
247
+ },
248
+ );
249
+ yield* guardChargeSet(mapping, read.ceremony, undefined);
250
+ yield* guardAdmission(mapping, [read.policy, current], read.ceremony, undefined);
251
+ owner.postconditions.push(...held, liveCondition(mapping, read.ceremony, claim));
252
+
253
+ return { _tag: "Claimed", claim } as const;
254
+ });
255
+
256
+ const settleRegistration = Effect.fn("passkey.settleRegistration")(function* (
257
+ mapping: any,
258
+ claim: PasskeyClaim,
259
+ outcome: "Rejected" | "Ambiguous",
260
+ ) {
261
+ yield* readModule(mapping);
262
+ yield* lockAdmission(mapping);
263
+ yield* readPolicyGuards(mapping);
264
+ const read = yield* readFlow(mapping, claim.ceremony.flowId);
265
+
266
+ if (
267
+ read === undefined ||
268
+ read.state !== "Claimed" ||
269
+ read.claim === undefined ||
270
+ read.claim.claimId !== claim.claimId ||
271
+ read.claim.claimedAtMillis !== claim.claimedAtMillis ||
272
+ read.claim.claimExpiresAtMillis !== claim.claimExpiresAtMillis ||
273
+ ceremonyStorage.encode(read.ceremony) !== ceremonyStorage.encode(claim.ceremony)
274
+ )
275
+ return "Rejected" as const;
276
+
277
+ if (outcome === "Rejected") yield* releaseRegistrationCustody(mapping, claim.ceremony);
278
+
279
+ return yield* terminalFlow(mapping, read, outcome);
280
+ });
281
+
282
+ return { contextRegistration, claimRegistration, settleRegistration };
283
+ };