@yielded/auth-persistence 0.1.0-beta.25 → 0.1.0-beta.26

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 (481) hide show
  1. package/README.md +6 -8
  2. package/dist/Adapter.d.mts +47 -33
  3. package/dist/Adapter.mjs +36 -23
  4. package/dist/OAuthPersistence.d.mts +35 -51
  5. package/dist/OAuthPersistence.mjs +60 -68
  6. package/dist/OAuthPersistence.mjs.map +1 -1
  7. package/dist/index.d.mts +2 -2
  8. package/dist/index.mjs +2 -2
  9. package/dist/internal/browser-login.d.mts +1 -1
  10. package/dist/internal/browser-login.mjs +29 -9
  11. package/dist/internal/browser-login.mjs.map +1 -1
  12. package/dist/internal/configuration.d.mts +13 -8
  13. package/dist/internal/configuration.mjs.map +1 -1
  14. package/dist/internal/crypto.d.mts +1 -0
  15. package/dist/internal/crypto.mjs +1 -1
  16. package/dist/internal/d1-planning.mjs +8 -0
  17. package/dist/internal/d1-planning.mjs.map +1 -0
  18. package/dist/internal/email-native-state.mjs +135 -0
  19. package/dist/internal/email-native-state.mjs.map +1 -0
  20. package/dist/internal/email-native.d.mts +17 -0
  21. package/dist/internal/email-native.mjs +245 -0
  22. package/dist/internal/email-native.mjs.map +1 -0
  23. package/dist/internal/email-policy.mjs +92 -0
  24. package/dist/internal/email-policy.mjs.map +1 -0
  25. package/dist/internal/email-registration-native.d.mts +38 -0
  26. package/dist/internal/email-registration-native.mjs +171 -0
  27. package/dist/internal/email-registration-native.mjs.map +1 -0
  28. package/dist/internal/models/email-model.d.mts +40 -104
  29. package/dist/internal/models/email-model.mjs +3 -5
  30. package/dist/internal/models/email-model.mjs.map +1 -1
  31. package/dist/internal/models/oauth-connected-model.d.mts +44 -213
  32. package/dist/internal/models/oauth-connected-model.mjs +6 -14
  33. package/dist/internal/models/oauth-connected-model.mjs.map +1 -1
  34. package/dist/internal/models/oauth-model.d.mts +95 -244
  35. package/dist/internal/models/oauth-model.mjs +28 -22
  36. package/dist/internal/models/oauth-model.mjs.map +1 -1
  37. package/dist/internal/models/passkey-model.d.mts +11 -147
  38. package/dist/internal/models/passkey-model.mjs +5 -24
  39. package/dist/internal/models/passkey-model.mjs.map +1 -1
  40. package/dist/internal/models/passkey-registration-ceremony-model.d.mts +5 -39
  41. package/dist/internal/models/passkey-write-model.d.mts +17 -75
  42. package/dist/internal/models/passkey-write-model.mjs +1 -7
  43. package/dist/internal/models/passkey-write-model.mjs.map +1 -1
  44. package/dist/internal/models/password-model.d.mts +14 -81
  45. package/dist/internal/models/password-model.mjs +1 -4
  46. package/dist/internal/models/password-model.mjs.map +1 -1
  47. package/dist/internal/models/phone-model.d.mts +86 -0
  48. package/dist/internal/models/phone-model.mjs +10 -0
  49. package/dist/internal/models/phone-model.mjs.map +1 -0
  50. package/dist/internal/models/proof-model.d.mts +43 -272
  51. package/dist/internal/models/proof-model.mjs +2 -10
  52. package/dist/internal/models/proof-model.mjs.map +1 -1
  53. package/dist/internal/models/session-model.d.mts +74 -93
  54. package/dist/internal/models/session-model.mjs +3 -11
  55. package/dist/internal/models/session-model.mjs.map +1 -1
  56. package/dist/internal/models/step-up-model.d.mts +12 -50
  57. package/dist/internal/models/step-up-model.mjs +2 -4
  58. package/dist/internal/models/step-up-model.mjs.map +1 -1
  59. package/dist/internal/models/totp-model.d.mts +76 -0
  60. package/dist/internal/models/totp-model.mjs +10 -0
  61. package/dist/internal/models/totp-model.mjs.map +1 -0
  62. package/dist/internal/native-sql-table.d.mts +21 -4
  63. package/dist/internal/native-sql-table.mjs +9 -5
  64. package/dist/internal/native-sql-table.mjs.map +1 -1
  65. package/dist/internal/oauth/native-accounts.d.mts +17 -0
  66. package/dist/internal/oauth/native-accounts.mjs +290 -0
  67. package/dist/internal/oauth/native-accounts.mjs.map +1 -0
  68. package/dist/internal/oauth/native-connected-state.d.mts +11 -0
  69. package/dist/internal/oauth/native-connected-state.mjs +146 -0
  70. package/dist/internal/oauth/native-connected-state.mjs.map +1 -0
  71. package/dist/internal/oauth/native-connected.d.mts +15 -0
  72. package/dist/internal/oauth/native-connected.mjs +462 -0
  73. package/dist/internal/oauth/native-connected.mjs.map +1 -0
  74. package/dist/internal/oauth/native-flow.mjs +138 -0
  75. package/dist/internal/oauth/native-flow.mjs.map +1 -0
  76. package/dist/internal/oauth/native-layers.d.mts +24 -0
  77. package/dist/internal/oauth/native-layers.mjs +13 -0
  78. package/dist/internal/oauth/native-layers.mjs.map +1 -0
  79. package/dist/internal/oauth/native-mutation.mjs +122 -0
  80. package/dist/internal/oauth/native-mutation.mjs.map +1 -0
  81. package/dist/internal/oauth/native-registration.d.mts +24 -0
  82. package/dist/internal/oauth/native-registration.mjs +328 -0
  83. package/dist/internal/oauth/native-registration.mjs.map +1 -0
  84. package/dist/internal/oauth/native-revocations.d.mts +17 -0
  85. package/dist/internal/oauth/native-revocations.mjs +106 -0
  86. package/dist/internal/oauth/native-revocations.mjs.map +1 -0
  87. package/dist/internal/oauth/native-sign-in.d.mts +17 -0
  88. package/dist/internal/oauth/native-sign-in.mjs +50 -0
  89. package/dist/internal/oauth/native-sign-in.mjs.map +1 -0
  90. package/dist/internal/oauth/native-state.d.mts +10 -0
  91. package/dist/internal/oauth/native-state.mjs +214 -0
  92. package/dist/internal/oauth/native-state.mjs.map +1 -0
  93. package/dist/internal/oauth/state.d.mts +10 -0
  94. package/dist/internal/oauth/state.mjs +3 -27
  95. package/dist/internal/oauth/state.mjs.map +1 -1
  96. package/dist/internal/passkey-actions.mjs +55 -0
  97. package/dist/internal/passkey-actions.mjs.map +1 -0
  98. package/dist/internal/passkey-inputs.mjs +73 -0
  99. package/dist/internal/passkey-inputs.mjs.map +1 -0
  100. package/dist/internal/passkey-managed.mjs +224 -0
  101. package/dist/internal/passkey-managed.mjs.map +1 -0
  102. package/dist/internal/passkey-native-ceremony.d.mts +35 -0
  103. package/dist/internal/passkey-native-ceremony.mjs +38 -0
  104. package/dist/internal/passkey-native-ceremony.mjs.map +1 -0
  105. package/dist/internal/passkey-native-flow.mjs +91 -0
  106. package/dist/internal/passkey-native-flow.mjs.map +1 -0
  107. package/dist/internal/passkey-native-registration.d.mts +10 -0
  108. package/dist/internal/passkey-native-registration.mjs +114 -0
  109. package/dist/internal/passkey-native-registration.mjs.map +1 -0
  110. package/dist/internal/passkey-native-state.d.mts +15 -0
  111. package/dist/internal/passkey-native-state.mjs +186 -0
  112. package/dist/internal/passkey-native-state.mjs.map +1 -0
  113. package/dist/internal/passkey-native-write.d.mts +82 -0
  114. package/dist/internal/passkey-native-write.mjs +330 -0
  115. package/dist/internal/passkey-native-write.mjs.map +1 -0
  116. package/dist/internal/passkey-native.d.mts +835 -0
  117. package/dist/internal/passkey-native.mjs +175 -0
  118. package/dist/internal/passkey-native.mjs.map +1 -0
  119. package/dist/internal/passkey-policy.mjs +115 -0
  120. package/dist/internal/passkey-policy.mjs.map +1 -0
  121. package/dist/internal/password-credentials.mjs +38 -9
  122. package/dist/internal/password-credentials.mjs.map +1 -1
  123. package/dist/internal/password-native.d.mts +14 -0
  124. package/dist/internal/password-native.mjs +292 -0
  125. package/dist/internal/password-native.mjs.map +1 -0
  126. package/dist/internal/password-policy.mjs +93 -0
  127. package/dist/internal/password-policy.mjs.map +1 -0
  128. package/dist/internal/password-registration-native.d.mts +22 -0
  129. package/dist/internal/password-registration-native.mjs +142 -0
  130. package/dist/internal/password-registration-native.mjs.map +1 -0
  131. package/dist/internal/persistence.d.mts +6 -19
  132. package/dist/internal/persistence.mjs +199 -166
  133. package/dist/internal/persistence.mjs.map +1 -1
  134. package/dist/internal/phone-composed.mjs +79 -0
  135. package/dist/internal/phone-composed.mjs.map +1 -0
  136. package/dist/internal/phone-native.d.mts +15 -0
  137. package/dist/internal/phone-native.mjs +354 -0
  138. package/dist/internal/phone-native.mjs.map +1 -0
  139. package/dist/internal/proof-native.d.mts +15 -0
  140. package/dist/internal/proof-native.mjs +289 -0
  141. package/dist/internal/proof-native.mjs.map +1 -0
  142. package/dist/internal/registration.mjs +50 -60
  143. package/dist/internal/registration.mjs.map +1 -1
  144. package/dist/internal/session-native-authority.d.mts +15 -0
  145. package/dist/internal/session-native-authority.mjs +91 -0
  146. package/dist/internal/session-native-authority.mjs.map +1 -0
  147. package/dist/internal/session-native-cleanup.d.mts +14 -0
  148. package/dist/internal/session-native-cleanup.mjs +48 -0
  149. package/dist/internal/session-native-cleanup.mjs.map +1 -0
  150. package/dist/internal/session-native-login.d.mts +15 -0
  151. package/dist/internal/session-native-login.mjs +87 -0
  152. package/dist/internal/session-native-login.mjs.map +1 -0
  153. package/dist/internal/session-native-pending-read.mjs +42 -0
  154. package/dist/internal/session-native-pending-read.mjs.map +1 -0
  155. package/dist/internal/session-native-pending.mjs +134 -0
  156. package/dist/internal/session-native-pending.mjs.map +1 -0
  157. package/dist/internal/session-native-record.mjs +79 -0
  158. package/dist/internal/session-native-record.mjs.map +1 -0
  159. package/dist/internal/session-native-state.mjs +130 -0
  160. package/dist/internal/session-native-state.mjs.map +1 -0
  161. package/dist/internal/session-native-stateful.d.mts +16 -0
  162. package/dist/internal/session-native-stateful.mjs +225 -0
  163. package/dist/internal/session-native-stateful.mjs.map +1 -0
  164. package/dist/internal/session-native-step-up.d.mts +15 -0
  165. package/dist/internal/session-native-step-up.mjs +212 -0
  166. package/dist/internal/session-native-step-up.mjs.map +1 -0
  167. package/dist/internal/session-native-validity.d.mts +15 -0
  168. package/dist/internal/session-native-validity.mjs +97 -0
  169. package/dist/internal/session-native-validity.mjs.map +1 -0
  170. package/dist/internal/session-policy.mjs +29 -0
  171. package/dist/internal/session-policy.mjs.map +1 -0
  172. package/dist/internal/sql-authority.d.mts +16 -0
  173. package/dist/internal/sql-authority.mjs +32 -0
  174. package/dist/internal/sql-authority.mjs.map +1 -0
  175. package/dist/internal/sql-change.mjs +21 -0
  176. package/dist/internal/sql-change.mjs.map +1 -0
  177. package/dist/internal/sql-cleanup.mjs +35 -0
  178. package/dist/internal/sql-cleanup.mjs.map +1 -0
  179. package/dist/internal/sql-commit.d.mts +72 -0
  180. package/dist/internal/sql-commit.mjs +176 -0
  181. package/dist/internal/sql-commit.mjs.map +1 -0
  182. package/dist/internal/sql-expression.d.mts +17 -0
  183. package/dist/internal/sql-expression.mjs +49 -0
  184. package/dist/internal/sql-expression.mjs.map +1 -0
  185. package/dist/internal/sql-oauth-connected-model.d.mts +7 -23
  186. package/dist/internal/sql-oauth-model.d.mts +27 -52
  187. package/dist/internal/sql-oauth-model.mjs +3 -4
  188. package/dist/internal/sql-oauth-model.mjs.map +1 -1
  189. package/dist/internal/sql-persistence.mjs +5 -9
  190. package/dist/internal/sql-persistence.mjs.map +1 -1
  191. package/dist/internal/sql-storage-validation.mjs +1 -2
  192. package/dist/internal/sql-storage-validation.mjs.map +1 -1
  193. package/dist/internal/sql-table.d.mts +3 -16
  194. package/dist/internal/sql-table.mjs +21 -42
  195. package/dist/internal/sql-table.mjs.map +1 -1
  196. package/dist/internal/standalone.mjs +2 -3
  197. package/dist/internal/standalone.mjs.map +1 -1
  198. package/dist/internal/step-up-state.mjs +5 -8
  199. package/dist/internal/step-up-state.mjs.map +1 -1
  200. package/dist/internal/storage-clock.mjs +44 -0
  201. package/dist/internal/storage-clock.mjs.map +1 -0
  202. package/dist/internal/storage-mapping.d.mts +11 -8
  203. package/dist/internal/storage-mapping.mjs +88 -302
  204. package/dist/internal/storage-mapping.mjs.map +1 -1
  205. package/dist/internal/storage-plans.mjs +15 -73
  206. package/dist/internal/storage-plans.mjs.map +1 -1
  207. package/dist/internal/storage-tables.d.mts +37 -520
  208. package/dist/internal/storage-tables.mjs +31 -211
  209. package/dist/internal/storage-tables.mjs.map +1 -1
  210. package/dist/internal/storage-validation.d.mts +1 -6
  211. package/dist/internal/storage-validation.mjs +1 -42
  212. package/dist/internal/storage-validation.mjs.map +1 -1
  213. package/dist/internal/table-model.d.mts +21 -0
  214. package/dist/internal/totp-native.d.mts +15 -0
  215. package/dist/internal/totp-native.mjs +401 -0
  216. package/dist/internal/totp-native.mjs.map +1 -0
  217. package/package.json +1 -1
  218. package/src/Adapter.ts +143 -199
  219. package/src/OAuthPersistence.ts +128 -271
  220. package/src/index.ts +1 -1
  221. package/src/internal/browser-login.ts +54 -24
  222. package/src/internal/configuration.ts +16 -31
  223. package/src/internal/d1-planning.ts +7 -0
  224. package/src/internal/email-native-state.ts +247 -0
  225. package/src/internal/email-native.ts +514 -0
  226. package/src/internal/email-policy.ts +235 -0
  227. package/src/internal/email-registration-native.ts +386 -0
  228. package/src/internal/models/email-model.ts +76 -214
  229. package/src/internal/models/oauth-connected-model.ts +50 -288
  230. package/src/internal/models/oauth-model.ts +147 -368
  231. package/src/internal/models/passkey-model.ts +11 -208
  232. package/src/internal/models/passkey-registration-ceremony-model.ts +6 -60
  233. package/src/internal/models/passkey-write-model.ts +14 -95
  234. package/src/internal/models/password-model.ts +26 -147
  235. package/src/internal/models/phone-model.ts +110 -0
  236. package/src/internal/models/proof-model.ts +48 -404
  237. package/src/internal/models/session-model.ts +102 -200
  238. package/src/internal/models/step-up-model.ts +17 -96
  239. package/src/internal/models/totp-model.ts +82 -0
  240. package/src/internal/native-sql-table.ts +32 -11
  241. package/src/internal/oauth/native-accounts.ts +576 -0
  242. package/src/internal/oauth/native-connected-state.ts +288 -0
  243. package/src/internal/oauth/native-connected.ts +888 -0
  244. package/src/internal/oauth/native-flow.ts +253 -0
  245. package/src/internal/oauth/native-layers.ts +83 -0
  246. package/src/internal/oauth/native-mutation.ts +222 -0
  247. package/src/internal/oauth/native-registration.ts +545 -0
  248. package/src/internal/oauth/native-revocations.ts +190 -0
  249. package/src/internal/oauth/native-sign-in.ts +111 -0
  250. package/src/internal/oauth/native-state.ts +346 -0
  251. package/src/internal/oauth/state.ts +2 -70
  252. package/src/internal/passkey-actions.ts +70 -0
  253. package/src/internal/passkey-inputs.ts +56 -0
  254. package/src/internal/passkey-managed.ts +360 -0
  255. package/src/internal/passkey-native-ceremony.ts +66 -0
  256. package/src/internal/passkey-native-flow.ts +140 -0
  257. package/src/internal/passkey-native-registration.ts +221 -0
  258. package/src/internal/passkey-native-state.ts +335 -0
  259. package/src/internal/passkey-native-write.ts +611 -0
  260. package/src/internal/passkey-native.ts +372 -0
  261. package/src/internal/passkey-policy.ts +246 -0
  262. package/src/internal/password-credentials.ts +52 -10
  263. package/src/internal/password-native.ts +571 -0
  264. package/src/internal/password-policy.ts +307 -0
  265. package/src/internal/password-registration-native.ts +322 -0
  266. package/src/internal/persistence.ts +336 -290
  267. package/src/internal/phone-composed.ts +86 -0
  268. package/src/internal/phone-native.ts +659 -0
  269. package/src/internal/proof-native.ts +448 -0
  270. package/src/internal/registration.ts +96 -143
  271. package/src/internal/session-native-authority.ts +247 -0
  272. package/src/internal/session-native-cleanup.ts +65 -0
  273. package/src/internal/session-native-login.ts +205 -0
  274. package/src/internal/session-native-pending-read.ts +68 -0
  275. package/src/internal/session-native-pending.ts +223 -0
  276. package/src/internal/session-native-record.ts +141 -0
  277. package/src/internal/session-native-state.ts +259 -0
  278. package/src/internal/session-native-stateful.ts +512 -0
  279. package/src/internal/session-native-step-up.ts +450 -0
  280. package/src/internal/session-native-validity.ts +208 -0
  281. package/src/internal/session-policy.ts +59 -0
  282. package/src/internal/sql-authority.ts +56 -0
  283. package/src/internal/sql-change.ts +38 -0
  284. package/src/internal/sql-cleanup.ts +56 -0
  285. package/src/internal/sql-commit.ts +435 -0
  286. package/src/internal/sql-expression.ts +94 -0
  287. package/src/internal/sql-metadata.ts +100 -0
  288. package/src/internal/sql-oauth-connected-model.ts +6 -95
  289. package/src/internal/sql-oauth-model.ts +31 -134
  290. package/src/internal/sql-persistence.ts +2 -6
  291. package/src/internal/sql-storage-validation.ts +1 -2
  292. package/src/internal/sql-table.ts +19 -52
  293. package/src/internal/standalone.ts +2 -11
  294. package/src/internal/step-up-state.ts +4 -17
  295. package/src/internal/storage-clock.ts +58 -0
  296. package/src/internal/storage-mapping.ts +125 -340
  297. package/src/internal/storage-plans.ts +14 -80
  298. package/src/internal/storage-tables.ts +28 -212
  299. package/src/internal/storage-validation.ts +0 -58
  300. package/src/internal/table-model.ts +24 -0
  301. package/src/internal/totp-native.ts +701 -0
  302. package/dist/internal/PasswordPreparedPostconditions.d.mts +0 -22
  303. package/dist/internal/PasswordPreparedPostconditions.mjs +0 -12
  304. package/dist/internal/PasswordPreparedPostconditions.mjs.map +0 -1
  305. package/dist/internal/authority-snapshot.mjs +0 -53
  306. package/dist/internal/authority-snapshot.mjs.map +0 -1
  307. package/dist/internal/email-kernel.d.mts +0 -276
  308. package/dist/internal/email-kernel.mjs +0 -497
  309. package/dist/internal/email-kernel.mjs.map +0 -1
  310. package/dist/internal/models/passkey-registration-ceremony-model.mjs +0 -18
  311. package/dist/internal/models/passkey-registration-ceremony-model.mjs.map +0 -1
  312. package/dist/internal/oauth/accounts.d.mts +0 -8
  313. package/dist/internal/oauth/accounts.mjs +0 -379
  314. package/dist/internal/oauth/accounts.mjs.map +0 -1
  315. package/dist/internal/oauth/connected-access.d.mts +0 -9
  316. package/dist/internal/oauth/connected-access.mjs +0 -229
  317. package/dist/internal/oauth/connected-access.mjs.map +0 -1
  318. package/dist/internal/oauth/connected-collection.d.mts +0 -7
  319. package/dist/internal/oauth/connected-collection.mjs +0 -214
  320. package/dist/internal/oauth/connected-collection.mjs.map +0 -1
  321. package/dist/internal/oauth/connected-custody.d.mts +0 -6
  322. package/dist/internal/oauth/connected-custody.mjs +0 -165
  323. package/dist/internal/oauth/connected-custody.mjs.map +0 -1
  324. package/dist/internal/oauth/connected-flow.d.mts +0 -7
  325. package/dist/internal/oauth/connected-flow.mjs +0 -324
  326. package/dist/internal/oauth/connected-flow.mjs.map +0 -1
  327. package/dist/internal/oauth/connected-input.mjs +0 -122
  328. package/dist/internal/oauth/connected-input.mjs.map +0 -1
  329. package/dist/internal/oauth/connected-keys.d.mts +0 -2
  330. package/dist/internal/oauth/connected-keys.mjs +0 -22
  331. package/dist/internal/oauth/connected-keys.mjs.map +0 -1
  332. package/dist/internal/oauth/connected-maintenance.d.mts +0 -9
  333. package/dist/internal/oauth/connected-maintenance.mjs +0 -226
  334. package/dist/internal/oauth/connected-maintenance.mjs.map +0 -1
  335. package/dist/internal/oauth/connected-management.d.mts +0 -9
  336. package/dist/internal/oauth/connected-management.mjs +0 -243
  337. package/dist/internal/oauth/connected-management.mjs.map +0 -1
  338. package/dist/internal/oauth/connected-reference.mjs +0 -63
  339. package/dist/internal/oauth/connected-reference.mjs.map +0 -1
  340. package/dist/internal/oauth/connected-settlement.d.mts +0 -8
  341. package/dist/internal/oauth/connected-settlement.mjs +0 -141
  342. package/dist/internal/oauth/connected-settlement.mjs.map +0 -1
  343. package/dist/internal/oauth/connected-sign-in.d.mts +0 -10
  344. package/dist/internal/oauth/connected-sign-in.mjs +0 -281
  345. package/dist/internal/oauth/connected-sign-in.mjs.map +0 -1
  346. package/dist/internal/oauth/connected-state.d.mts +0 -14
  347. package/dist/internal/oauth/connected-state.mjs +0 -469
  348. package/dist/internal/oauth/connected-state.mjs.map +0 -1
  349. package/dist/internal/oauth/connected-target.d.mts +0 -21
  350. package/dist/internal/oauth/connected-target.mjs +0 -117
  351. package/dist/internal/oauth/connected-target.mjs.map +0 -1
  352. package/dist/internal/oauth/flow.d.mts +0 -5
  353. package/dist/internal/oauth/flow.mjs +0 -279
  354. package/dist/internal/oauth/flow.mjs.map +0 -1
  355. package/dist/internal/oauth/input.mjs +0 -127
  356. package/dist/internal/oauth/input.mjs.map +0 -1
  357. package/dist/internal/oauth/owner.d.mts +0 -10
  358. package/dist/internal/oauth/owner.mjs +0 -10
  359. package/dist/internal/oauth/owner.mjs.map +0 -1
  360. package/dist/internal/oauth/query-compiler.d.mts +0 -7
  361. package/dist/internal/oauth/query-compiler.mjs +0 -9
  362. package/dist/internal/oauth/query-compiler.mjs.map +0 -1
  363. package/dist/internal/oauth/registration.d.mts +0 -7
  364. package/dist/internal/oauth/registration.mjs +0 -393
  365. package/dist/internal/oauth/registration.mjs.map +0 -1
  366. package/dist/internal/oauth/target.d.mts +0 -31
  367. package/dist/internal/oauth/target.mjs +0 -273
  368. package/dist/internal/oauth/target.mjs.map +0 -1
  369. package/dist/internal/oauth-kernel.d.mts +0 -1423
  370. package/dist/internal/oauth-kernel.mjs +0 -187
  371. package/dist/internal/oauth-kernel.mjs.map +0 -1
  372. package/dist/internal/passkey/admission.d.mts +0 -6
  373. package/dist/internal/passkey/admission.mjs +0 -220
  374. package/dist/internal/passkey/admission.mjs.map +0 -1
  375. package/dist/internal/passkey/credentials.d.mts +0 -14
  376. package/dist/internal/passkey/credentials.mjs +0 -249
  377. package/dist/internal/passkey/credentials.mjs.map +0 -1
  378. package/dist/internal/passkey/enrollment.mjs +0 -138
  379. package/dist/internal/passkey/enrollment.mjs.map +0 -1
  380. package/dist/internal/passkey/flow.d.mts +0 -21
  381. package/dist/internal/passkey/flow.mjs +0 -452
  382. package/dist/internal/passkey/flow.mjs.map +0 -1
  383. package/dist/internal/passkey/management.mjs +0 -231
  384. package/dist/internal/passkey/management.mjs.map +0 -1
  385. package/dist/internal/passkey/registration-ceremony.d.mts +0 -9
  386. package/dist/internal/passkey/registration-ceremony.mjs +0 -129
  387. package/dist/internal/passkey/registration-ceremony.mjs.map +0 -1
  388. package/dist/internal/passkey/registration-custody.d.mts +0 -2
  389. package/dist/internal/passkey/registration-custody.mjs +0 -52
  390. package/dist/internal/passkey/registration-custody.mjs.map +0 -1
  391. package/dist/internal/passkey/registration-write.mjs +0 -211
  392. package/dist/internal/passkey/registration-write.mjs.map +0 -1
  393. package/dist/internal/passkey/state.d.mts +0 -10
  394. package/dist/internal/passkey/state.mjs +0 -234
  395. package/dist/internal/passkey/state.mjs.map +0 -1
  396. package/dist/internal/passkey/target.d.mts +0 -20
  397. package/dist/internal/passkey/target.mjs +0 -200
  398. package/dist/internal/passkey/target.mjs.map +0 -1
  399. package/dist/internal/passkey/write-state.d.mts +0 -17
  400. package/dist/internal/passkey/write-state.mjs +0 -354
  401. package/dist/internal/passkey/write-state.mjs.map +0 -1
  402. package/dist/internal/passkey/write-target.mjs +0 -192
  403. package/dist/internal/passkey/write-target.mjs.map +0 -1
  404. package/dist/internal/passkey-kernel.d.mts +0 -6045
  405. package/dist/internal/passkey-kernel.mjs +0 -49
  406. package/dist/internal/passkey-kernel.mjs.map +0 -1
  407. package/dist/internal/passkeys.d.mts +0 -7
  408. package/dist/internal/passkeys.mjs +0 -387
  409. package/dist/internal/passkeys.mjs.map +0 -1
  410. package/dist/internal/password-credentials.d.mts +0 -11
  411. package/dist/internal/password-kernel.d.mts +0 -278
  412. package/dist/internal/password-kernel.mjs +0 -508
  413. package/dist/internal/password-kernel.mjs.map +0 -1
  414. package/dist/internal/phone-kernel.d.mts +0 -162
  415. package/dist/internal/phone-kernel.mjs +0 -437
  416. package/dist/internal/phone-kernel.mjs.map +0 -1
  417. package/dist/internal/proof-kernel.d.mts +0 -94
  418. package/dist/internal/proof-kernel.mjs +0 -624
  419. package/dist/internal/proof-kernel.mjs.map +0 -1
  420. package/dist/internal/query-operations.d.mts +0 -68
  421. package/dist/internal/session-kernel.d.mts +0 -62
  422. package/dist/internal/session-kernel.mjs +0 -820
  423. package/dist/internal/session-kernel.mjs.map +0 -1
  424. package/dist/internal/sql-oauth-connected-model.mjs +0 -7
  425. package/dist/internal/sql-oauth-connected-model.mjs.map +0 -1
  426. package/dist/internal/sql-query.d.mts +0 -12
  427. package/dist/internal/sql-query.mjs +0 -206
  428. package/dist/internal/sql-query.mjs.map +0 -1
  429. package/dist/internal/step-up-state.d.mts +0 -49
  430. package/dist/internal/transaction-execution-kernel.d.mts +0 -37
  431. package/dist/internal/transaction-execution-kernel.mjs +0 -120
  432. package/dist/internal/transaction-execution-kernel.mjs.map +0 -1
  433. package/dist/internal/transaction-kernel.d.mts +0 -81
  434. package/dist/internal/transaction-kernel.mjs +0 -264
  435. package/dist/internal/transaction-kernel.mjs.map +0 -1
  436. package/src/internal/PasswordPreparedPostconditions.ts +0 -30
  437. package/src/internal/authority-snapshot.ts +0 -91
  438. package/src/internal/email-kernel.ts +0 -1556
  439. package/src/internal/oauth/accounts.ts +0 -839
  440. package/src/internal/oauth/connected-access.ts +0 -388
  441. package/src/internal/oauth/connected-collection.ts +0 -345
  442. package/src/internal/oauth/connected-custody.ts +0 -308
  443. package/src/internal/oauth/connected-flow.ts +0 -562
  444. package/src/internal/oauth/connected-input.ts +0 -147
  445. package/src/internal/oauth/connected-keys.ts +0 -31
  446. package/src/internal/oauth/connected-maintenance.ts +0 -379
  447. package/src/internal/oauth/connected-management.ts +0 -391
  448. package/src/internal/oauth/connected-reference.ts +0 -135
  449. package/src/internal/oauth/connected-settlement.ts +0 -278
  450. package/src/internal/oauth/connected-sign-in.ts +0 -472
  451. package/src/internal/oauth/connected-state.ts +0 -924
  452. package/src/internal/oauth/connected-target.ts +0 -307
  453. package/src/internal/oauth/flow.ts +0 -505
  454. package/src/internal/oauth/input.ts +0 -201
  455. package/src/internal/oauth/owner.ts +0 -22
  456. package/src/internal/oauth/query-compiler.ts +0 -15
  457. package/src/internal/oauth/registration.ts +0 -676
  458. package/src/internal/oauth/target.ts +0 -803
  459. package/src/internal/oauth-kernel.ts +0 -294
  460. package/src/internal/passkey/admission.ts +0 -368
  461. package/src/internal/passkey/credentials.ts +0 -511
  462. package/src/internal/passkey/enrollment.ts +0 -326
  463. package/src/internal/passkey/flow.ts +0 -1062
  464. package/src/internal/passkey/management.ts +0 -426
  465. package/src/internal/passkey/registration-ceremony.ts +0 -283
  466. package/src/internal/passkey/registration-custody.ts +0 -91
  467. package/src/internal/passkey/registration-write.ts +0 -426
  468. package/src/internal/passkey/state.ts +0 -351
  469. package/src/internal/passkey/target.ts +0 -598
  470. package/src/internal/passkey/write-state.ts +0 -692
  471. package/src/internal/passkey/write-target.ts +0 -450
  472. package/src/internal/passkey-kernel.ts +0 -112
  473. package/src/internal/passkeys.ts +0 -652
  474. package/src/internal/password-kernel.ts +0 -1523
  475. package/src/internal/phone-kernel.ts +0 -872
  476. package/src/internal/proof-kernel.ts +0 -1992
  477. package/src/internal/query-operations.ts +0 -91
  478. package/src/internal/session-kernel.ts +0 -2406
  479. package/src/internal/sql-query.ts +0 -304
  480. package/src/internal/transaction-execution-kernel.ts +0 -335
  481. package/src/internal/transaction-kernel.ts +0 -603
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-model.mjs","names":[],"sources":["../../../src/internal/models/oauth-model.ts"],"sourcesContent":["import type { PreparedCommit } from \"@yielded/auth/Hooks\";\nimport type {\n OAuthActionAuthorization,\n OAuthAccountRevision,\n OAuthRegistrationIntent,\n OAuthCredentialSnapshot,\n OAuthExternalIdentity,\n OAuthRegistrationAccess,\n OAuthRegistrationInspection,\n OAuthUnavailable,\n OAuthCommandId,\n PrepareOAuthCommit,\n OAuthRegistrationDecision,\n OAuthCleanupInput,\n} from \"@yielded/auth/OAuth\";\nimport type { AuthenticationFactor } from \"@yielded/auth/Operations\";\nimport type { TokenDigest } from \"@yielded/auth/Schema\";\nimport type { AuthenticationRequirement, SecurityRevision } from \"@yielded/auth/Sessions\";\nimport type { Crypto, Effect, PlatformError } from \"effect\";\n\nimport type { TableModel as Table, SqlExpression } from \"../query-operations\";\nimport type { PersistenceMappingError, SubjectIdCodec } from \"./common\";\n\ntype Column<T extends Table> = T[\"column\"];\n\nexport type OAuthFlowState =\n | \"Pending\"\n | \"Claimed\"\n | \"Verified\"\n | \"RegistrationIssued\"\n | \"Linked\"\n | \"Cancelled\"\n | \"Rejected\"\n | \"Ambiguous\"\n | \"Conflict\";\n\nexport type OAuthTupleState = \"Unowned\" | \"Reserved\" | \"Owned\";\nexport type OAuthRegistrationState = \"Unbound\" | \"Registered\" | \"ProvisioningPending\" | \"Rejected\";\nexport type OAuthAction = OAuthActionAuthorization[\"challenge\"][\"action\"];\n\n/** The engine writes every critical column explicitly after applying the pure\n * consumer encoder. Native instant values must roundtrip without precision loss. */\nexport interface OAuthClock<Expression extends SqlExpression = SqlExpression> {\n readonly encodeInstant: (millis: number) => unknown;\n readonly decodeInstant: (value: unknown) => number;\n /** Actual engine wall clock sampled after locks, not transaction-start time.\n * PostgreSQL uses clock_timestamp(), never now()/CURRENT_TIMESTAMP. D1 repeats\n * its primary-engine sample bounds in final guards. Return integer milliseconds. */\n readonly engineNowMillis: Expression;\n}\n\nexport interface OAuthSubjectReadTable<\n S extends Table,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: S[\"table\"];\n readonly id: Column<S>;\n readonly status: Column<S>;\n readonly securityRevision: Column<S>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeCondition: Expression;\n}\n\nexport interface OAuthSubjectTable<\n S extends Table,\n Expression extends SqlExpression = SqlExpression,\n> extends OAuthSubjectReadTable<S, Expression> {\n readonly decodeActionRequirement: (\n row: S[\"select\"],\n action: OAuthAction,\n ) => AuthenticationRequirement;\n readonly decodeAuthenticationRequirement: (row: S[\"select\"]) => AuthenticationRequirement;\n readonly nextSecurityRevision: (current: SecurityRevision) => SecurityRevision;\n}\n\nexport interface OAuthOwnershipReadTable<\n O extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: O[\"table\"];\n readonly identityKey: Column<O>;\n readonly provider: Column<O>;\n readonly issuer: Column<O>;\n readonly externalSubject: Column<O>;\n readonly subjectId: Column<O>;\n /** Includes Owned state when authority and ownership share a physical table. */\n readonly ownedCondition: Expression;\n readonly decodeSubjectId: (row: O[\"select\"]) => N;\n}\n\nexport interface OAuthOwnershipTable<\n O extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> extends OAuthOwnershipReadTable<O, N, Expression> {\n readonly encodeInsert: (input: {\n readonly identity: typeof OAuthExternalIdentity.Type;\n readonly identityKey: string;\n readonly subjectId: N;\n }) => O[\"insert\"];\n}\n\nexport interface OAuthCredentialReadTable<\n C extends Table,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: C[\"table\"];\n readonly moduleId: Column<C>;\n readonly credentialId: Column<C>;\n readonly subjectId: Column<C>;\n readonly identityKey: Column<C>;\n readonly credentialRevision: Column<C>;\n readonly status: Column<C>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeCondition: Expression;\n}\n\nexport interface OAuthCredentialTable<\n C extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> extends OAuthCredentialReadTable<C, Expression> {\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly subjectId: N;\n readonly identityKey: string;\n readonly credentialId: string;\n readonly credentialRevision: SecurityRevision;\n }) => C[\"insert\"];\n /** This slice removes login rows. Historical records belong in separate audit storage. */\n readonly removal: \"delete\";\n}\n\nexport interface OAuthAuthorityReadTable<\n C extends Table,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: C[\"table\"];\n readonly subjectId: Column<C>;\n readonly credentialId: Column<C>;\n readonly revision: Column<C>;\n readonly status: Column<C>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeCondition: Expression;\n}\n\nexport interface OAuthAuthorityTable<\n C extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> extends OAuthAuthorityReadTable<C, Expression> {\n readonly encodeInsert: (input: {\n readonly subjectId: N;\n readonly credentialId: string;\n readonly revision: SecurityRevision;\n }) => C[\"insert\"];\n}\n\n/** Both purposes may use the same physical table. Shared tables share module/flow\n * and module/command uniqueness. The snapshot has the exact purpose-specific core\n * codec; terminal writes erase it, while identity, claim and retention columns remain. */\nexport interface OAuthFlowTable<F extends Table> {\n readonly table: F[\"table\"];\n readonly moduleId: Column<F>;\n readonly flowId: Column<F>;\n readonly commandId: Column<F>;\n readonly purpose: Column<F>;\n readonly generation: Column<F>;\n readonly state: Column<F>;\n readonly version: Column<F>;\n readonly stateDigest: Column<F>;\n readonly binderVerifier: Column<F>;\n readonly binderExpiresAt: Column<F>;\n readonly snapshot: Column<F>;\n readonly issuedAt: Column<F>;\n readonly expiresAt: Column<F>;\n readonly claimId: Column<F>;\n readonly claimedAt: Column<F>;\n readonly claimExpiresAt: Column<F>;\n readonly retentionUntil: Column<F>;\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly flowId: string;\n readonly purpose: \"sign-in\" | \"link\";\n }) => F[\"insert\"];\n}\n\nexport interface OAuthTupleAuthorityTable<T extends Table, N> {\n readonly table: T[\"table\"];\n readonly identityKey: Column<T>;\n readonly provider: Column<T>;\n readonly issuer: Column<T>;\n readonly externalSubject: Column<T>;\n readonly state: Column<T>;\n readonly version: Column<T>;\n readonly subjectId: Column<T>;\n /** Exact reservation identity; no application payload or bearer. */\n readonly reservation: Column<T>;\n readonly encodeInsert: (input: {\n readonly identityKey: string;\n readonly identity: typeof OAuthExternalIdentity.Type;\n readonly subjectId?: N;\n }) => T[\"insert\"];\n}\n\nexport interface OAuthRegistrationIntentTable<I extends Table> {\n readonly table: I[\"table\"];\n readonly moduleId: Column<I>;\n readonly reference: Column<I>;\n readonly flowId: Column<I>;\n readonly claimId: Column<I>;\n readonly identityKey: Column<I>;\n readonly version: Column<I>;\n readonly state: Column<I>;\n readonly snapshot: Column<I>;\n readonly commandId: Column<I>;\n readonly fingerprint: Column<I>;\n readonly pendingReference: Column<I>;\n readonly expiresAt: Column<I>;\n readonly retentionUntil: Column<I>;\n readonly encodeInsert: (intent: OAuthRegistrationIntent) => I[\"insert\"];\n}\n\nexport interface OAuthRegistrationCommandTable<R extends Table, Registration> {\n readonly table: R[\"table\"];\n readonly moduleId: Column<R>;\n readonly commandId: Column<R>;\n readonly reference: Column<R>;\n readonly identityKey: Column<R>;\n readonly fingerprint: Column<R>;\n readonly intentSnapshot: Column<R>;\n readonly applicationSnapshot: Column<R>;\n readonly provisioningIdentity: Column<R>;\n readonly decision: Column<R>;\n readonly retentionUntil: Column<R>;\n /** Persists exact detached Type before protected pending work can start. */\n readonly encodeInsert: (input: {\n readonly intent: OAuthRegistrationIntent;\n readonly commandId: string;\n readonly fingerprint: string;\n readonly registration: Registration;\n readonly provisioningIdentity: string;\n }) => R[\"insert\"];\n}\n\nexport interface OAuthUnlinkCommandTable<U extends Table> {\n readonly table: U[\"table\"];\n readonly moduleId: Column<U>;\n readonly commandId: Column<U>;\n readonly subjectId: Column<U>;\n readonly credentialId: Column<U>;\n readonly intentSnapshot: Column<U>;\n readonly decision: Column<U>;\n readonly retentionUntil: Column<U>;\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly commandId: string;\n readonly credential: OAuthCredentialSnapshot;\n }) => U[\"insert\"];\n}\n\nexport interface OAuthEligibilityFact {\n readonly credentialId: string;\n readonly revision: SecurityRevision;\n readonly usablePrimary: boolean;\n readonly factors: ReadonlyArray<AuthenticationFactor>;\n readonly userVerified: boolean;\n readonly phishingResistant: boolean;\n}\n\n/** Each descriptor reads only its own subject-scoped method rows. The native row\n * projector and SQL condition must express the same installed method eligibility.\n * All source/identifier/policy mutations advance subject securityRevision. D1 also\n * guards exact selected IDs/versions and absence/count assumptions, never just a\n * stale boolean. An over-limit graph fails closed rather than truncating. */\nexport interface OAuthEligibilityTable<\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly subjectId: Column<T>;\n readonly credentialId: Column<T>;\n readonly revision: Column<T>;\n readonly scope: string;\n readonly condition: (subjectId: N) => Expression;\n readonly decode: (row: T[\"select\"]) => OAuthEligibilityFact | undefined;\n}\n\n/** Authenticated command replay uses current subject status and this additional\n * nonconsuming SQL policy. It never consumes a fresh action factor. */\nexport interface OAuthMetadataPolicy<N, Expression extends SqlExpression = SqlExpression> {\n readonly condition: (subjectId: N) => Expression;\n}\n\nexport interface OAuthCleanupTable<\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly subjectId: Column<T>;\n /** Bound to this subject's old revision; no opaque independently committing service. */\n readonly condition: (input: {\n readonly subjectId: N;\n readonly revision: OAuthAccountRevision;\n readonly removedCredentialId?: string;\n }) => Expression;\n readonly disposition: \"delete\";\n}\n\nexport interface OAuthRegistrationEligibility<N, Expression extends SqlExpression = SqlExpression> {\n /** Pure SQL guards for mutable app policy; evaluated again after app writes. */\n readonly condition: (input: {\n readonly intent: OAuthRegistrationIntent;\n readonly nativeSubjectId?: N;\n }) => Expression;\n}\n\nexport interface OAuthD1Mapping {\n readonly d1: { readonly primary: true };\n}\n\nexport const requiredOAuthSignInConstraints = {\n flow: \"unique(flow.moduleId,flow.flowId)\",\n command: \"unique(flow.moduleId,flow.commandId)\",\n stateDigest: \"unique(flow.stateDigest)\",\n ownership: \"unique(ownership.identityKey)\",\n credentialId: \"unique(credential.credentialId)\",\n credentialIdentity: \"unique(credential.identityKey)\",\n authorityCredential: \"unique(authority.subjectId,authority.credentialId)\",\n} as const;\n\nexport const requiredOAuthTupleConstraints = { identityKey: \"unique(tuple.identityKey)\" } as const;\n\nexport const requiredOAuthRegistrationConstraints = {\n intentReference: \"unique(intent.moduleId,intent.reference)\",\n intentFlow: \"unique(intent.moduleId,intent.flowId)\",\n command: \"unique(registrationCommand.moduleId,registrationCommand.commandId)\",\n} as const;\n\nexport const requiredOAuthAccountsConstraints = {\n unlinkCommand: \"unique(unlinkCommand.moduleId,unlinkCommand.commandId)\",\n} as const;\n\nexport interface OAuthSignInMapping<\n S extends Table,\n O extends Table,\n C extends Table,\n AC extends Table,\n F extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly subject: OAuthSubjectReadTable<S, Expression>;\n readonly ownership: OAuthOwnershipReadTable<O, N, Expression>;\n readonly credential: OAuthCredentialReadTable<C, Expression>;\n readonly authority: OAuthAuthorityReadTable<AC, Expression>;\n readonly flow: OAuthFlowTable<F>;\n readonly subjectId: SubjectIdCodec<N>;\n readonly clock: OAuthClock<Expression>;\n readonly constraints: typeof requiredOAuthSignInConstraints;\n}\n\nexport type OAuthOwnershipMutation<\n T extends Table,\n O extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> =\n | { readonly mode: \"integrated\"; readonly tuple: OAuthTupleAuthorityTable<T, N> }\n | {\n readonly mode: \"separate\";\n readonly tuple: OAuthTupleAuthorityTable<T, N>;\n readonly external: OAuthOwnershipTable<O, N, Expression>;\n };\n\nexport interface OAuthRegistrationIntentMapping<\n S extends Table,\n O extends Table,\n C extends Table,\n AC extends Table,\n F extends Table,\n T extends Table,\n I extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly signIn: OAuthSignInMapping<S, O, C, AC, F, N, Expression>;\n readonly ownership: OAuthOwnershipMutation<T, O, N, Expression>;\n readonly intent: OAuthRegistrationIntentTable<I>;\n readonly tupleConstraints: typeof requiredOAuthTupleConstraints;\n readonly registrationConstraints: Pick<\n typeof requiredOAuthRegistrationConstraints,\n \"intentReference\" | \"intentFlow\"\n >;\n readonly eligibility: OAuthRegistrationEligibility<N, Expression>;\n}\n\nexport interface OAuthRegistrationBase<\n Registration,\n T extends Table,\n O extends Table,\n I extends Table,\n R extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> {\n readonly ownership: OAuthOwnershipMutation<T, O, N, Expression>;\n readonly intent: OAuthRegistrationIntentTable<I>;\n readonly command: OAuthRegistrationCommandTable<R, Registration>;\n readonly clock: OAuthClock<Expression>;\n readonly tupleConstraints: typeof requiredOAuthTupleConstraints;\n readonly constraints: typeof requiredOAuthRegistrationConstraints;\n readonly inspect: (input: {\n readonly intent: OAuthRegistrationIntent;\n readonly registration: Registration;\n }) => Effect.Effect<\n { readonly fingerprint: string; readonly eligible: boolean },\n PersistenceMappingError\n >;\n /** Required for an explicitly bound native/DO command: no asynchronous callback\n * is evaluated inside the physical owner. Standalone inspection is pre-owner. */\n readonly inspectSync?: (input: {\n readonly intent: OAuthRegistrationIntent;\n readonly registration: Registration;\n }) => { readonly fingerprint: string; readonly eligible: boolean };\n /** Type projection, never the original wire transformation. */\n readonly snapshot: (\n registration: Registration,\n ) => Effect.Effect<Registration, PersistenceMappingError>;\n readonly snapshotSync?: (registration: Registration) => Registration;\n /** Canonical bounded storage of Registration.Type. These are Type codecs, not\n * the original wire decoder/encoder; decode(encode(value)) must encode identically.\n * The engine writes and roundtrip-checks this exact string (maximum 1 MiB). */\n readonly application: {\n readonly encode: (registration: Registration) => string;\n readonly decode: (stored: string) => Registration;\n };\n readonly eligibility: {\n /** Stable application authority anchors, in one configured global order.\n * Omit only for immutable/tuple-local policy or an equivalent explicit outer\n * owner lock. Each scope must match 1..64 rows, never an absent quota row.\n * Locks precede tuple/intent/command locks; postcondition owns changed state. */\n readonly guards?: ReadonlyArray<\n OAuthRegistrationGuardDescriptor<Registration, N, Expression, Descriptor>\n >;\n readonly admission: (input: {\n readonly intent: OAuthRegistrationIntent;\n readonly registration: Registration;\n readonly nativeSubjectId?: N;\n }) => Expression;\n /** Evaluated after subject/application writes, including appended coordinator\n * writes. May assert consumption of the admission invitation/quota. */\n readonly postcondition: (input: {\n readonly intent: OAuthRegistrationIntent;\n readonly registration: Registration;\n readonly nativeSubjectId?: N;\n }) => Expression;\n };\n readonly allocateProvisioningIdentity: Effect.Effect<string, PersistenceMappingError>;\n readonly retentionMillis: number;\n}\n\nexport interface OAuthRegistrationGuardTable<\n T extends Table,\n Registration,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly orderBy: Column<T>;\n readonly condition: (input: {\n readonly intent: OAuthRegistrationIntent;\n readonly registration: Registration;\n readonly nativeSubjectId?: N;\n }) => Expression;\n}\n\nexport interface OAuthRegistrationGuardDescriptor<\n Registration,\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> {\n readonly table: Descriptor;\n readonly orderBy: string;\n readonly condition: OAuthRegistrationGuardTable<Table, Registration, N, Expression>[\"condition\"];\n}\n\nexport const oauthRegistrationGuardTable = <\n T extends Table,\n Registration,\n N,\n Expression extends SqlExpression = SqlExpression,\n>(\n input: OAuthRegistrationGuardTable<T, Registration, N, Expression>,\n): OAuthRegistrationGuardDescriptor<Registration, N, Expression, T[\"table\"]> =>\n Object.freeze({\n table: input.table,\n orderBy: input.orderBy,\n condition: input.condition,\n });\n\nexport type OAuthRegistrationMapping<\n Registration,\n S extends Table,\n O extends Table,\n C extends Table,\n AC extends Table,\n T extends Table,\n I extends Table,\n R extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> = OAuthRegistrationBase<Registration, T, O, I, R, N, Expression, Descriptor> &\n (\n | {\n readonly mode: \"pending\";\n readonly allocatePendingReference: Effect.Effect<string, PersistenceMappingError>;\n }\n | {\n readonly mode: \"atomic\";\n readonly subjectId: SubjectIdCodec<N>;\n readonly subject: OAuthSubjectReadTable<S, Expression>;\n readonly credential: OAuthCredentialTable<C, N, Expression>;\n readonly authority: OAuthAuthorityTable<AC, N, Expression>;\n readonly allocateSubjectId: Effect.Effect<N, PersistenceMappingError>;\n readonly allocateCredentialId: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateRevision: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly encodeSubjectInsert: (\n input: { readonly intent: OAuthRegistrationIntent; readonly registration: Registration },\n ids: { readonly subjectId: N; readonly securityRevision: SecurityRevision },\n ) => S[\"insert\"];\n }\n );\n\n/** Heterogeneous descriptors are made by typed factories and projected privately. */\nexport interface OAuthEligibilityDescriptor<\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> {\n readonly _tag: \"OAuthEligibilityDescriptor\";\n readonly scope: string;\n readonly table: Descriptor;\n readonly subjectId: string;\n readonly credentialId: string;\n readonly revision: string;\n readonly condition: (subjectId: N) => Expression;\n readonly decode: (row: unknown) => OAuthEligibilityFact | undefined;\n}\n\nexport const oauthEligibilityTable = <\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n>(\n input: OAuthEligibilityTable<T, N, Expression>,\n): OAuthEligibilityDescriptor<N, Expression, T[\"table\"]> => {\n const { table, subjectId, credentialId, revision, scope, condition, decode } = input;\n\n return Object.freeze({\n _tag: \"OAuthEligibilityDescriptor\",\n table,\n subjectId,\n credentialId,\n revision,\n scope,\n condition,\n // The query owner supplies rows selected from this descriptor's mapped table.\n decode: (row: unknown) => decode(row as T[\"select\"]),\n });\n};\n\nexport interface OAuthCleanupDescriptor<\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> {\n readonly table: Descriptor;\n readonly subjectId: string;\n readonly condition: OAuthCleanupTable<Table, N, Expression>[\"condition\"];\n}\n\nexport const oauthCleanupTable = <\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n>(\n input: OAuthCleanupTable<T, N, Expression>,\n): OAuthCleanupDescriptor<N, Expression, T[\"table\"]> =>\n Object.freeze({ table: input.table, subjectId: input.subjectId, condition: input.condition });\n\n/** A stable application/reference lock acquired before an ownership target.\n * Missing rows retain ownership. Conditions use detached native IDs; every\n * writer of the guarded reference follows the same order. */\nexport interface OAuthReferenceGuardTable<\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly orderBy: Column<T>;\n readonly condition: (input: {\n readonly identity: typeof OAuthExternalIdentity.Type;\n readonly identityKey: string;\n readonly subjectId: N;\n }) => Expression | Effect.Effect<Expression, PlatformError.PlatformError, Crypto.Crypto>;\n}\n\nexport interface OAuthReferenceGuardDescriptor<\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> {\n readonly table: Descriptor;\n readonly orderBy: string;\n readonly condition: OAuthReferenceGuardTable<Table, N, Expression>[\"condition\"];\n}\n\nexport const oauthReferenceGuardTable = <\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n>(\n input: OAuthReferenceGuardTable<T, N, Expression>,\n): OAuthReferenceGuardDescriptor<N, Expression, T[\"table\"]> =>\n Object.freeze({\n table: input.table,\n orderBy: input.orderBy,\n condition: input.condition,\n });\n\nexport interface OAuthAccountsMapping<\n S extends Table,\n O extends Table,\n C extends Table,\n AC extends Table,\n F extends Table,\n T extends Table,\n U extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> {\n readonly subject: OAuthSubjectTable<S, Expression>;\n readonly ownership: OAuthOwnershipMutation<T, O, N, Expression>;\n readonly credential: OAuthCredentialTable<C, N, Expression>;\n readonly authority: OAuthAuthorityTable<AC, N, Expression>;\n readonly flow: OAuthFlowTable<F>;\n readonly command: OAuthUnlinkCommandTable<U>;\n readonly subjectId: SubjectIdCodec<N>;\n readonly clock: OAuthClock<Expression>;\n readonly constraints: typeof requiredOAuthSignInConstraints &\n typeof requiredOAuthAccountsConstraints;\n readonly tupleConstraints: typeof requiredOAuthTupleConstraints;\n readonly eligibility: ReadonlyArray<OAuthEligibilityDescriptor<N, Expression, Descriptor>>;\n readonly cleanup: ReadonlyArray<OAuthCleanupDescriptor<N, Expression, Descriptor>>;\n readonly metadata: OAuthMetadataPolicy<N, Expression>;\n readonly sessionInvalidation: \"same-authority-immediate\" | \"original-absolute-expiry\";\n /** Omit only when connected access is absent. A predicate alone conservatively\n * retains ownership; release also needs all configured guard rows below. */\n readonly connectedReference?: (input: {\n readonly identityKey: string;\n readonly subjectId: N;\n }) => Expression;\n /** At most 32 descriptors, each locking 1..64 stable rows in supplied order.\n * Missing/empty guards retain Owned, even when the reference predicate is false. */\n readonly connectedReferenceGuards?: ReadonlyArray<\n OAuthReferenceGuardDescriptor<N, Expression, Descriptor>\n >;\n readonly allocateCredentialId: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateRevision: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n}\n\nexport interface OAuthRegistrationAuthority<Registration> {\n readonly read: (\n access: OAuthRegistrationAccess,\n ) => Effect.Effect<OAuthRegistrationInspection | undefined, OAuthUnavailable>;\n readonly inspect: (input: {\n readonly intent: OAuthRegistrationIntent;\n readonly registration: Registration;\n }) => Effect.Effect<\n {\n readonly fingerprint: TokenDigest;\n readonly eligible: boolean;\n },\n OAuthUnavailable\n >;\n readonly register: <A>(\n input: {\n readonly access: OAuthRegistrationAccess;\n readonly intent: OAuthRegistrationIntent;\n readonly commandId: typeof OAuthCommandId.Type;\n readonly registration: Registration;\n readonly fingerprint: TokenDigest;\n },\n prepare: PrepareOAuthCommit<OAuthRegistrationDecision, A>,\n ) => Effect.Effect<PreparedCommit<A>, OAuthUnavailable>;\n readonly cleanup: <A>(\n input: OAuthCleanupInput,\n prepare: PrepareOAuthCommit<{ readonly removed: number; readonly hasMore: boolean }, A>,\n ) => Effect.Effect<PreparedCommit<A>, OAuthUnavailable>;\n}\n"],"mappings":";AAoUA,MAAa,iCAAiC;CAC5C,MAAM;CACN,SAAS;CACT,aAAa;CACb,WAAW;CACX,cAAc;CACd,oBAAoB;CACpB,qBAAqB;AACvB;AAEA,MAAa,gCAAgC,EAAE,aAAa,4BAA4B;AAExF,MAAa,uCAAuC;CAClD,iBAAiB;CACjB,YAAY;CACZ,SAAS;AACX;AAEA,MAAa,mCAAmC,EAC9C,eAAe,yDACjB;AAoJA,MAAa,+BAMX,UAEA,OAAO,OAAO;CACZ,OAAO,MAAM;CACb,SAAS,MAAM;CACf,WAAW,MAAM;AACnB,CAAC;AAoDH,MAAa,yBAKX,UAC0D;CAC1D,MAAM,EAAE,OAAO,WAAW,cAAc,UAAU,OAAO,WAAW,WAAW;CAE/E,OAAO,OAAO,OAAO;EACnB,MAAM;EACN;EACA;EACA;EACA;EACA;EACA;EAEA,SAAS,QAAiB,OAAO,GAAkB;CACrD,CAAC;AACH;AAYA,MAAa,qBAKX,UAEA,OAAO,OAAO;CAAE,OAAO,MAAM;CAAO,WAAW,MAAM;CAAW,WAAW,MAAM;AAAU,CAAC;AA6B9F,MAAa,4BAKX,UAEA,OAAO,OAAO;CACZ,OAAO,MAAM;CACb,SAAS,MAAM;CACf,WAAW,MAAM;AACnB,CAAC"}
1
+ {"version":3,"file":"oauth-model.mjs","names":[],"sources":["../../../src/internal/models/oauth-model.ts"],"sourcesContent":["import type { PreparedCommit } from \"@yielded/auth/Hooks\";\nimport type {\n OAuthActionAuthorization,\n OAuthAccountRevision,\n OAuthRegistrationIntent,\n OAuthExternalIdentity,\n OAuthRegistrationAccess,\n OAuthRegistrationInspection,\n OAuthUnavailable,\n OAuthCommandId,\n PrepareOAuthCommit,\n OAuthRegistrationDecision,\n OAuthCleanupInput,\n} from \"@yielded/auth/OAuth\";\nimport { AuthenticationFactor } from \"@yielded/auth/Operations\";\nimport type { CleanupResult } from \"@yielded/auth/Persistence\";\nimport type { TokenDigest } from \"@yielded/auth/Schema\";\nimport { type AuthenticationRequirement, SecurityRevision } from \"@yielded/auth/Sessions\";\nimport { type Effect, Schema } from \"effect\";\n\nimport type { TableModel as Table, SqlExpression } from \"../table-model\";\nimport type { PersistenceMappingError, SubjectIdCodec } from \"./common\";\n\ntype Column<T extends Table> = T[\"column\"];\nexport type OAuthAction = OAuthActionAuthorization[\"challenge\"][\"action\"];\n\nexport interface OAuthClock<Expression extends SqlExpression = SqlExpression> {\n readonly encodeInstant: (millis: number) => unknown;\n readonly decodeInstant: (value: unknown) => number;\n /** Actual engine wall clock sampled after locks, not transaction-start time.\n * PostgreSQL uses clock_timestamp(), never now()/CURRENT_TIMESTAMP. D1 repeats\n * its primary-engine sample bounds in final guards. Return integer milliseconds. */\n readonly engineNowMillis: Expression;\n /** Convert a stored timestamp expression to integer milliseconds. */\n readonly toMillis: (expression: Expression) => Expression;\n readonly fromMillis: (expression: Expression) => Expression;\n}\n\nexport interface OAuthSubjectReadTable<\n S extends Table,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: S[\"table\"];\n readonly id: Column<S>;\n readonly status: Column<S>;\n readonly securityRevision: Column<S>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeCondition: Expression;\n readonly decodeAuthenticationRequirement: (row: S[\"select\"]) => AuthenticationRequirement;\n}\n\nexport interface OAuthSubjectTable<\n S extends Table,\n Expression extends SqlExpression = SqlExpression,\n> extends OAuthSubjectReadTable<S, Expression> {\n readonly nextSecurityRevision: (current: SecurityRevision) => SecurityRevision;\n}\n\nexport interface OAuthOwnershipReadTable<O extends Table, N> {\n readonly table: O[\"table\"];\n readonly identityKey: Column<O>;\n readonly provider: Column<O>;\n readonly issuer: Column<O>;\n readonly externalSubject: Column<O>;\n readonly subjectId: Column<O>;\n readonly decodeSubjectId: (row: O[\"select\"]) => N;\n}\n\nexport interface OAuthOwnershipTable<O extends Table, N> extends OAuthOwnershipReadTable<O, N> {\n readonly encodeInsert: (input: {\n readonly identity: typeof OAuthExternalIdentity.Type;\n readonly identityKey: string;\n readonly subjectId: N;\n }) => O[\"insert\"];\n}\n\nexport interface OAuthCredentialReadTable<\n C extends Table,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: C[\"table\"];\n readonly moduleId: Column<C>;\n readonly credentialId: Column<C>;\n readonly subjectId: Column<C>;\n readonly identityKey: Column<C>;\n readonly credentialRevision: Column<C>;\n readonly status: Column<C>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeCondition: Expression;\n}\n\nexport interface OAuthCredentialTable<\n C extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> extends OAuthCredentialReadTable<C, Expression> {\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly subjectId: N;\n readonly identityKey: string;\n readonly credentialId: string;\n readonly credentialRevision: SecurityRevision;\n }) => C[\"insert\"];\n /** This slice removes login rows. Historical records belong in separate audit storage. */\n readonly removal: \"delete\";\n}\n\nexport interface OAuthAuthorityReadTable<\n C extends Table,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: C[\"table\"];\n readonly subjectId: Column<C>;\n readonly credentialId: Column<C>;\n readonly revision: Column<C>;\n readonly status: Column<C>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeCondition: Expression;\n}\n\nexport interface OAuthAuthorityTable<\n C extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> extends OAuthAuthorityReadTable<C, Expression> {\n readonly encodeInsert: (input: {\n readonly subjectId: N;\n readonly credentialId: string;\n readonly revision: SecurityRevision;\n }) => C[\"insert\"];\n}\n\n/** Live ceremonies only. Predicate columns enforce access before deletion; the\n * snapshot retains the exact authenticated context and encrypted protocol data. */\nexport interface OAuthFlowTable<F extends Table> {\n readonly table: F[\"table\"];\n readonly moduleId: Column<F>;\n readonly flowId: Column<F>;\n readonly purpose: Column<F>;\n readonly generation: Column<F>;\n readonly provider: Column<F>;\n readonly callbackId: Column<F>;\n readonly issuer: Column<F>;\n readonly responseIssuerMode: Column<F>;\n readonly subjectId: Column<F>;\n readonly stateDigest: Column<F>;\n readonly binderVerifier: Column<F>;\n readonly binderExpiresAt: Column<F>;\n readonly snapshot: Column<F>;\n readonly issuedAt: Column<F>;\n readonly expiresAt: Column<F>;\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly flowId: string;\n readonly purpose: \"sign-in\" | \"link\" | \"connect\";\n }) => F[\"insert\"];\n}\n\nexport const OAuthEligibilityFact = Schema.Struct({\n credentialId: Schema.NonEmptyString.check(Schema.isMaxLength(256)),\n revision: SecurityRevision,\n usablePrimary: Schema.Boolean,\n factors: Schema.Array(AuthenticationFactor).check(Schema.isMaxLength(8)),\n userVerified: Schema.Boolean,\n phishingResistant: Schema.Boolean,\n});\n\nexport type OAuthEligibilityFact = typeof OAuthEligibilityFact.Type;\n\n/** Each descriptor reads only its own subject-scoped method rows. The native row\n * projector and SQL condition must express the same installed method eligibility.\n * All source/identifier/policy mutations advance subject securityRevision. D1 also\n * guards exact selected IDs/versions and absence/count assumptions, never just a\n * stale boolean. An over-limit graph fails closed rather than truncating. */\nexport interface OAuthEligibilityTable<\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly subjectId: Column<T>;\n readonly credentialId: Column<T>;\n readonly revision: Column<T>;\n readonly scope: string;\n readonly condition: (subjectId: N) => Expression;\n readonly decode: (row: T[\"select\"]) => OAuthEligibilityFact | undefined;\n}\n\nexport interface OAuthCleanupTable<\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly subjectId: Column<T>;\n /** Bound to this subject's old revision; no opaque independently committing service. */\n readonly condition: (input: {\n readonly subjectId: N;\n readonly revision: OAuthAccountRevision;\n readonly removedCredentialId?: string;\n }) => Expression;\n readonly disposition: \"delete\";\n}\n\nexport interface OAuthRegistrationGuardTable<\n T extends Table,\n Registration,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly orderBy: Column<T>;\n readonly condition: (input: {\n readonly intent: OAuthRegistrationIntent;\n readonly registration: Registration;\n readonly nativeSubjectId?: N;\n }) => Expression;\n}\n\nexport interface OAuthRegistrationGuardDescriptor<\n Registration,\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> {\n readonly table: Descriptor;\n readonly orderBy: string;\n readonly condition: OAuthRegistrationGuardTable<Table, Registration, N, Expression>[\"condition\"];\n}\n\nexport const oauthRegistrationGuardTable = <\n T extends Table,\n Registration,\n N,\n Expression extends SqlExpression = SqlExpression,\n>(\n input: OAuthRegistrationGuardTable<T, Registration, N, Expression>,\n): OAuthRegistrationGuardDescriptor<Registration, N, Expression, T[\"table\"]> =>\n Object.freeze({\n table: input.table,\n orderBy: input.orderBy,\n condition: input.condition,\n });\n\n/** Heterogeneous descriptors are made by typed factories and projected privately. */\nexport interface OAuthEligibilityDescriptor<\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> {\n readonly _tag: \"OAuthEligibilityDescriptor\";\n readonly scope: string;\n readonly table: Descriptor;\n readonly subjectId: string;\n readonly credentialId: string;\n readonly revision: string;\n readonly condition: (subjectId: N) => Expression;\n readonly decode: (row: unknown) => OAuthEligibilityFact | undefined;\n}\n\nexport const oauthEligibilityTable = <\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n>(\n input: OAuthEligibilityTable<T, N, Expression>,\n): OAuthEligibilityDescriptor<N, Expression, T[\"table\"]> => {\n const { table, subjectId, credentialId, revision, scope, condition, decode } = input;\n\n return Object.freeze({\n _tag: \"OAuthEligibilityDescriptor\",\n table,\n subjectId,\n credentialId,\n revision,\n scope,\n condition,\n // The query owner supplies rows selected from this descriptor's mapped table.\n decode: (row: unknown) => decode(row as T[\"select\"]),\n });\n};\n\nexport interface OAuthCleanupDescriptor<\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> {\n readonly table: Descriptor;\n readonly subjectId: string;\n readonly condition: OAuthCleanupTable<Table, N, Expression>[\"condition\"];\n}\n\nexport const oauthCleanupTable = <\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n>(\n input: OAuthCleanupTable<T, N, Expression>,\n): OAuthCleanupDescriptor<N, Expression, T[\"table\"]> =>\n Object.freeze({ table: input.table, subjectId: input.subjectId, condition: input.condition });\n\n/** Original application binding and retained decision are encoded in snapshot. */\nexport interface OAuthRegistrationIntentTable<I extends Table> {\n readonly table: I[\"table\"];\n readonly moduleId: Column<I>;\n readonly reference: Column<I>;\n readonly flowId: Column<I>;\n readonly identityKey: Column<I>;\n readonly snapshot: Column<I>;\n readonly expiresAt: Column<I>;\n readonly retentionUntil: Column<I>;\n readonly encodeInsert: (intent: OAuthRegistrationIntent) => I[\"insert\"];\n}\n\nexport interface OAuthD1Mapping {\n readonly d1: { readonly primary: true };\n}\n\nexport const requiredOAuthSignInConstraints = {\n flow: \"unique(flow.moduleId,flow.flowId)\",\n stateDigest: \"unique(flow.stateDigest)\",\n ownership: \"unique(ownership.identityKey)\",\n credentialId: \"unique(credential.credentialId)\",\n credentialIdentity: \"unique(credential.identityKey)\",\n authorityCredential: \"unique(authority.subjectId,authority.credentialId)\",\n} as const;\n\nexport const requiredOAuthRegistrationConstraints = {\n intentReference: \"unique(intent.moduleId,intent.reference)\",\n intentFlow: \"unique(intent.moduleId,intent.flowId)\",\n ownership: \"unique(ownership.identityKey)\",\n credentialId: \"unique(credential.credentialId)\",\n credentialIdentity: \"unique(credential.identityKey)\",\n authorityCredential: \"unique(authority.subjectId,authority.credentialId)\",\n} as const;\n\nexport interface OAuthSignInMapping<\n S extends Table,\n O extends Table,\n C extends Table,\n AC extends Table,\n F extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly subject: OAuthSubjectReadTable<S, Expression>;\n readonly ownership: OAuthOwnershipReadTable<O, N>;\n readonly credential: OAuthCredentialReadTable<C, Expression>;\n readonly authority: OAuthAuthorityReadTable<AC, Expression>;\n readonly flow: OAuthFlowTable<F>;\n readonly subjectId: SubjectIdCodec<N>;\n readonly clock: OAuthClock<Expression>;\n readonly constraints: typeof requiredOAuthSignInConstraints;\n}\n\nexport interface OAuthRegistrationIntentMapping<\n O extends Table,\n I extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly ownership: OAuthOwnershipReadTable<O, N>;\n readonly intent: OAuthRegistrationIntentTable<I>;\n readonly clock: OAuthClock<Expression>;\n readonly constraints: Pick<\n typeof requiredOAuthRegistrationConstraints,\n \"intentReference\" | \"intentFlow\" | \"ownership\"\n >;\n readonly eligible: (intent: OAuthRegistrationIntent) => Expression;\n}\n\nexport interface OAuthRegistrationMapping<\n Registration,\n S extends Table,\n O extends Table,\n C extends Table,\n AC extends Table,\n I extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> {\n readonly registration: Schema.Codec<Registration, unknown, never, never>;\n readonly ownership: OAuthOwnershipTable<O, N>;\n readonly intent: OAuthRegistrationIntentTable<I>;\n readonly subject: OAuthSubjectReadTable<S, Expression>;\n readonly credential: OAuthCredentialTable<C, N, Expression>;\n readonly authority: OAuthAuthorityTable<AC, N, Expression>;\n readonly subjectId: SubjectIdCodec<N>;\n readonly clock: OAuthClock<Expression>;\n readonly constraints: typeof requiredOAuthRegistrationConstraints;\n readonly inspect: (input: {\n readonly intent: OAuthRegistrationIntent;\n readonly registration: Registration;\n }) => Effect.Effect<\n { readonly fingerprint: string; readonly eligible: boolean },\n PersistenceMappingError\n >;\n readonly eligibility: {\n readonly guards?: ReadonlyArray<\n OAuthRegistrationGuardDescriptor<Registration, N, Expression, Descriptor>\n >;\n readonly admission: (input: {\n readonly intent: OAuthRegistrationIntent;\n readonly registration: Registration;\n readonly nativeSubjectId?: N;\n }) => Expression;\n readonly postcondition: (input: {\n readonly intent: OAuthRegistrationIntent;\n readonly registration: Registration;\n readonly nativeSubjectId?: N;\n }) => Expression;\n };\n readonly allocateSubjectId: Effect.Effect<N, PersistenceMappingError>;\n readonly allocateCredentialId: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateRevision: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly encodeSubjectInsert: (\n input: {\n readonly intent: OAuthRegistrationIntent;\n readonly registration: Registration;\n readonly requestId: string;\n },\n ids: { readonly subjectId: N; readonly securityRevision: SecurityRevision },\n ) => S[\"insert\"];\n}\n\nexport interface OAuthAccountsMapping<\n S extends Table,\n O extends Table,\n C extends Table,\n AC extends Table,\n F extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> {\n readonly subject: OAuthSubjectTable<S, Expression>;\n readonly ownership: OAuthOwnershipTable<O, N>;\n readonly credential: OAuthCredentialTable<C, N, Expression>;\n readonly authority: OAuthAuthorityTable<AC, N, Expression>;\n readonly flow: OAuthFlowTable<F>;\n readonly subjectId: SubjectIdCodec<N>;\n readonly clock: OAuthClock<Expression>;\n readonly constraints: typeof requiredOAuthSignInConstraints;\n readonly eligibility: ReadonlyArray<OAuthEligibilityDescriptor<N, Expression, Descriptor>>;\n readonly cleanup: ReadonlyArray<OAuthCleanupDescriptor<N, Expression, Descriptor>>;\n readonly sessionInvalidation: \"same-authority-immediate\" | \"original-absolute-expiry\";\n /** Indexed same-owner reference predicate for any installed grant/application references. */\n readonly otherReferences: (input: {\n readonly identityKey: string;\n readonly subjectId: N;\n }) => Expression;\n readonly allocateCredentialId: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateRevision: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n}\n\nexport interface OAuthRegistrationAuthority<Registration> {\n readonly read: (\n access: OAuthRegistrationAccess,\n ) => Effect.Effect<OAuthRegistrationInspection | undefined, OAuthUnavailable>;\n readonly inspect: (input: {\n readonly intent: OAuthRegistrationIntent;\n readonly registration: Registration;\n }) => Effect.Effect<\n {\n readonly fingerprint: TokenDigest;\n readonly eligible: boolean;\n },\n OAuthUnavailable\n >;\n readonly register: <A>(\n input: {\n readonly access: OAuthRegistrationAccess;\n readonly intent: OAuthRegistrationIntent;\n readonly commandId: typeof OAuthCommandId.Type;\n readonly registration: Registration;\n readonly fingerprint: TokenDigest;\n readonly payload: string;\n readonly requestId: string;\n },\n prepare: PrepareOAuthCommit<OAuthRegistrationDecision, A>,\n ) => Effect.Effect<PreparedCommit<A>, OAuthUnavailable>;\n readonly cleanup: <A>(\n input: OAuthCleanupInput,\n prepare: PrepareOAuthCommit<CleanupResult, A>,\n ) => Effect.Effect<PreparedCommit<A>, OAuthUnavailable>;\n}\n"],"mappings":";;;;AA8JA,MAAa,uBAAuB,OAAO,OAAO;CAChD,cAAc,OAAO,eAAe,MAAM,OAAO,YAAY,GAAG,CAAC;CACjE,UAAU;CACV,eAAe,OAAO;CACtB,SAAS,OAAO,MAAM,oBAAoB,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;CACvE,cAAc,OAAO;CACrB,mBAAmB,OAAO;AAC5B,CAAC;AAiED,MAAa,+BAMX,UAEA,OAAO,OAAO;CACZ,OAAO,MAAM;CACb,SAAS,MAAM;CACf,WAAW,MAAM;AACnB,CAAC;AAkBH,MAAa,yBAKX,UAC0D;CAC1D,MAAM,EAAE,OAAO,WAAW,cAAc,UAAU,OAAO,WAAW,WAAW;CAE/E,OAAO,OAAO,OAAO;EACnB,MAAM;EACN;EACA;EACA;EACA;EACA;EACA;EAEA,SAAS,QAAiB,OAAO,GAAkB;CACrD,CAAC;AACH;AAYA,MAAa,qBAKX,UAEA,OAAO,OAAO;CAAE,OAAO,MAAM;CAAO,WAAW,MAAM;CAAW,WAAW,MAAM;AAAU,CAAC;AAmB9F,MAAa,iCAAiC;CAC5C,MAAM;CACN,aAAa;CACb,WAAW;CACX,cAAc;CACd,oBAAoB;CACpB,qBAAqB;AACvB;AAEA,MAAa,uCAAuC;CAClD,iBAAiB;CACjB,YAAY;CACZ,WAAW;CACX,cAAc;CACd,oBAAoB;CACpB,qBAAqB;AACvB"}
@@ -1,8 +1,9 @@
1
+ import { SqlExpression, TableModel } from "../table-model.mjs";
1
2
  import { PersistenceMappingError } from "../mapping-error.mjs";
2
- import { SqlExpression, TableModel } from "../query-operations.mjs";
3
3
  import "./common.mjs";
4
4
  import { Effect, Layer } from "effect";
5
- import { PasskeyCeremony, PasskeyCredential, PasskeyCredentials, PasskeyEnrollmentContext, PasskeyMethodPolicy, PasskeyPersistence } from "@yielded/auth/Passkey";
5
+ import { PasskeyCeremony, PasskeyCredential, PasskeyCredentials, PasskeyPersistence } from "@yielded/auth/Passkey";
6
+ import { AuthenticationRequirement } from "@yielded/auth/Sessions";
6
7
  import { SubjectId } from "@yielded/auth/Schema";
7
8
  //#region src/internal/models/passkey-model.d.ts
8
9
  export type PasskeyColumn<T extends TableModel> = T["column"];
@@ -13,12 +14,8 @@ export interface PasskeyCredentialServices {
13
14
  export interface PasskeyPersistenceServices {
14
15
  readonly passkeyPersistence: PasskeyPersistence["Service"];
15
16
  }
16
- export interface PasskeyEnrollmentContextServices {
17
- readonly passkeyEnrollmentContext: PasskeyEnrollmentContext["Service"];
18
- }
19
17
  export declare const passkeyCredentialsLayer: <E, R>(services: Effect.Effect<PasskeyCredentialServices, E, R>) => Layer.Layer<PasskeyCredentials, E, R>;
20
18
  export declare const passkeyPersistenceLayer: <E, R>(services: Effect.Effect<PasskeyPersistenceServices, E, R>) => Layer.Layer<PasskeyPersistence, E, R>;
21
- export declare const passkeyEnrollmentContextLayer: <E, R>(services: Effect.Effect<PasskeyEnrollmentContextServices, E, R>) => Layer.Layer<PasskeyEnrollmentContext, E, R>;
22
19
  /** Native IDs roundtrip exactly; protocol IDs and authentication references are
23
20
  * different identities. These callbacks never suspend inside an owner. */
24
21
  export interface PasskeySubjectIdCodec<N> {
@@ -38,6 +35,7 @@ export interface PasskeySubjectReadTable<T extends TableModel, N, Expression ext
38
35
  readonly id: PasskeyColumn<T>;
39
36
  readonly status: PasskeyColumn<T>;
40
37
  readonly securityRevision: PasskeyColumn<T>;
38
+ readonly decodeRequirement: (row: T["select"]) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;
41
39
  readonly decodeId: (row: Readonly<Partial<T["select"]>>) => N;
42
40
  readonly isActiveStatus: (value: unknown) => boolean;
43
41
  readonly activeCondition: Expression;
@@ -60,7 +58,6 @@ export interface PasskeyCredentialReadTable<T extends TableModel, N, Expression
60
58
  readonly rpId: PasskeyColumn<T>;
61
59
  readonly protocolCredentialId: PasskeyColumn<T>;
62
60
  readonly credentialKey: PasskeyColumn<T>;
63
- readonly handleKey: PasskeyColumn<T>;
64
61
  readonly userHandle: PasskeyColumn<T>;
65
62
  readonly publicKey: PasskeyColumn<T>;
66
63
  readonly algorithm: PasskeyColumn<T>;
@@ -72,191 +69,58 @@ export interface PasskeyCredentialReadTable<T extends TableModel, N, Expression
72
69
  readonly backupEligible: PasskeyColumn<T>;
73
70
  readonly backupState: PasskeyColumn<T>;
74
71
  readonly counter: PasskeyColumn<T>;
75
- readonly maximumCounter: PasskeyColumn<T>;
76
- readonly decode: (row: Readonly<Partial<T["select"]>>) => Omit<PasskeyCredential, "revision" | "active">;
72
+ readonly decode: (row: Readonly<Partial<T["select"]>>) => Omit<PasskeyCredential, "revision" | "active" | "requirement">;
77
73
  readonly decodeSubjectId: (row: Readonly<Partial<T["select"]>>) => N;
78
74
  readonly isActiveStatus: (value: unknown) => boolean;
79
75
  readonly activeCondition: Expression;
80
76
  }
81
- export interface PasskeyCredentialOwnershipTable<T extends TableModel, N, Expression extends SqlExpression = SqlExpression> {
82
- readonly table: T["table"];
83
- readonly credentialKey: PasskeyColumn<T>;
84
- readonly rpId: PasskeyColumn<T>;
85
- readonly protocolCredentialId: PasskeyColumn<T>;
86
- readonly subjectId: PasskeyColumn<T>;
87
- readonly credentialId: PasskeyColumn<T>;
88
- readonly state: PasskeyColumn<T>;
89
- readonly version: PasskeyColumn<T>;
90
- readonly reservationId: PasskeyColumn<T>;
91
- readonly ownedCondition: Expression;
92
- readonly isOwnedState: (value: unknown) => boolean;
93
- readonly decodeSubjectId: (row: Readonly<Partial<T["select"]>>) => N;
94
- }
95
- /** Reservations do not manufacture a subject; bound handles are RP-global. */
96
- export interface PasskeyHandleReadTable<T extends TableModel> {
97
- readonly table: T["table"];
98
- readonly handleKey: PasskeyColumn<T>;
99
- readonly rpId: PasskeyColumn<T>;
100
- readonly userHandle: PasskeyColumn<T>;
101
- readonly state: PasskeyColumn<T>;
102
- readonly version: PasskeyColumn<T>;
103
- readonly reservationId: PasskeyColumn<T>;
104
- }
105
- export interface PasskeyHandleReservationTable<T extends TableModel, Expression extends SqlExpression = SqlExpression> extends PasskeyHandleReadTable<T> {
106
- readonly reservedCondition: Expression;
107
- readonly isReservedState: (value: unknown) => boolean;
108
- }
109
- export interface PasskeyHandleOwnershipTable<T extends TableModel, N, Expression extends SqlExpression = SqlExpression> extends PasskeyHandleReadTable<T> {
110
- readonly subjectId: PasskeyColumn<T>;
111
- readonly ownedCondition: Expression;
112
- readonly isOwnedState: (value: unknown) => boolean;
113
- readonly decodeSubjectId: (row: Readonly<Partial<T["select"]>>) => N;
114
- }
115
77
  export declare const requiredPasskeyCredentialConstraints: {
116
78
  readonly credentialId: readonly ["credentialId"];
79
+ readonly credentialKey: readonly ["credentialKey"];
117
80
  readonly factor: readonly ["subjectId", "credentialId"];
118
- readonly credentialOwnership: readonly ["credentialKey"];
119
- readonly handleOwnership: readonly ["handleKey"];
120
- readonly boundSubjectHandle: readonly ["rpId", "subjectId"];
121
81
  };
122
- export interface PasskeyCredentialMapping<S extends TableModel, C extends TableModel, F extends TableModel, Ownership extends TableModel, Handle extends TableModel, N, Expression extends SqlExpression = SqlExpression> {
82
+ export interface PasskeyCredentialMapping<S extends TableModel, C extends TableModel, F extends TableModel, N, Expression extends SqlExpression = SqlExpression> {
123
83
  readonly subject: PasskeySubjectReadTable<S, N, Expression>;
124
84
  readonly credential: PasskeyCredentialReadTable<C, N, Expression>;
125
85
  readonly authority: PasskeyFactorReadTable<F, Expression>;
126
- readonly credentialOwnership: PasskeyCredentialOwnershipTable<Ownership, N, Expression>;
127
- readonly handleOwnership: PasskeyHandleOwnershipTable<Handle, N, Expression>;
128
86
  readonly subjectIds: PasskeySubjectIdCodec<N>;
129
87
  readonly constraints: typeof requiredPasskeyCredentialConstraints;
130
88
  }
131
- /** A stable additional policy row, acquired before RP/credential locks. The
132
- * factory checks column names without erasing the consumer table at its input. */
133
- declare const PasskeyPolicyGuardTypeId: unique symbol;
134
- export interface PasskeyPolicyGuard<Expression extends SqlExpression = SqlExpression> {
135
- readonly [PasskeyPolicyGuardTypeId]: true;
136
- readonly scope: string;
137
- readonly table: object;
138
- readonly columns: ReadonlyArray<string>;
139
- readonly where: (moduleId: string) => Expression;
140
- readonly condition: (moduleId: string) => Expression;
141
- }
142
- export declare const passkeyPolicyGuard: <T extends TableModel, Expression extends SqlExpression = SqlExpression>(input: {
143
- readonly scope: string;
144
- readonly table: T["table"];
145
- readonly columns: ReadonlyArray<PasskeyColumn<T>>;
146
- readonly where: (moduleId: string) => Expression;
147
- readonly condition: (moduleId: string) => Expression;
148
- }) => PasskeyPolicyGuard<Expression>;
149
- export interface PasskeyModuleTable<T extends TableModel, Expression extends SqlExpression = SqlExpression> {
150
- readonly table: T["table"];
151
- readonly moduleId: PasskeyColumn<T>;
152
- readonly status: PasskeyColumn<T>;
153
- readonly policyRevision: PasskeyColumn<T>;
154
- /** All physical fields used by decodeMethodPolicy, including policyRevision. */
155
- readonly policyColumns: ReadonlyArray<PasskeyColumn<T>>;
156
- readonly isActiveStatus: (value: unknown) => boolean;
157
- readonly activeCondition: Expression;
158
- readonly decodeMethodPolicy: (row: Readonly<Partial<T["select"]>>) => PasskeyMethodPolicy;
159
- readonly guards?: ReadonlyArray<PasskeyPolicyGuard<Expression>>;
160
- }
161
- export type PasskeyFlowState = "Pending" | "Claimed" | "Verified" | "Rejected" | "Ambiguous" | "RegistrationAccepted" | "ProvisioningPending";
162
89
  export interface PasskeyFlowInsert {
163
90
  readonly ceremony: PasskeyCeremony;
164
- readonly policy: PasskeyMethodPolicy;
165
- readonly marker: string;
166
91
  }
92
+ /** An immutable, single-use challenge. Consuming or expiring it deletes the row. */
167
93
  export interface PasskeyFlowTable<T extends TableModel> {
168
94
  readonly table: T["table"];
169
95
  readonly moduleId: PasskeyColumn<T>;
170
96
  readonly flowId: PasskeyColumn<T>;
171
- readonly commandId: PasskeyColumn<T>;
172
97
  readonly purpose: PasskeyColumn<T>;
173
- readonly state: PasskeyColumn<T>;
174
- readonly version: PasskeyColumn<T>;
175
- readonly generation: PasskeyColumn<T>;
176
98
  readonly snapshot: PasskeyColumn<T>;
177
- readonly policySnapshot: PasskeyColumn<T>;
178
99
  readonly requestBindingVerifier: PasskeyColumn<T>;
179
100
  readonly requestBindingExpiresAt: PasskeyColumn<T>;
180
101
  readonly issuedAt: PasskeyColumn<T>;
181
102
  readonly expiresAt: PasskeyColumn<T>;
182
- readonly retentionUntil: PasskeyColumn<T>;
183
- readonly claimId: PasskeyColumn<T>;
184
- readonly claimedAt: PasskeyColumn<T>;
185
- readonly claimExpiresAt: PasskeyColumn<T>;
186
- readonly credentialSnapshot: PasskeyColumn<T>;
187
- /** Core SubjectId scope text, not a consumer's native subject ID. */
188
- readonly subjectScope: PasskeyColumn<T>;
189
- readonly targetScope: PasskeyColumn<T>;
190
- readonly states: Readonly<Record<PasskeyFlowState, unknown>>;
191
103
  readonly encodeInsert: (input: PasskeyFlowInsert) => T["insert"];
192
104
  }
193
- export interface PasskeyAdmissionTable<T extends TableModel> {
194
- readonly table: T["table"];
195
- readonly authorityScope: PasskeyColumn<T>;
196
- readonly moduleId: PasskeyColumn<T>;
197
- readonly version: PasskeyColumn<T>;
198
- readonly ownerMarker: PasskeyColumn<T>;
199
- /** One physical clock sample, reused by every charge of this decision. */
200
- readonly admittedAt: PasskeyColumn<T>;
201
- }
202
- export type PasskeyChargeKind = "global" | "subject" | "target";
203
- export interface PasskeyChargeInsert {
204
- readonly moduleId: string;
205
- readonly flowId: string;
206
- readonly purpose: PasskeyCeremony["purpose"];
207
- readonly kind: PasskeyChargeKind;
208
- readonly scope: string;
209
- readonly originalWindowMillis: number;
210
- readonly marker: string;
211
- }
212
- /** Charge scope is canonical core identity text; this subject-free descriptor
213
- * can count all purposes without decoding any unrelated native subject. */
214
- export interface PasskeyChargeTable<T extends TableModel> {
215
- readonly table: T["table"];
216
- readonly moduleId: PasskeyColumn<T>;
217
- readonly flowId: PasskeyColumn<T>;
218
- readonly purpose: PasskeyColumn<T>;
219
- readonly kind: PasskeyColumn<T>;
220
- readonly scope: PasskeyColumn<T>;
221
- readonly originalWindowMillis: PasskeyColumn<T>;
222
- readonly admittedAt: PasskeyColumn<T>;
223
- readonly retainUntil: PasskeyColumn<T>;
224
- readonly version: PasskeyColumn<T>;
225
- readonly ownerMarker: PasskeyColumn<T>;
226
- readonly encodeInsert: (input: PasskeyChargeInsert) => T["insert"];
227
- }
228
105
  export declare const requiredPasskeyPersistenceConstraints: {
229
106
  readonly flow: readonly ["moduleId", "flowId"];
230
- readonly command: readonly ["moduleId", "commandId"];
231
- readonly admission: readonly ["authorityScope", "moduleId"];
232
- readonly charge: readonly ["moduleId", "flowId", "kind"];
233
107
  };
234
- export interface PasskeyCeremonyMapping<Module extends TableModel, Flow extends TableModel, Admission extends TableModel, Charge extends TableModel, Expression extends SqlExpression = SqlExpression> {
108
+ export interface PasskeyCeremonyMapping<Flow extends TableModel, Expression extends SqlExpression = SqlExpression> {
235
109
  readonly moduleId: string;
236
- readonly authorityScope: string;
237
- readonly module: PasskeyModuleTable<Module, Expression>;
238
110
  readonly flow: PasskeyFlowTable<Flow>;
239
- readonly admission: PasskeyAdmissionTable<Admission>;
240
- readonly charge: PasskeyChargeTable<Charge>;
241
111
  readonly clock: PasskeyClock<Expression>;
242
112
  readonly constraints: typeof requiredPasskeyPersistenceConstraints;
243
113
  }
244
- export interface PasskeyPersistenceMapping<Read, Module extends TableModel, Flow extends TableModel, Admission extends TableModel, Charge extends TableModel, N, Expression extends SqlExpression = SqlExpression, Credential extends TableModel = TableModel> extends PasskeyCeremonyMapping<Module, Flow, Admission, Charge, Expression> {
114
+ export interface PasskeyPersistenceMapping<Read, Flow extends TableModel, N, Expression extends SqlExpression = SqlExpression, Credential extends TableModel = TableModel> extends PasskeyCeremonyMapping<Flow, Expression> {
245
115
  readonly read: Read & {
246
116
  readonly subjectIds: PasskeySubjectIdCodec<N>;
247
117
  };
248
118
  readonly telemetry: {
249
119
  readonly lastUsedAt: PasskeyColumn<Credential>;
120
+ readonly encodeBackupEligible: (value: boolean) => unknown;
250
121
  readonly encodeBackupState: (value: boolean) => unknown;
251
122
  };
252
123
  }
253
- export interface PasskeyEnrollmentContextMapping<Read, Module extends TableModel, N, Expression extends SqlExpression = SqlExpression> {
254
- readonly moduleId: string;
255
- readonly read: Read & {
256
- readonly subjectIds: PasskeySubjectIdCodec<N>;
257
- };
258
- readonly module: PasskeyModuleTable<Module, Expression>;
259
- }
260
124
  export interface D1PasskeyMapping {
261
125
  readonly d1: {
262
126
  readonly primary: true;
@@ -1,34 +1,15 @@
1
1
  import { Effect, Layer } from "effect";
2
- import { PasskeyCredentials, PasskeyEnrollmentContext, PasskeyPersistence } from "@yielded/auth/Passkey";
2
+ import { PasskeyCredentials, PasskeyPersistence } from "@yielded/auth/Passkey";
3
3
  //#region src/internal/models/passkey-model.ts
4
4
  const passkeyCredentialsLayer = (services) => Layer.effect(PasskeyCredentials, Effect.map(services, (value) => value.passkeyCredentials));
5
5
  const passkeyPersistenceLayer = (services) => Layer.effect(PasskeyPersistence, Effect.map(services, (value) => value.passkeyPersistence));
6
- const passkeyEnrollmentContextLayer = (services) => Layer.effect(PasskeyEnrollmentContext, Effect.map(services, (value) => value.passkeyEnrollmentContext));
7
6
  const requiredPasskeyCredentialConstraints = {
8
7
  credentialId: ["credentialId"],
9
- factor: ["subjectId", "credentialId"],
10
- credentialOwnership: ["credentialKey"],
11
- handleOwnership: ["handleKey"],
12
- boundSubjectHandle: ["rpId", "subjectId"]
13
- };
14
- /** A stable additional policy row, acquired before RP/credential locks. The
15
- * factory checks column names without erasing the consumer table at its input. */
16
- const PasskeyPolicyGuardTypeId = Symbol("effect-auth/drizzle/PasskeyPolicyGuard");
17
- const passkeyPolicyGuard = (input) => ({
18
- ...input,
19
- [PasskeyPolicyGuardTypeId]: true
20
- });
21
- const requiredPasskeyPersistenceConstraints = {
22
- flow: ["moduleId", "flowId"],
23
- command: ["moduleId", "commandId"],
24
- admission: ["authorityScope", "moduleId"],
25
- charge: [
26
- "moduleId",
27
- "flowId",
28
- "kind"
29
- ]
8
+ credentialKey: ["credentialKey"],
9
+ factor: ["subjectId", "credentialId"]
30
10
  };
11
+ const requiredPasskeyPersistenceConstraints = { flow: ["moduleId", "flowId"] };
31
12
  //#endregion
32
- export { passkeyCredentialsLayer, passkeyEnrollmentContextLayer, passkeyPersistenceLayer, passkeyPolicyGuard, requiredPasskeyCredentialConstraints, requiredPasskeyPersistenceConstraints };
13
+ export { passkeyCredentialsLayer, passkeyPersistenceLayer, requiredPasskeyCredentialConstraints, requiredPasskeyPersistenceConstraints };
33
14
 
34
15
  //# sourceMappingURL=passkey-model.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"passkey-model.mjs","names":[],"sources":["../../../src/internal/models/passkey-model.ts"],"sourcesContent":["import {\n type PasskeyCeremony,\n type PasskeyCredential,\n type PasskeyMethodPolicy,\n PasskeyCredentials,\n PasskeyEnrollmentContext,\n PasskeyPersistence,\n} from \"@yielded/auth/Passkey\";\nimport type { SubjectId } from \"@yielded/auth/Schema\";\nimport { Effect, Layer } from \"effect\";\n\nimport type { TableModel as Table, SqlExpression } from \"../query-operations\";\nimport type { PersistenceMappingError } from \"./common\";\n\nexport type PasskeyColumn<T extends Table> = T[\"column\"];\n\nexport type PasskeyMappingSource<M, RSetup = never> =\n | M\n | Effect.Effect<M, PersistenceMappingError, RSetup>;\n\nexport interface PasskeyCredentialServices {\n readonly passkeyCredentials: PasskeyCredentials[\"Service\"];\n}\n\nexport interface PasskeyPersistenceServices {\n readonly passkeyPersistence: PasskeyPersistence[\"Service\"];\n}\n\nexport interface PasskeyEnrollmentContextServices {\n readonly passkeyEnrollmentContext: PasskeyEnrollmentContext[\"Service\"];\n}\n\nexport const passkeyCredentialsLayer = <E, R>(\n services: Effect.Effect<PasskeyCredentialServices, E, R>,\n): Layer.Layer<PasskeyCredentials, E, R> =>\n Layer.effect(\n PasskeyCredentials,\n Effect.map(services, (value) => value.passkeyCredentials),\n );\n\nexport const passkeyPersistenceLayer = <E, R>(\n services: Effect.Effect<PasskeyPersistenceServices, E, R>,\n): Layer.Layer<PasskeyPersistence, E, R> =>\n Layer.effect(\n PasskeyPersistence,\n Effect.map(services, (value) => value.passkeyPersistence),\n );\n\nexport const passkeyEnrollmentContextLayer = <E, R>(\n services: Effect.Effect<PasskeyEnrollmentContextServices, E, R>,\n): Layer.Layer<PasskeyEnrollmentContext, E, R> =>\n Layer.effect(\n PasskeyEnrollmentContext,\n Effect.map(services, (value) => value.passkeyEnrollmentContext),\n );\n\n/** Native IDs roundtrip exactly; protocol IDs and authentication references are\n * different identities. These callbacks never suspend inside an owner. */\nexport interface PasskeySubjectIdCodec<N> {\n readonly toNative: (id: SubjectId) => N;\n readonly toSubject: (id: N) => SubjectId;\n readonly equals: (left: N, right: N) => boolean;\n}\n\nexport interface PasskeyClock<Expression extends SqlExpression = SqlExpression> {\n readonly encodeInstant: (millis: number) => unknown;\n readonly decodeInstant: (value: unknown) => number;\n readonly engineNowMillis: Expression;\n readonly toMillis: (expression: Expression) => Expression;\n readonly fromMillis: (expression: Expression) => Expression;\n}\n\nexport interface PasskeySubjectReadTable<\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly id: PasskeyColumn<T>;\n readonly status: PasskeyColumn<T>;\n readonly securityRevision: PasskeyColumn<T>;\n readonly decodeId: (row: Readonly<Partial<T[\"select\"]>>) => N;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeCondition: Expression;\n}\n\nexport interface PasskeyFactorReadTable<\n T extends Table,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly subjectId: PasskeyColumn<T>;\n readonly credentialId: PasskeyColumn<T>;\n readonly revision: PasskeyColumn<T>;\n readonly status: PasskeyColumn<T>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeCondition: Expression;\n}\n\n/** decode uses only these declared columns. Counter columns are native integral\n * numbers; BS may use a consumer enum. Name/creation metadata is not required. */\nexport interface PasskeyCredentialReadTable<\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly credentialId: PasskeyColumn<T>;\n readonly subjectId: PasskeyColumn<T>;\n readonly rpId: PasskeyColumn<T>;\n readonly protocolCredentialId: PasskeyColumn<T>;\n readonly credentialKey: PasskeyColumn<T>;\n readonly handleKey: PasskeyColumn<T>;\n readonly userHandle: PasskeyColumn<T>;\n readonly publicKey: PasskeyColumn<T>;\n readonly algorithm: PasskeyColumn<T>;\n readonly profile: PasskeyColumn<T>;\n readonly credentialRevision: PasskeyColumn<T>;\n readonly status: PasskeyColumn<T>;\n readonly primarySignIn: PasskeyColumn<T>;\n readonly enrollmentUserVerified: PasskeyColumn<T>;\n readonly backupEligible: PasskeyColumn<T>;\n readonly backupState: PasskeyColumn<T>;\n readonly counter: PasskeyColumn<T>;\n readonly maximumCounter: PasskeyColumn<T>;\n readonly decode: (\n row: Readonly<Partial<T[\"select\"]>>,\n ) => Omit<PasskeyCredential, \"revision\" | \"active\">;\n readonly decodeSubjectId: (row: Readonly<Partial<T[\"select\"]>>) => N;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeCondition: Expression;\n}\n\nexport interface PasskeyCredentialOwnershipTable<\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly credentialKey: PasskeyColumn<T>;\n readonly rpId: PasskeyColumn<T>;\n readonly protocolCredentialId: PasskeyColumn<T>;\n readonly subjectId: PasskeyColumn<T>;\n readonly credentialId: PasskeyColumn<T>;\n readonly state: PasskeyColumn<T>;\n readonly version: PasskeyColumn<T>;\n readonly reservationId: PasskeyColumn<T>;\n readonly ownedCondition: Expression;\n readonly isOwnedState: (value: unknown) => boolean;\n readonly decodeSubjectId: (row: Readonly<Partial<T[\"select\"]>>) => N;\n}\n\n/** Reservations do not manufacture a subject; bound handles are RP-global. */\nexport interface PasskeyHandleReadTable<T extends Table> {\n readonly table: T[\"table\"];\n readonly handleKey: PasskeyColumn<T>;\n readonly rpId: PasskeyColumn<T>;\n readonly userHandle: PasskeyColumn<T>;\n readonly state: PasskeyColumn<T>;\n readonly version: PasskeyColumn<T>;\n readonly reservationId: PasskeyColumn<T>;\n}\n\nexport interface PasskeyHandleReservationTable<\n T extends Table,\n Expression extends SqlExpression = SqlExpression,\n> extends PasskeyHandleReadTable<T> {\n readonly reservedCondition: Expression;\n readonly isReservedState: (value: unknown) => boolean;\n}\n\nexport interface PasskeyHandleOwnershipTable<\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> extends PasskeyHandleReadTable<T> {\n readonly subjectId: PasskeyColumn<T>;\n readonly ownedCondition: Expression;\n readonly isOwnedState: (value: unknown) => boolean;\n readonly decodeSubjectId: (row: Readonly<Partial<T[\"select\"]>>) => N;\n}\n\nexport const requiredPasskeyCredentialConstraints = {\n credentialId: [\"credentialId\"],\n factor: [\"subjectId\", \"credentialId\"],\n credentialOwnership: [\"credentialKey\"],\n handleOwnership: [\"handleKey\"],\n boundSubjectHandle: [\"rpId\", \"subjectId\"],\n} as const;\n\nexport interface PasskeyCredentialMapping<\n S extends Table,\n C extends Table,\n F extends Table,\n Ownership extends Table,\n Handle extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly subject: PasskeySubjectReadTable<S, N, Expression>;\n readonly credential: PasskeyCredentialReadTable<C, N, Expression>;\n readonly authority: PasskeyFactorReadTable<F, Expression>;\n readonly credentialOwnership: PasskeyCredentialOwnershipTable<Ownership, N, Expression>;\n readonly handleOwnership: PasskeyHandleOwnershipTable<Handle, N, Expression>;\n readonly subjectIds: PasskeySubjectIdCodec<N>;\n readonly constraints: typeof requiredPasskeyCredentialConstraints;\n}\n\n/** A stable additional policy row, acquired before RP/credential locks. The\n * factory checks column names without erasing the consumer table at its input. */\nconst PasskeyPolicyGuardTypeId: unique symbol = Symbol(\"effect-auth/drizzle/PasskeyPolicyGuard\");\n\nexport interface PasskeyPolicyGuard<Expression extends SqlExpression = SqlExpression> {\n readonly [PasskeyPolicyGuardTypeId]: true;\n readonly scope: string;\n readonly table: object;\n readonly columns: ReadonlyArray<string>;\n readonly where: (moduleId: string) => Expression;\n readonly condition: (moduleId: string) => Expression;\n}\n\nexport const passkeyPolicyGuard = <\n T extends Table,\n Expression extends SqlExpression = SqlExpression,\n>(input: {\n readonly scope: string;\n readonly table: T[\"table\"];\n readonly columns: ReadonlyArray<PasskeyColumn<T>>;\n readonly where: (moduleId: string) => Expression;\n readonly condition: (moduleId: string) => Expression;\n}): PasskeyPolicyGuard<Expression> => ({ ...input, [PasskeyPolicyGuardTypeId]: true });\n\nexport interface PasskeyModuleTable<\n T extends Table,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly moduleId: PasskeyColumn<T>;\n readonly status: PasskeyColumn<T>;\n readonly policyRevision: PasskeyColumn<T>;\n /** All physical fields used by decodeMethodPolicy, including policyRevision. */\n readonly policyColumns: ReadonlyArray<PasskeyColumn<T>>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeCondition: Expression;\n readonly decodeMethodPolicy: (row: Readonly<Partial<T[\"select\"]>>) => PasskeyMethodPolicy;\n readonly guards?: ReadonlyArray<PasskeyPolicyGuard<Expression>>;\n}\n\nexport type PasskeyFlowState =\n | \"Pending\"\n | \"Claimed\"\n | \"Verified\"\n | \"Rejected\"\n | \"Ambiguous\"\n | \"RegistrationAccepted\"\n | \"ProvisioningPending\";\n\nexport interface PasskeyFlowInsert {\n readonly ceremony: PasskeyCeremony;\n readonly policy: PasskeyMethodPolicy;\n readonly marker: string;\n}\n\nexport interface PasskeyFlowTable<T extends Table> {\n readonly table: T[\"table\"];\n readonly moduleId: PasskeyColumn<T>;\n readonly flowId: PasskeyColumn<T>;\n readonly commandId: PasskeyColumn<T>;\n readonly purpose: PasskeyColumn<T>;\n readonly state: PasskeyColumn<T>;\n readonly version: PasskeyColumn<T>;\n readonly generation: PasskeyColumn<T>;\n readonly snapshot: PasskeyColumn<T>;\n readonly policySnapshot: PasskeyColumn<T>;\n readonly requestBindingVerifier: PasskeyColumn<T>;\n readonly requestBindingExpiresAt: PasskeyColumn<T>;\n readonly issuedAt: PasskeyColumn<T>;\n readonly expiresAt: PasskeyColumn<T>;\n readonly retentionUntil: PasskeyColumn<T>;\n readonly claimId: PasskeyColumn<T>;\n readonly claimedAt: PasskeyColumn<T>;\n readonly claimExpiresAt: PasskeyColumn<T>;\n readonly credentialSnapshot: PasskeyColumn<T>;\n /** Core SubjectId scope text, not a consumer's native subject ID. */\n readonly subjectScope: PasskeyColumn<T>;\n readonly targetScope: PasskeyColumn<T>;\n readonly states: Readonly<Record<PasskeyFlowState, unknown>>;\n readonly encodeInsert: (input: PasskeyFlowInsert) => T[\"insert\"];\n}\n\nexport interface PasskeyAdmissionTable<T extends Table> {\n readonly table: T[\"table\"];\n readonly authorityScope: PasskeyColumn<T>;\n readonly moduleId: PasskeyColumn<T>;\n readonly version: PasskeyColumn<T>;\n readonly ownerMarker: PasskeyColumn<T>;\n /** One physical clock sample, reused by every charge of this decision. */\n readonly admittedAt: PasskeyColumn<T>;\n}\n\nexport type PasskeyChargeKind = \"global\" | \"subject\" | \"target\";\n\nexport interface PasskeyChargeInsert {\n readonly moduleId: string;\n readonly flowId: string;\n readonly purpose: PasskeyCeremony[\"purpose\"];\n readonly kind: PasskeyChargeKind;\n readonly scope: string;\n readonly originalWindowMillis: number;\n readonly marker: string;\n}\n\n/** Charge scope is canonical core identity text; this subject-free descriptor\n * can count all purposes without decoding any unrelated native subject. */\nexport interface PasskeyChargeTable<T extends Table> {\n readonly table: T[\"table\"];\n readonly moduleId: PasskeyColumn<T>;\n readonly flowId: PasskeyColumn<T>;\n readonly purpose: PasskeyColumn<T>;\n readonly kind: PasskeyColumn<T>;\n readonly scope: PasskeyColumn<T>;\n readonly originalWindowMillis: PasskeyColumn<T>;\n readonly admittedAt: PasskeyColumn<T>;\n readonly retainUntil: PasskeyColumn<T>;\n readonly version: PasskeyColumn<T>;\n readonly ownerMarker: PasskeyColumn<T>;\n readonly encodeInsert: (input: PasskeyChargeInsert) => T[\"insert\"];\n}\n\nexport const requiredPasskeyPersistenceConstraints = {\n flow: [\"moduleId\", \"flowId\"],\n command: [\"moduleId\", \"commandId\"],\n admission: [\"authorityScope\", \"moduleId\"],\n charge: [\"moduleId\", \"flowId\", \"kind\"],\n} as const;\n\nexport interface PasskeyCeremonyMapping<\n Module extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly moduleId: string;\n readonly authorityScope: string;\n readonly module: PasskeyModuleTable<Module, Expression>;\n readonly flow: PasskeyFlowTable<Flow>;\n readonly admission: PasskeyAdmissionTable<Admission>;\n readonly charge: PasskeyChargeTable<Charge>;\n readonly clock: PasskeyClock<Expression>;\n readonly constraints: typeof requiredPasskeyPersistenceConstraints;\n}\n\nexport interface PasskeyPersistenceMapping<\n Read,\n Module extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n Credential extends Table = Table,\n> extends PasskeyCeremonyMapping<Module, Flow, Admission, Charge, Expression> {\n readonly read: Read & {\n readonly subjectIds: PasskeySubjectIdCodec<N>;\n };\n readonly telemetry: {\n readonly lastUsedAt: PasskeyColumn<Credential>;\n readonly encodeBackupState: (value: boolean) => unknown;\n };\n}\n\nexport interface PasskeyEnrollmentContextMapping<\n Read,\n Module extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly moduleId: string;\n readonly read: Read & {\n readonly subjectIds: PasskeySubjectIdCodec<N>;\n };\n readonly module: PasskeyModuleTable<Module, Expression>;\n}\n\nexport interface D1PasskeyMapping {\n readonly d1: {\n readonly primary: true;\n };\n}\n"],"mappings":";;;AAgCA,MAAa,2BACX,aAEA,MAAM,OACJ,oBACA,OAAO,IAAI,WAAW,UAAU,MAAM,kBAAkB,CAC1D;AAEF,MAAa,2BACX,aAEA,MAAM,OACJ,oBACA,OAAO,IAAI,WAAW,UAAU,MAAM,kBAAkB,CAC1D;AAEF,MAAa,iCACX,aAEA,MAAM,OACJ,0BACA,OAAO,IAAI,WAAW,UAAU,MAAM,wBAAwB,CAChE;AAgIF,MAAa,uCAAuC;CAClD,cAAc,CAAC,cAAc;CAC7B,QAAQ,CAAC,aAAa,cAAc;CACpC,qBAAqB,CAAC,eAAe;CACrC,iBAAiB,CAAC,WAAW;CAC7B,oBAAoB,CAAC,QAAQ,WAAW;AAC1C;;;AAsBA,MAAM,2BAA0C,OAAO,wCAAwC;AAW/F,MAAa,sBAGX,WAMqC;CAAE,GAAG;EAAQ,2BAA2B;AAAK;AAmGpF,MAAa,wCAAwC;CACnD,MAAM,CAAC,YAAY,QAAQ;CAC3B,SAAS,CAAC,YAAY,WAAW;CACjC,WAAW,CAAC,kBAAkB,UAAU;CACxC,QAAQ;EAAC;EAAY;EAAU;CAAM;AACvC"}
1
+ {"version":3,"file":"passkey-model.mjs","names":[],"sources":["../../../src/internal/models/passkey-model.ts"],"sourcesContent":["import {\n type PasskeyCeremony,\n type PasskeyCredential,\n PasskeyCredentials,\n PasskeyPersistence,\n} from \"@yielded/auth/Passkey\";\nimport type { SubjectId } from \"@yielded/auth/Schema\";\nimport type { AuthenticationRequirement } from \"@yielded/auth/Sessions\";\nimport { Effect, Layer } from \"effect\";\n\nimport type { TableModel as Table, SqlExpression } from \"../table-model\";\nimport type { PersistenceMappingError } from \"./common\";\n\nexport type PasskeyColumn<T extends Table> = T[\"column\"];\n\nexport type PasskeyMappingSource<M, RSetup = never> =\n | M\n | Effect.Effect<M, PersistenceMappingError, RSetup>;\n\nexport interface PasskeyCredentialServices {\n readonly passkeyCredentials: PasskeyCredentials[\"Service\"];\n}\n\nexport interface PasskeyPersistenceServices {\n readonly passkeyPersistence: PasskeyPersistence[\"Service\"];\n}\n\nexport const passkeyCredentialsLayer = <E, R>(\n services: Effect.Effect<PasskeyCredentialServices, E, R>,\n): Layer.Layer<PasskeyCredentials, E, R> =>\n Layer.effect(\n PasskeyCredentials,\n Effect.map(services, (value) => value.passkeyCredentials),\n );\n\nexport const passkeyPersistenceLayer = <E, R>(\n services: Effect.Effect<PasskeyPersistenceServices, E, R>,\n): Layer.Layer<PasskeyPersistence, E, R> =>\n Layer.effect(\n PasskeyPersistence,\n Effect.map(services, (value) => value.passkeyPersistence),\n );\n\n/** Native IDs roundtrip exactly; protocol IDs and authentication references are\n * different identities. These callbacks never suspend inside an owner. */\nexport interface PasskeySubjectIdCodec<N> {\n readonly toNative: (id: SubjectId) => N;\n readonly toSubject: (id: N) => SubjectId;\n readonly equals: (left: N, right: N) => boolean;\n}\n\nexport interface PasskeyClock<Expression extends SqlExpression = SqlExpression> {\n readonly encodeInstant: (millis: number) => unknown;\n readonly decodeInstant: (value: unknown) => number;\n readonly engineNowMillis: Expression;\n readonly toMillis: (expression: Expression) => Expression;\n readonly fromMillis: (expression: Expression) => Expression;\n}\n\nexport interface PasskeySubjectReadTable<\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly id: PasskeyColumn<T>;\n readonly status: PasskeyColumn<T>;\n readonly securityRevision: PasskeyColumn<T>;\n readonly decodeRequirement: (\n row: T[\"select\"],\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n readonly decodeId: (row: Readonly<Partial<T[\"select\"]>>) => N;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeCondition: Expression;\n}\n\nexport interface PasskeyFactorReadTable<\n T extends Table,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly subjectId: PasskeyColumn<T>;\n readonly credentialId: PasskeyColumn<T>;\n readonly revision: PasskeyColumn<T>;\n readonly status: PasskeyColumn<T>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeCondition: Expression;\n}\n\n/** decode uses only these declared columns. Counter columns are native integral\n * numbers; BS may use a consumer enum. Name/creation metadata is not required. */\nexport interface PasskeyCredentialReadTable<\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly credentialId: PasskeyColumn<T>;\n readonly subjectId: PasskeyColumn<T>;\n readonly rpId: PasskeyColumn<T>;\n readonly protocolCredentialId: PasskeyColumn<T>;\n readonly credentialKey: PasskeyColumn<T>;\n readonly userHandle: PasskeyColumn<T>;\n readonly publicKey: PasskeyColumn<T>;\n readonly algorithm: PasskeyColumn<T>;\n readonly profile: PasskeyColumn<T>;\n readonly credentialRevision: PasskeyColumn<T>;\n readonly status: PasskeyColumn<T>;\n readonly primarySignIn: PasskeyColumn<T>;\n readonly enrollmentUserVerified: PasskeyColumn<T>;\n readonly backupEligible: PasskeyColumn<T>;\n readonly backupState: PasskeyColumn<T>;\n readonly counter: PasskeyColumn<T>;\n readonly decode: (\n row: Readonly<Partial<T[\"select\"]>>,\n ) => Omit<PasskeyCredential, \"revision\" | \"active\" | \"requirement\">;\n readonly decodeSubjectId: (row: Readonly<Partial<T[\"select\"]>>) => N;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeCondition: Expression;\n}\n\nexport const requiredPasskeyCredentialConstraints = {\n credentialId: [\"credentialId\"],\n credentialKey: [\"credentialKey\"],\n factor: [\"subjectId\", \"credentialId\"],\n} as const;\n\nexport interface PasskeyCredentialMapping<\n S extends Table,\n C extends Table,\n F extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly subject: PasskeySubjectReadTable<S, N, Expression>;\n readonly credential: PasskeyCredentialReadTable<C, N, Expression>;\n readonly authority: PasskeyFactorReadTable<F, Expression>;\n readonly subjectIds: PasskeySubjectIdCodec<N>;\n readonly constraints: typeof requiredPasskeyCredentialConstraints;\n}\n\nexport interface PasskeyFlowInsert {\n readonly ceremony: PasskeyCeremony;\n}\n\n/** An immutable, single-use challenge. Consuming or expiring it deletes the row. */\nexport interface PasskeyFlowTable<T extends Table> {\n readonly table: T[\"table\"];\n readonly moduleId: PasskeyColumn<T>;\n readonly flowId: PasskeyColumn<T>;\n readonly purpose: PasskeyColumn<T>;\n readonly snapshot: PasskeyColumn<T>;\n readonly requestBindingVerifier: PasskeyColumn<T>;\n readonly requestBindingExpiresAt: PasskeyColumn<T>;\n readonly issuedAt: PasskeyColumn<T>;\n readonly expiresAt: PasskeyColumn<T>;\n readonly encodeInsert: (input: PasskeyFlowInsert) => T[\"insert\"];\n}\n\nexport const requiredPasskeyPersistenceConstraints = {\n flow: [\"moduleId\", \"flowId\"],\n} as const;\n\nexport interface PasskeyCeremonyMapping<\n Flow extends Table,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly moduleId: string;\n readonly flow: PasskeyFlowTable<Flow>;\n readonly clock: PasskeyClock<Expression>;\n readonly constraints: typeof requiredPasskeyPersistenceConstraints;\n}\n\nexport interface PasskeyPersistenceMapping<\n Read,\n Flow extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n Credential extends Table = Table,\n> extends PasskeyCeremonyMapping<Flow, Expression> {\n readonly read: Read & {\n readonly subjectIds: PasskeySubjectIdCodec<N>;\n };\n readonly telemetry: {\n readonly lastUsedAt: PasskeyColumn<Credential>;\n readonly encodeBackupEligible: (value: boolean) => unknown;\n readonly encodeBackupState: (value: boolean) => unknown;\n };\n}\n\nexport interface D1PasskeyMapping {\n readonly d1: { readonly primary: true };\n}\n"],"mappings":";;;AA2BA,MAAa,2BACX,aAEA,MAAM,OACJ,oBACA,OAAO,IAAI,WAAW,UAAU,MAAM,kBAAkB,CAC1D;AAEF,MAAa,2BACX,aAEA,MAAM,OACJ,oBACA,OAAO,IAAI,WAAW,UAAU,MAAM,kBAAkB,CAC1D;AAgFF,MAAa,uCAAuC;CAClD,cAAc,CAAC,cAAc;CAC7B,eAAe,CAAC,eAAe;CAC/B,QAAQ,CAAC,aAAa,cAAc;AACtC;AAkCA,MAAa,wCAAwC,EACnD,MAAM,CAAC,YAAY,QAAQ,EAC7B"}
@@ -1,49 +1,15 @@
1
- import { SqlExpression, TableModel } from "../query-operations.mjs";
2
- import { PasskeyCeremonyMapping, PasskeyChargeTable, PasskeyColumn, PasskeyFlowTable, PasskeyHandleReservationTable, PasskeyPersistenceServices } from "./passkey-model.mjs";
1
+ import { SqlExpression, TableModel } from "../table-model.mjs";
2
+ import { PasskeyCeremonyMapping, PasskeyPersistenceServices } from "./passkey-model.mjs";
3
3
  //#region src/internal/models/passkey-registration-ceremony-model.d.ts
4
4
  export interface PasskeyRegistrationCeremonyCapabilities {
5
5
  readonly purposes: readonly ["registration"];
6
6
  readonly issue: "registration-authority";
7
- readonly assertionSettlement: false;
7
+ readonly assertionConsumption: false;
8
8
  }
9
9
  export interface PasskeyRegistrationCeremonyServices extends PasskeyPersistenceServices {
10
10
  readonly capabilities: PasskeyRegistrationCeremonyCapabilities;
11
11
  }
12
- /** Read-only custody supplied by a separate registration issuance authority.
13
- * No application payload codec, subject codec or provisioning callback runs here. */
14
- export interface PasskeyRegistrationIntentReadTable<T extends TableModel, Expression extends SqlExpression = SqlExpression> {
15
- readonly table: T["table"];
16
- readonly moduleId: PasskeyColumn<T>;
17
- readonly flowId: PasskeyColumn<T>;
18
- readonly commandId: PasskeyColumn<T>;
19
- readonly state: PasskeyColumn<T>;
20
- readonly version: PasskeyColumn<T>;
21
- readonly fingerprint: PasskeyColumn<T>;
22
- readonly handleKey: PasskeyColumn<T>;
23
- readonly reservationId: PasskeyColumn<T>;
24
- readonly ceremonySnapshot: PasskeyColumn<T>;
25
- /** Already validated by the issuing authority; compare opaque bytes only. */
26
- readonly applicationSnapshot: PasskeyColumn<T>;
27
- readonly pendingCondition: Expression;
28
- readonly isPendingState: (value: unknown) => boolean;
29
- /** Any unresolved initial intent or provisioning job; cleanup never releases it. */
30
- readonly custodyCondition: Expression;
31
- }
32
- export declare const requiredPasskeyRegistrationCeremonyConstraints: {
33
- readonly flow: readonly ["moduleId", "flowId"];
34
- readonly command: readonly ["moduleId", "commandId"];
35
- readonly admission: readonly ["authorityScope", "moduleId"];
36
- readonly charge: readonly ["moduleId", "flowId", "kind"];
37
- readonly intentFlow: readonly ["moduleId", "flowId"];
38
- readonly intentCommand: readonly ["moduleId", "commandId"];
39
- readonly handle: readonly ["handleKey"];
40
- };
41
- export interface PasskeyRegistrationCeremonyMapping<Module extends TableModel, Flow extends TableModel, Admission extends TableModel, Charge extends TableModel, Intent extends TableModel, Handle extends TableModel, Expression extends SqlExpression = SqlExpression> extends Omit<PasskeyCeremonyMapping<Module, Flow, Admission, Charge, Expression>, "constraints" | "flow" | "charge"> {
42
- readonly flow: Omit<PasskeyFlowTable<Flow>, "encodeInsert">;
43
- readonly charge: Omit<PasskeyChargeTable<Charge>, "encodeInsert">;
44
- readonly intent: PasskeyRegistrationIntentReadTable<Intent, Expression>;
45
- readonly handle: PasskeyHandleReservationTable<Handle, Expression>;
46
- readonly constraints: typeof requiredPasskeyRegistrationCeremonyConstraints;
47
- }
12
+ /** The registration authority owns insertion and consumption of the challenge. */
13
+ export type PasskeyRegistrationCeremonyMapping<Flow extends TableModel, Expression extends SqlExpression = SqlExpression> = PasskeyCeremonyMapping<Flow, Expression>;
48
14
  //#endregion
49
15
  //# sourceMappingURL=passkey-registration-ceremony-model.d.mts.map