@yielded/auth-persistence 0.1.0-beta.24 → 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 +16 -82
  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 +28 -148
  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 -346
  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 -1555
  439. package/src/internal/oauth/accounts.ts +0 -838
  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 -678
  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 -1522
  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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-policy.mjs","names":[],"sources":["../../src/internal/email-policy.ts"],"sourcesContent":["import {\n type EmailAddressMutation,\n type EmailAddressTarget,\n type EmailAction,\n EmailUnavailable,\n snapshotEmailCredential,\n snapshotEmailRequirement,\n snapshotEmailRevision,\n} from \"@yielded/auth/Email\";\nimport type { LoginIdentifier } from \"@yielded/auth/Identity\";\nimport {\n snapshotAuthenticationEvidence,\n type AuthenticationRevision,\n type AuthenticationRequirement,\n type SecurityRevision,\n} from \"@yielded/auth/Sessions\";\nimport { Effect } from \"effect\";\n\nimport { PersistenceMappingError } from \"./mapping-error\";\nimport type { AnyEmailAddressMapping } from \"./models/email-model\";\nimport { passwordEvidenceSatisfiedAt } from \"./password-policy\";\n\nconst unavailable = () => EmailUnavailable.make({});\n\nconst sameIdentifier = (left: LoginIdentifier, right: LoginIdentifier) =>\n left.namespace === right.namespace && left.value === right.value;\n\nexport type EmailWorkflowPolicy = Pick<\n AnyEmailAddressMapping,\n | \"allocateCredentialId\"\n | \"allocateCredentialIdSync\"\n | \"allocateRevision\"\n | \"allocateRevisionSync\"\n | \"sessionInvalidation\"\n | \"isIdentifierConflict\"\n | \"isCredentialConflict\"\n> & {\n readonly subject: Pick<\n AnyEmailAddressMapping[\"subject\"],\n \"nextSecurityRevision\" | \"nextSecurityRevisionSync\"\n >;\n};\n\nexport const sameEmailRevision = (left: AuthenticationRevision, right: AuthenticationRevision) => {\n if (\n left.subjectId !== right.subjectId ||\n left.securityRevision !== right.securityRevision ||\n left.credentials.length !== right.credentials.length\n )\n return false;\n\n const expected = [...left.credentials].sort((a, b) =>\n a.credentialId.localeCompare(b.credentialId),\n );\n\n const actual = [...right.credentials].sort((a, b) =>\n a.credentialId.localeCompare(b.credentialId),\n );\n\n return expected.every(\n (item, index) =>\n item.credentialId === actual[index]!.credentialId &&\n item.revision === actual[index]!.revision,\n );\n};\n\nexport const emailActionModule = (moduleId: string, action: EmailAction) =>\n `${moduleId}/${action === \"verify-address\" ? \"verify-address\" : \"change-address\"}`;\n\nexport const emailActionPurpose = (action: EmailAction) =>\n action === \"verify-address\" ? \"email-address-verification\" : \"email-address-change\";\n\nexport const emailRedemptionMatches = (input: EmailAddressMutation, action: EmailAction) => {\n const completion = input.redemption.input;\n const binding = completion.binding;\n\n return (\n completion.moduleId === emailActionModule(input.moduleId, action) &&\n completion.purpose === emailActionPurpose(action) &&\n binding._tag === \"IdentifierChange\" &&\n sameIdentifier(binding.identifier, input.target) &&\n sameEmailRevision(binding.revision, input.captured.revision)\n );\n};\n\nexport const snapshotEmailMutation = Effect.fn(\"EmailAddressPersistence.snapshotMutation\")(\n function* (input: EmailAddressMutation) {\n const evidence = yield* snapshotAuthenticationEvidence(input.authorization.evidence).pipe(\n Effect.mapError(unavailable),\n );\n\n const requirement = yield* snapshotEmailRequirement(input.authorization.requirement);\n\n const source =\n input.captured.source === undefined\n ? undefined\n : yield* snapshotEmailCredential(input.captured.source);\n\n return Object.freeze({\n ...input,\n target: Object.freeze({ ...input.target }),\n ...(input.invalidation === undefined\n ? {}\n : { invalidation: Object.freeze({ ...input.invalidation }) }),\n captured: Object.freeze({\n eligible: input.captured.eligible,\n revision: snapshotEmailRevision(input.captured.revision),\n ...(input.captured.targetIdentifierRevision === undefined\n ? {}\n : { targetIdentifierRevision: input.captured.targetIdentifierRevision }),\n ...(source === undefined ? {} : { source }),\n }),\n authorization: Object.freeze({\n challenge: Object.freeze({\n ...input.authorization.challenge,\n target: Object.freeze({ ...input.authorization.challenge.target }),\n revision: snapshotEmailRevision(input.authorization.challenge.revision),\n }),\n evidence,\n requirement,\n }),\n });\n },\n);\n\nexport const validateEmailMutation = Effect.fn(\"EmailAddressPersistence.validateAuthority\")(\n function* (\n policy: EmailWorkflowPolicy,\n input: EmailAddressMutation,\n action: EmailAction,\n current: Pick<EmailMutationRead, \"target\" | \"requirement\"> | undefined,\n now: number,\n ) {\n const confirmsExisting =\n action === \"verify-address\" && input.captured.targetIdentifierRevision !== undefined;\n\n if (\n !input.captured.eligible ||\n !emailRedemptionMatches(input, action) ||\n input.authorization.challenge.moduleId !== input.moduleId ||\n input.authorization.challenge.action !== action ||\n input.authorization.challenge.commandId !== input.commandId ||\n !sameIdentifier(input.authorization.challenge.target, input.target) ||\n input.authorization.challenge.sourceCredentialId !== input.captured.source?.credentialId ||\n !sameEmailRevision(input.authorization.challenge.revision, input.captured.revision) ||\n input.authorization.challenge.targetIdentifierRevision !==\n input.captured.targetIdentifierRevision ||\n (input.authorization.evidence.flowId as string) !== (input.commandId as string) ||\n input.authorization.evidence.bindingDigest !== input.authorization.challenge.bindingDigest ||\n !sameEmailRevision(input.authorization.evidence.revision, input.captured.revision) ||\n (action === \"verify-address\" && input.captured.source !== undefined) ||\n (action === \"change-address\" && input.captured.source === undefined) ||\n confirmsExisting !== (input.invalidation === undefined) ||\n (input.invalidation?.existingSessions === \"immediate\" &&\n policy.sessionInvalidation !== \"same-authority-immediate\")\n )\n return false;\n\n if (\n current === undefined ||\n !current.target.eligible ||\n !sameEmailRevision(current.target.revision, input.captured.revision) ||\n current.target.targetIdentifierRevision !== input.captured.targetIdentifierRevision ||\n (input.captured.source !== undefined &&\n (current.target.source === undefined ||\n current.target.source.identifierRevision !== input.captured.source.identifierRevision ||\n current.target.source.credentialRevision !== input.captured.source.credentialRevision ||\n !sameIdentifier(current.target.source.identifier, input.captured.source.identifier)))\n )\n return false;\n\n const currentRequirement = yield* current.requirement;\n\n return (\n passwordEvidenceSatisfiedAt(\n input.authorization.evidence,\n input.authorization.requirement,\n now,\n ) && passwordEvidenceSatisfiedAt(input.authorization.evidence, currentRequirement, now)\n );\n },\n);\n\nexport const allocateEmailValue = <A>(\n mode: \"interactive\" | \"synchronous\",\n asynchronous: Effect.Effect<A, PersistenceMappingError> | undefined,\n synchronous: (() => A) | undefined,\n) => {\n if (mode === \"synchronous\")\n return synchronous === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: synchronous,\n catch: (cause) => PersistenceMappingError.make({ operation: \"mapping\", cause }),\n });\n if (asynchronous !== undefined) return asynchronous;\n\n return synchronous === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: synchronous,\n catch: (cause) => PersistenceMappingError.make({ operation: \"mapping\", cause }),\n });\n};\n\nexport const allocateEmailSecurityRevision = (\n mapping: EmailWorkflowPolicy,\n mode: \"interactive\" | \"synchronous\",\n current: SecurityRevision,\n) => {\n if (mode === \"synchronous\")\n return mapping.subject.nextSecurityRevisionSync === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: () => mapping.subject.nextSecurityRevisionSync!(current),\n catch: (cause) => PersistenceMappingError.make({ operation: \"mapping\", cause }),\n });\n if (mapping.subject.nextSecurityRevision !== undefined)\n return mapping.subject.nextSecurityRevision(current);\n if (mapping.subject.nextSecurityRevisionSync !== undefined)\n return Effect.try({\n try: () => mapping.subject.nextSecurityRevisionSync!(current),\n catch: (cause) => PersistenceMappingError.make({ operation: \"mapping\", cause }),\n });\n\n return Effect.fail(unavailable());\n};\n\nexport interface EmailMutationRead {\n readonly target: EmailAddressTarget;\n readonly requirement: Effect.Effect<\n AuthenticationRequirement,\n EmailUnavailable | PersistenceMappingError\n >;\n}\n"],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { AnyProofPersistenceMapping } from "./models/proof-model.mjs";
2
+ import { AnyEmailRegistrationMapping } from "./models/email-model.mjs";
3
+ import { NativeSqlTables } from "./native-sql-table.mjs";
4
+ import { Crypto, Effect } from "effect";
5
+ import { EmailCommandId, EmailRegistrationDecision, EmailUnavailable, PrepareEmailCommit } from "@yielded/auth/Email";
6
+ import { LifecycleHooks, PreparedCommit } from "@yielded/auth/Hooks";
7
+ import { ProofRedemptionPlan } from "@yielded/auth/Proofs";
8
+ import { SqlClient } from "effect/sql/SqlClient";
9
+ import { LoginIdentifier } from "@yielded/auth/Identity";
10
+ import { TokenDigest } from "@yielded/auth/Schema";
11
+ //#region src/internal/email-registration-native.d.ts
12
+ export interface EmailRegistrationAuthority<Registration> {
13
+ readonly inspect: (input: {
14
+ readonly identifier: LoginIdentifier;
15
+ readonly registration: Registration;
16
+ }) => Effect.Effect<{
17
+ readonly fingerprint: TokenDigest;
18
+ readonly eligible: boolean;
19
+ }, EmailUnavailable>;
20
+ readonly registerWithProof: <A>(input: {
21
+ readonly moduleId: string;
22
+ readonly commandId: EmailCommandId;
23
+ readonly requestId: string;
24
+ readonly identifier: LoginIdentifier;
25
+ readonly registration: Registration;
26
+ readonly fingerprint: TokenDigest;
27
+ readonly redemption: ProofRedemptionPlan;
28
+ }, prepare: PrepareEmailCommit<EmailRegistrationDecision, A>) => Effect.Effect<PreparedCommit<A>, EmailUnavailable>;
29
+ }
30
+ /** Proof redemption, SQL provisioning, and verified ownership commit together. No registration receipt survives the proof. */
31
+ export declare const makeNativeEmailRegistrationServices: <Registration>(tables: NativeSqlTables, mapping: AnyEmailRegistrationMapping<Registration>, proofs: AnyProofPersistenceMapping, batch?: {
32
+ readonly client: SqlClient;
33
+ readonly execute: (statements: ReadonlyArray<import("effect/sql/Statement").Statement<unknown>>) => Effect.Effect<void, import("effect/sql/SqlError").SqlError>;
34
+ } | undefined) => Effect.Effect<{
35
+ readonly registrationAuthority: EmailRegistrationAuthority<Registration>;
36
+ }, never, Crypto.Crypto | LifecycleHooks | SqlClient>;
37
+ //#endregion
38
+ //# sourceMappingURL=email-registration-native.d.mts.map
@@ -0,0 +1,171 @@
1
+ import { PersistenceMappingError } from "./mapping-error.mjs";
2
+ import { sqlBatchAssertion } from "./d1-planning.mjs";
3
+ import { exactSqlText, executeSqlChange } from "./sql-change.mjs";
4
+ import { emailUnavailable, ensureEmail } from "./email-native-state.mjs";
5
+ import { allocateEmailValue } from "./email-policy.mjs";
6
+ import { SqlBatchCommit, appendSqlBatchStatement, makeSqlCommitExecutor, registerSqlBatchPostcondition, registerSqlCommitReceipt, registerSqlPostcondition } from "./sql-commit.mjs";
7
+ import { makeNativeProofStore } from "./proof-native.mjs";
8
+ import { Crypto, Effect, Schema } from "effect";
9
+ import "@yielded/auth/Email";
10
+ import { CurrentCommitJournal } from "@yielded/auth/Hooks";
11
+ import { ProofRedemptionInput } from "@yielded/auth/Proofs";
12
+ import { SecurityRevision } from "@yielded/auth/Sessions";
13
+ import { SqlClient } from "effect/sql/SqlClient";
14
+ //#region src/internal/email-registration-native.ts
15
+ /** Proof redemption, SQL provisioning, and verified ownership commit together. No registration receipt survives the proof. */
16
+ const makeNativeEmailRegistrationServices = Effect.fnUntraced(function* (tables, mapping, proofs, batch) {
17
+ const sql = (yield* SqlClient).withoutTransforms(), executor = yield* makeSqlCommitExecutor(emailUnavailable), crypto = yield* Crypto.Crypto;
18
+ const s = mapping.subject, i = mapping.identifier, c = mapping.credential, a = mapping.authorityCredential;
19
+ const subject = tables(s.table), identifier = tables(i.table), credential = tables(c.table), authority = tables(a.table);
20
+ const exact = (t, key, value) => exactSqlText(sql, t.column(key), t.value(key, value));
21
+ const id = (t, key, value) => sql`${t.column(key)} = ${t.value(key, value)}`;
22
+ const identifierKey = (value) => sql.and([exact(identifier, i.namespace, value.namespace), exact(identifier, i.value, value.value)]);
23
+ const lock = sql.onDialectOrElse({
24
+ sqlite: () => sql``,
25
+ orElse: () => sql`for update`
26
+ }), now = tables.expression(mapping.clock.engineNowMillis), mode = "interactive";
27
+ const run = (work) => batch === void 0 ? executor.run(work.pipe(Effect.provideService(Crypto.Crypto, crypto))) : executor.batch(work.pipe(Effect.provideService(Crypto.Crypto, crypto))).pipe(Effect.provideService(SqlBatchCommit, batch));
28
+ const stage = Effect.fnUntraced(function* (statement) {
29
+ if (batch === void 0) ensureEmail((yield* executeSqlChange(sql, statement)) === 1);
30
+ else {
31
+ yield* appendSqlBatchStatement(sql`${statement}`);
32
+ yield* appendSqlBatchStatement(sqlBatchAssertion(sql, sql`changes() = 1`));
33
+ }
34
+ });
35
+ const prepare = (decision, project) => Effect.gen(function* () {
36
+ const receipt = project(decision, yield* CurrentCommitJournal);
37
+ yield* registerSqlCommitReceipt(receipt);
38
+ return receipt;
39
+ });
40
+ return { registrationAuthority: {
41
+ inspect: (input) => executor.read(mapping.inspect(input)),
42
+ registerWithProof: (original, project) => Effect.gen(function* () {
43
+ const registration = yield* mapping.snapshotRegistration(original.registration);
44
+ const inspection = yield* mapping.inspect({
45
+ identifier: original.identifier,
46
+ registration: yield* mapping.snapshotRegistration(registration)
47
+ });
48
+ const redemption = yield* Schema.decodeEffect(Schema.toCodecIso(ProofRedemptionInput))(yield* Schema.encodeEffect(Schema.toCodecIso(ProofRedemptionInput))(original.redemption.input));
49
+ const input = {
50
+ ...original,
51
+ identifier: { ...original.identifier },
52
+ registration,
53
+ redemption
54
+ };
55
+ return yield* run(Effect.gen(function* () {
56
+ const binding = redemption.binding;
57
+ if (!inspection.eligible || inspection.fingerprint !== input.fingerprint || redemption.moduleId !== `${input.moduleId}/registration` || redemption.purpose !== "email-code-registration" || binding._tag !== "Identifier" || binding.identifier.namespace !== input.identifier.namespace || binding.identifier.value !== input.identifier.value || input.requestId !== `email-registration:${input.moduleId}:${redemption.proofId}`) return yield* prepare({ _tag: "Rejected" }, project);
58
+ const priorRows = yield* sql`select ${identifier.fields("email_registration_identifier_")} from ${identifier.name} where ${identifierKey(input.identifier)} limit 2`;
59
+ ensureEmail(priorRows.length <= 1);
60
+ const prior = priorRows[0] === void 0 ? void 0 : identifier.decode(priorRows[0], "email_registration_identifier_");
61
+ let previous;
62
+ if (prior !== void 0) {
63
+ ensureEmail(prior[i.namespace] === input.identifier.namespace && prior[i.value] === input.identifier.value);
64
+ if (prior[i.verifiedAt] !== null || !i.isMutableTarget(prior)) return yield* prepare({ _tag: "Rejected" }, project);
65
+ const previousSubject = yield* mapping.subjectId.toSubject(prior[i.subjectId]), native = yield* mapping.subjectId.toNative(previousSubject);
66
+ const rows = yield* sql`select ${subject.fields("email_registration_old_subject_")} from ${subject.name} where ${id(subject, s.id, native)} limit 2 ${batch === void 0 ? lock : sql``}`;
67
+ if (rows.length !== 1) return yield* prepare({ _tag: "Rejected" }, project);
68
+ const row = subject.decode(rows[0], "email_registration_old_subject_");
69
+ ensureEmail((yield* mapping.subjectId.toSubject(row[s.id])) === previousSubject);
70
+ const currentRows = yield* sql`select ${identifier.fields("email_registration_current_identifier_")} from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${exact(identifier, i.bindingRevision, prior[i.bindingRevision])} and ${identifier.column(i.verifiedAt)} is null limit 2`;
71
+ if (currentRows.length !== 1 || !i.isMutableTarget(identifier.decode(currentRows[0], "email_registration_current_identifier_"))) return yield* prepare({ _tag: "Rejected" }, project);
72
+ if (batch !== void 0) {
73
+ ensureEmail(i.d1MutableTargetCondition !== void 0);
74
+ yield* appendSqlBatchStatement(sqlBatchAssertion(sql, sql`exists(select 1 from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${exact(identifier, i.bindingRevision, prior[i.bindingRevision])} and ${identifier.column(i.verifiedAt)} is null and ${tables.expression(i.d1MutableTargetCondition({
75
+ identifier: input.identifier,
76
+ nativeSubjectId: native
77
+ }))})`));
78
+ }
79
+ previous = {
80
+ native,
81
+ securityRevision: yield* Schema.decodeUnknownEffect(SecurityRevision)(row[s.securityRevision]),
82
+ bindingRevision: yield* Schema.decodeUnknownEffect(SecurityRevision)(prior[i.bindingRevision])
83
+ };
84
+ }
85
+ const redeemed = yield* (yield* makeNativeProofStore(tables, proofs, batch !== void 0)).redeemLocked(redemption);
86
+ yield* registerSqlCommitReceipt(original.redemption.prepare(redeemed.decision, yield* CurrentCommitJournal, (value) => value));
87
+ if (redeemed.decision !== "redeemed") return yield* prepare({ _tag: "Rejected" }, project);
88
+ const allocate = () => allocateEmailValue(mode, mapping.allocateRevision, mapping.allocateRevisionSync);
89
+ const securityRevision = yield* allocate(), identifierRevision = yield* allocate(), credentialRevision = yield* allocate(), displacedRevision = previous === void 0 ? void 0 : yield* allocate(), credentialId = yield* allocateEmailValue(mode, mapping.allocateCredentialId, mapping.allocateCredentialIdSync);
90
+ const provisioning = mapping.provisioning;
91
+ if (batch !== void 0 && provisioning.idMode === "generated") return yield* emailUnavailable();
92
+ let native = provisioning.idMode === "generated" ? void 0 : yield* allocateEmailValue(mode, provisioning.allocateSubjectId, provisioning.allocateSubjectIdSync);
93
+ const insertion = sql`${subject.insert(provisioning.encodeSubjectInsert(input, {
94
+ nativeSubjectId: native,
95
+ securityRevision
96
+ }))}`;
97
+ if (provisioning.idMode === "generated") {
98
+ const rows = yield* sql.onDialectOrElse({
99
+ mysql: () => insertion.raw.pipe(Effect.flatMap(Schema.decodeUnknownEffect(Schema.Struct({ insertId: Schema.Union([Schema.Int, Schema.String]) }))), Effect.map((header) => [{ [s.id]: header.insertId }])),
100
+ orElse: () => sql`${insertion} returning ${subject.fields("email_registration_generated_")}`.pipe(Effect.map((rows) => rows.map((row) => subject.decode(row, "email_registration_generated_"))))
101
+ });
102
+ native = yield* provisioning.decodeGeneratedId(rows);
103
+ } else yield* stage(insertion);
104
+ ensureEmail(native !== void 0);
105
+ const subjectId = yield* mapping.subjectId.toSubject(native);
106
+ const clock = yield* sql`select ${now} as engine_now`;
107
+ const verifiedAt = Number(clock[0]?.engine_now);
108
+ ensureEmail(Number.isSafeInteger(verifiedAt));
109
+ const values = i.encodeVerifiedInsert({
110
+ identifier: input.identifier,
111
+ subjectId: native,
112
+ verifiedAtMillis: verifiedAt,
113
+ bindingRevision: identifierRevision
114
+ });
115
+ if (previous === void 0) yield* stage(identifier.insert(values));
116
+ else {
117
+ ensureEmail(displacedRevision !== previous.securityRevision);
118
+ yield* stage(sql`${identifier.update(values)} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, previous.native)} and ${exact(identifier, i.bindingRevision, previous.bindingRevision)} and ${identifier.column(i.verifiedAt)} is null`);
119
+ yield* stage(sql`${subject.update({ [s.securityRevision]: displacedRevision })} where ${id(subject, s.id, previous.native)} and ${exact(subject, s.securityRevision, previous.securityRevision)}`);
120
+ }
121
+ yield* stage(credential.insert(c.encodeVerifiedInsert({
122
+ moduleId: input.moduleId,
123
+ subjectId: native,
124
+ credentialId,
125
+ identifier: input.identifier,
126
+ credentialRevision
127
+ })));
128
+ yield* stage(authority.insert(a.encodeInsert({
129
+ subjectId: native,
130
+ credentialId,
131
+ revision: credentialRevision
132
+ })));
133
+ const conditions = [
134
+ redeemed.validUntil,
135
+ sql`exists(select 1 from ${subject.name} where ${id(subject, s.id, native)} and ${exact(subject, s.securityRevision, securityRevision)} and ${id(subject, s.status, s.activeStatusValue)})`,
136
+ sql`exists(select 1 from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${exact(identifier, i.bindingRevision, identifierRevision)} and ${id(identifier, i.verifiedAt, mapping.clock.encodeInstant(verifiedAt))})`,
137
+ sql`exists(select 1 from ${credential.name} where ${exact(credential, c.moduleId, input.moduleId)} and ${exact(credential, c.credentialId, credentialId)} and ${id(credential, c.subjectId, native)} and ${exact(credential, c.credentialRevision, credentialRevision)} and ${exact(credential, c.identifierNamespace, input.identifier.namespace)} and ${exact(credential, c.identifierValue, input.identifier.value)} and ${id(credential, c.status, c.activeStatusValue)})`,
138
+ sql`exists(select 1 from ${authority.name} where ${id(authority, a.subjectId, native)} and ${exact(authority, a.credentialId, credentialId)} and ${exact(authority, a.revision, credentialRevision)} and ${id(authority, a.status, a.activeStatusValue)})`
139
+ ];
140
+ if (previous !== void 0) conditions.push(sql`exists(select 1 from ${subject.name} where ${id(subject, s.id, previous.native)} and ${exact(subject, s.securityRevision, displacedRevision)})`);
141
+ if (batch !== void 0) {
142
+ ensureEmail(i.d1CurrentCondition !== void 0);
143
+ conditions.push(sql`exists(select 1 from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${tables.expression(i.d1CurrentCondition({
144
+ identifier: input.identifier,
145
+ nativeSubjectId: native,
146
+ bindingRevision: identifierRevision
147
+ }))})`);
148
+ yield* registerSqlBatchPostcondition({
149
+ name: "email-registration-authority",
150
+ statement: sqlBatchAssertion(sql, sql.and(conditions))
151
+ });
152
+ } else yield* registerSqlPostcondition({
153
+ name: "email-registration-authority",
154
+ check: Effect.gen(function* () {
155
+ const rows = yield* sql`select ${identifier.fields("email_registration_final_")} from ${identifier.name} where ${identifierKey(input.identifier)} and ${sql.and(conditions)} limit 2`;
156
+ ensureEmail(rows.length === 1 && i.isCurrent(identifier.decode(rows[0], "email_registration_final_")));
157
+ }).pipe(Effect.mapError((cause) => PersistenceMappingError.make({
158
+ operation: "decode",
159
+ cause
160
+ })))
161
+ });
162
+ ensureEmail((yield* mapping.subjectId.toSubject(native)) === subjectId);
163
+ return yield* prepare({ _tag: "Registered" }, project);
164
+ }));
165
+ }).pipe(Effect.mapError(emailUnavailable))
166
+ } };
167
+ });
168
+ //#endregion
169
+ export { makeNativeEmailRegistrationServices };
170
+
171
+ //# sourceMappingURL=email-registration-native.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-registration-native.mjs","names":["unavailable"],"sources":["../../src/internal/email-registration-native.ts"],"sourcesContent":["import {\n type EmailUnavailable,\n type EmailCommandId,\n type EmailRegistrationDecision,\n type PrepareEmailCommit,\n} from \"@yielded/auth/Email\";\nimport {\n CurrentCommitJournal,\n type LifecycleHooks,\n type PreparedCommit,\n} from \"@yielded/auth/Hooks\";\nimport type { LoginIdentifier } from \"@yielded/auth/Identity\";\nimport { ProofRedemptionInput, type ProofRedemptionPlan } from \"@yielded/auth/Proofs\";\nimport type { TokenDigest } from \"@yielded/auth/Schema\";\nimport { SecurityRevision } from \"@yielded/auth/Sessions\";\nimport { Crypto, Effect, Schema } from \"effect\";\nimport { SqlClient } from \"effect/sql/SqlClient\";\nimport type { Fragment } from \"effect/sql/Statement\";\n\nimport { sqlBatchAssertion } from \"./d1-planning\";\nimport { ensureEmail as ensure, emailUnavailable as unavailable } from \"./email-native-state\";\nimport { allocateEmailValue } from \"./email-policy\";\nimport { PersistenceMappingError } from \"./mapping-error\";\nimport type { AnyEmailRegistrationMapping } from \"./models/email-model\";\nimport type { AnyProofPersistenceMapping } from \"./models/proof-model\";\nimport type { NativeSqlTables, SqlTable } from \"./native-sql-table\";\nimport { makeNativeProofStore } from \"./proof-native\";\nimport { exactSqlText, executeSqlChange } from \"./sql-change\";\nimport {\n appendSqlBatchStatement,\n makeSqlCommitExecutor,\n registerSqlBatchPostcondition,\n registerSqlCommitReceipt,\n registerSqlPostcondition,\n SqlBatchCommit,\n} from \"./sql-commit\";\n\nexport interface EmailRegistrationAuthority<Registration> {\n readonly inspect: (input: {\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n }) => Effect.Effect<\n { readonly fingerprint: TokenDigest; readonly eligible: boolean },\n EmailUnavailable\n >;\n readonly registerWithProof: <A>(\n input: {\n readonly moduleId: string;\n readonly commandId: EmailCommandId;\n readonly requestId: string;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly fingerprint: TokenDigest;\n readonly redemption: ProofRedemptionPlan;\n },\n prepare: PrepareEmailCommit<EmailRegistrationDecision, A>,\n ) => Effect.Effect<PreparedCommit<A>, EmailUnavailable>;\n}\n\n/** Proof redemption, SQL provisioning, and verified ownership commit together. No registration receipt survives the proof. */\nexport const makeNativeEmailRegistrationServices = Effect.fnUntraced(function* <Registration>(\n tables: NativeSqlTables,\n mapping: AnyEmailRegistrationMapping<Registration>,\n proofs: AnyProofPersistenceMapping,\n batch?: SqlBatchCommit[\"Service\"],\n): Effect.fn.Return<\n { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },\n never,\n SqlClient | LifecycleHooks | Crypto.Crypto\n> {\n const sql = (yield* SqlClient).withoutTransforms(),\n executor = yield* makeSqlCommitExecutor(unavailable),\n crypto = yield* Crypto.Crypto;\n\n const s = mapping.subject,\n i = mapping.identifier,\n c = mapping.credential,\n a = mapping.authorityCredential;\n\n const subject = tables(s.table),\n identifier = tables(i.table),\n credential = tables(c.table),\n authority = tables(a.table);\n\n const exact = (t: SqlTable, key: string, value: unknown) =>\n exactSqlText(sql, t.column(key), t.value(key, value));\n\n const id = (t: SqlTable, key: string, value: unknown) =>\n sql`${t.column(key)} = ${t.value(key, value)}`;\n\n const identifierKey = (value: LoginIdentifier) =>\n sql.and([\n exact(identifier, i.namespace, value.namespace),\n exact(identifier, i.value, value.value),\n ]);\n\n const lock = sql.onDialectOrElse({ sqlite: () => sql``, orElse: () => sql`for update` }),\n now = tables.expression(mapping.clock.engineNowMillis),\n mode = \"interactive\";\n\n const run = <A, E, R>(work: Effect.Effect<A, E, R>) =>\n batch === undefined\n ? executor.run(work.pipe(Effect.provideService(Crypto.Crypto, crypto)))\n : executor\n .batch(work.pipe(Effect.provideService(Crypto.Crypto, crypto)))\n .pipe(Effect.provideService(SqlBatchCommit, batch));\n\n const stage = Effect.fnUntraced(function* (statement: Fragment) {\n if (batch === undefined) ensure((yield* executeSqlChange(sql, statement)) === 1);\n else {\n yield* appendSqlBatchStatement(sql`${statement}`);\n yield* appendSqlBatchStatement(sqlBatchAssertion(sql, sql`changes() = 1`));\n }\n });\n\n const prepare = <A>(\n decision: EmailRegistrationDecision,\n project: PrepareEmailCommit<EmailRegistrationDecision, A>,\n ) =>\n Effect.gen(function* () {\n const receipt = project(decision, yield* CurrentCommitJournal);\n\n yield* registerSqlCommitReceipt(receipt);\n\n return receipt;\n });\n\n const registrationAuthority: EmailRegistrationAuthority<Registration> = {\n inspect: (input) => executor.read(mapping.inspect(input)),\n registerWithProof: (original, project) =>\n Effect.gen(function* () {\n const registration = yield* mapping.snapshotRegistration(original.registration);\n\n const inspection = yield* mapping.inspect({\n identifier: original.identifier,\n registration: yield* mapping.snapshotRegistration(registration),\n });\n\n const redemption = yield* Schema.decodeEffect(Schema.toCodecIso(ProofRedemptionInput))(\n yield* Schema.encodeEffect(Schema.toCodecIso(ProofRedemptionInput))(\n original.redemption.input,\n ),\n );\n\n const input = {\n ...original,\n identifier: { ...original.identifier },\n registration,\n redemption,\n };\n\n return yield* run(\n Effect.gen(function* () {\n const binding = redemption.binding;\n\n if (\n !inspection.eligible ||\n inspection.fingerprint !== input.fingerprint ||\n redemption.moduleId !== `${input.moduleId}/registration` ||\n redemption.purpose !== \"email-code-registration\" ||\n binding._tag !== \"Identifier\" ||\n binding.identifier.namespace !== input.identifier.namespace ||\n binding.identifier.value !== input.identifier.value ||\n input.requestId !== `email-registration:${input.moduleId}:${redemption.proofId}`\n )\n return yield* prepare({ _tag: \"Rejected\" }, project);\n\n const priorRows =\n yield* sql`select ${identifier.fields(\"email_registration_identifier_\")} from ${identifier.name} where ${identifierKey(input.identifier)} limit 2`;\n\n ensure(priorRows.length <= 1);\n\n const prior =\n priorRows[0] === undefined\n ? undefined\n : identifier.decode(priorRows[0], \"email_registration_identifier_\");\n\n let previous:\n | {\n readonly native: unknown;\n readonly securityRevision: SecurityRevision;\n readonly bindingRevision: SecurityRevision;\n }\n | undefined;\n\n if (prior !== undefined) {\n ensure(\n prior[i.namespace] === input.identifier.namespace &&\n prior[i.value] === input.identifier.value,\n );\n if (prior[i.verifiedAt] !== null || !i.isMutableTarget(prior))\n return yield* prepare({ _tag: \"Rejected\" }, project);\n\n const previousSubject = yield* mapping.subjectId.toSubject(prior[i.subjectId]),\n native = yield* mapping.subjectId.toNative(previousSubject);\n\n const rows =\n yield* sql`select ${subject.fields(\"email_registration_old_subject_\")} from ${subject.name} where ${id(subject, s.id, native)} limit 2 ${batch === undefined ? lock : sql``}`;\n\n if (rows.length !== 1) return yield* prepare({ _tag: \"Rejected\" }, project);\n const row = subject.decode(rows[0]!, \"email_registration_old_subject_\");\n\n ensure((yield* mapping.subjectId.toSubject(row[s.id])) === previousSubject);\n\n const currentRows =\n yield* sql`select ${identifier.fields(\"email_registration_current_identifier_\")} from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${exact(identifier, i.bindingRevision, prior[i.bindingRevision])} and ${identifier.column(i.verifiedAt)} is null limit 2`;\n\n if (\n currentRows.length !== 1 ||\n !i.isMutableTarget(\n identifier.decode(currentRows[0]!, \"email_registration_current_identifier_\"),\n )\n )\n return yield* prepare({ _tag: \"Rejected\" }, project);\n if (batch !== undefined) {\n ensure(i.d1MutableTargetCondition !== undefined);\n yield* appendSqlBatchStatement(\n sqlBatchAssertion(\n sql,\n sql`exists(select 1 from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${exact(identifier, i.bindingRevision, prior[i.bindingRevision])} and ${identifier.column(i.verifiedAt)} is null and ${tables.expression(i.d1MutableTargetCondition({ identifier: input.identifier, nativeSubjectId: native }))})`,\n ),\n );\n }\n previous = {\n native,\n securityRevision: yield* Schema.decodeUnknownEffect(SecurityRevision)(\n row[s.securityRevision],\n ),\n bindingRevision: yield* Schema.decodeUnknownEffect(SecurityRevision)(\n prior[i.bindingRevision],\n ),\n };\n }\n\n const proof = yield* makeNativeProofStore(tables, proofs, batch !== undefined),\n redeemed = yield* proof.redeemLocked(redemption);\n\n yield* registerSqlCommitReceipt(\n original.redemption.prepare(\n redeemed.decision,\n yield* CurrentCommitJournal,\n (value) => value,\n ),\n );\n if (redeemed.decision !== \"redeemed\")\n return yield* prepare({ _tag: \"Rejected\" }, project);\n\n const allocate = () =>\n allocateEmailValue(mode, mapping.allocateRevision, mapping.allocateRevisionSync);\n\n const securityRevision = yield* allocate(),\n identifierRevision = yield* allocate(),\n credentialRevision = yield* allocate(),\n displacedRevision = previous === undefined ? undefined : yield* allocate(),\n credentialId = yield* allocateEmailValue(\n mode,\n mapping.allocateCredentialId,\n mapping.allocateCredentialIdSync,\n );\n\n const provisioning = mapping.provisioning;\n\n if (batch !== undefined && provisioning.idMode === \"generated\")\n return yield* unavailable();\n\n let native =\n provisioning.idMode === \"generated\"\n ? undefined\n : yield* allocateEmailValue(\n mode,\n provisioning.allocateSubjectId,\n provisioning.allocateSubjectIdSync,\n );\n\n const insertion = sql`${subject.insert(provisioning.encodeSubjectInsert(input, { nativeSubjectId: native, securityRevision }))}`;\n\n if (provisioning.idMode === \"generated\") {\n const rows = yield* sql.onDialectOrElse({\n mysql: () =>\n insertion.raw.pipe(\n Effect.flatMap(\n Schema.decodeUnknownEffect(\n Schema.Struct({ insertId: Schema.Union([Schema.Int, Schema.String]) }),\n ),\n ),\n Effect.map((header) => [{ [s.id]: header.insertId }]),\n ),\n orElse: () =>\n sql`${insertion} returning ${subject.fields(\"email_registration_generated_\")}`.pipe(\n Effect.map((rows) =>\n rows.map((row) => subject.decode(row, \"email_registration_generated_\")),\n ),\n ),\n });\n\n native = yield* provisioning.decodeGeneratedId(rows);\n } else yield* stage(insertion);\n ensure(native !== undefined);\n const subjectId = yield* mapping.subjectId.toSubject(native);\n const clock = yield* sql`select ${now} as engine_now`;\n const verifiedAt = Number(clock[0]?.engine_now);\n\n ensure(Number.isSafeInteger(verifiedAt));\n\n const values = i.encodeVerifiedInsert({\n identifier: input.identifier,\n subjectId: native,\n verifiedAtMillis: verifiedAt,\n bindingRevision: identifierRevision,\n });\n\n if (previous === undefined) yield* stage(identifier.insert(values));\n else {\n ensure(displacedRevision !== previous.securityRevision);\n yield* stage(\n sql`${identifier.update(values)} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, previous.native)} and ${exact(identifier, i.bindingRevision, previous.bindingRevision)} and ${identifier.column(i.verifiedAt)} is null`,\n );\n yield* stage(\n sql`${subject.update({ [s.securityRevision]: displacedRevision })} where ${id(subject, s.id, previous.native)} and ${exact(subject, s.securityRevision, previous.securityRevision)}`,\n );\n }\n yield* stage(\n credential.insert(\n c.encodeVerifiedInsert({\n moduleId: input.moduleId,\n subjectId: native,\n credentialId,\n identifier: input.identifier,\n credentialRevision,\n }),\n ),\n );\n yield* stage(\n authority.insert(\n a.encodeInsert({ subjectId: native, credentialId, revision: credentialRevision }),\n ),\n );\n\n const conditions: Fragment[] = [\n redeemed.validUntil,\n sql`exists(select 1 from ${subject.name} where ${id(subject, s.id, native)} and ${exact(subject, s.securityRevision, securityRevision)} and ${id(subject, s.status, s.activeStatusValue)})`,\n sql`exists(select 1 from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${exact(identifier, i.bindingRevision, identifierRevision)} and ${id(identifier, i.verifiedAt, mapping.clock.encodeInstant(verifiedAt))})`,\n sql`exists(select 1 from ${credential.name} where ${exact(credential, c.moduleId, input.moduleId)} and ${exact(credential, c.credentialId, credentialId)} and ${id(credential, c.subjectId, native)} and ${exact(credential, c.credentialRevision, credentialRevision)} and ${exact(credential, c.identifierNamespace, input.identifier.namespace)} and ${exact(credential, c.identifierValue, input.identifier.value)} and ${id(credential, c.status, c.activeStatusValue)})`,\n sql`exists(select 1 from ${authority.name} where ${id(authority, a.subjectId, native)} and ${exact(authority, a.credentialId, credentialId)} and ${exact(authority, a.revision, credentialRevision)} and ${id(authority, a.status, a.activeStatusValue)})`,\n ];\n\n if (previous !== undefined)\n conditions.push(\n sql`exists(select 1 from ${subject.name} where ${id(subject, s.id, previous.native)} and ${exact(subject, s.securityRevision, displacedRevision)})`,\n );\n if (batch !== undefined) {\n ensure(i.d1CurrentCondition !== undefined);\n conditions.push(\n sql`exists(select 1 from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${tables.expression(i.d1CurrentCondition({ identifier: input.identifier, nativeSubjectId: native, bindingRevision: identifierRevision }))})`,\n );\n yield* registerSqlBatchPostcondition({\n name: \"email-registration-authority\",\n statement: sqlBatchAssertion(sql, sql.and(conditions)),\n });\n } else\n yield* registerSqlPostcondition({\n name: \"email-registration-authority\",\n check: Effect.gen(function* () {\n const rows =\n yield* sql`select ${identifier.fields(\"email_registration_final_\")} from ${identifier.name} where ${identifierKey(input.identifier)} and ${sql.and(conditions)} limit 2`;\n\n ensure(\n rows.length === 1 &&\n i.isCurrent(identifier.decode(rows[0]!, \"email_registration_final_\")),\n );\n }).pipe(\n Effect.mapError((cause) =>\n PersistenceMappingError.make({ operation: \"decode\", cause }),\n ),\n ),\n });\n ensure((yield* mapping.subjectId.toSubject(native)) === subjectId);\n\n return yield* prepare({ _tag: \"Registered\" }, project);\n }),\n );\n }).pipe(Effect.mapError(unavailable)),\n };\n\n return { registrationAuthority };\n});\n"],"mappings":"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"}
@@ -1,12 +1,13 @@
1
+ import { AnyTableModel, SqlExpression, TableModel } from "../table-model.mjs";
1
2
  import { PersistenceMappingError } from "../mapping-error.mjs";
2
- import { AnyTableModel, SqlExpression, TableModel } from "../query-operations.mjs";
3
3
  import { SubjectIdCodec } from "./common.mjs";
4
+ import { ProofClock } from "./proof-model.mjs";
4
5
  import { Effect } from "effect";
5
- import { TokenDigest } from "@yielded/auth/Schema";
6
+ import { EmailAction } from "@yielded/auth/Email";
7
+ import { ProofRedemptionInput } from "@yielded/auth/Proofs";
6
8
  import { AuthenticationRequirement, SecurityRevision } from "@yielded/auth/Sessions";
7
- import { ProofBinding, ProofContinuationId, ProofPurpose } from "@yielded/auth/Proofs";
8
- import { EmailAction, EmailRegistrationDecision } from "@yielded/auth/Email";
9
9
  import { LoginIdentifier } from "@yielded/auth/Identity";
10
+ import { TokenDigest } from "@yielded/auth/Schema";
10
11
  //#region src/internal/models/email-model.d.ts
11
12
  type ColumnKey<T extends TableModel> = T["column"];
12
13
  export interface EmailSubjectReadTable<Subject extends TableModel> {
@@ -15,13 +16,14 @@ export interface EmailSubjectReadTable<Subject extends TableModel> {
15
16
  readonly status: ColumnKey<Subject>;
16
17
  readonly securityRevision: ColumnKey<Subject>;
17
18
  readonly isActiveStatus: (value: unknown) => boolean;
18
- readonly d1ActiveStatusValue?: unknown;
19
+ readonly activeStatusValue: unknown;
20
+ readonly decodeRequirement: (row: Subject["select"]) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;
19
21
  }
20
22
  export interface EmailSubjectTable<Subject extends TableModel> extends EmailSubjectReadTable<Subject> {
21
23
  readonly decodeActionRequirement: (row: Subject["select"], action: EmailAction) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;
22
24
  readonly nextSecurityRevision?: (current: SecurityRevision) => Effect.Effect<SecurityRevision, PersistenceMappingError>;
23
25
  readonly nextSecurityRevisionSync?: (current: SecurityRevision) => SecurityRevision;
24
- readonly d1ActiveStatusValue?: unknown;
26
+ readonly activeStatusValue: unknown;
25
27
  }
26
28
  export interface EmailIdentifierReadTable<Identifier extends TableModel> {
27
29
  readonly table: Identifier["table"];
@@ -70,12 +72,13 @@ export interface EmailCredentialReadTable<Subject extends TableModel, Identifier
70
72
  readonly credentialRevision: ColumnKey<Credential>;
71
73
  readonly status: ColumnKey<Credential>;
72
74
  readonly isActiveStatus: (value: unknown) => boolean;
75
+ readonly activeStatusValue: unknown;
73
76
  readonly decode: (input: {
74
77
  readonly moduleId: string;
75
78
  readonly subject: Subject["select"];
76
79
  readonly identifier: Identifier["select"];
77
80
  readonly credential: Credential["select"];
78
- }) => Effect.Effect<import("@yielded/auth/Email").EmailCredentialSnapshot, PersistenceMappingError>;
81
+ }) => Effect.Effect<Omit<import("@yielded/auth/Email").EmailCredentialSnapshot, "requirement">, PersistenceMappingError>;
79
82
  }
80
83
  export interface EmailCredentialTable<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, NativeSubjectId> extends EmailCredentialReadTable<Subject, Identifier, Credential, NativeSubjectId> {
81
84
  readonly encodeVerifiedInsert: (input: {
@@ -93,7 +96,7 @@ export interface EmailCredentialTable<Subject extends TableModel, Identifier ext
93
96
  readonly source: LoginIdentifier;
94
97
  readonly credentialRevision: SecurityRevision;
95
98
  }) => Partial<Credential["insert"]>;
96
- readonly d1ActiveStatusValue?: unknown;
99
+ readonly activeStatusValue: unknown;
97
100
  }
98
101
  export interface EmailAuthorityCredentialTable<Credential extends TableModel, NativeSubjectId> {
99
102
  readonly table: Credential["table"];
@@ -109,53 +112,33 @@ export interface EmailAuthorityCredentialTable<Credential extends TableModel, Na
109
112
  }) => Credential["insert"];
110
113
  readonly encodeActivation: (revision: SecurityRevision) => Partial<Credential["insert"]>;
111
114
  readonly encodeRetirement: (revision: SecurityRevision) => Partial<Credential["insert"]>;
112
- readonly d1ActiveStatusValue?: unknown;
113
- }
114
- export interface EmailCommandTable<Command extends TableModel> {
115
- readonly table: Command["table"];
116
- readonly moduleId: ColumnKey<Command>;
117
- readonly commandId: ColumnKey<Command>;
118
- readonly action: ColumnKey<Command>;
119
- readonly bindingDigest: ColumnKey<Command>;
120
- readonly retentionUntil: ColumnKey<Command>;
121
- readonly encodeInsert: (input: {
122
- readonly moduleId: string;
123
- readonly commandId: string;
124
- readonly action: EmailAction;
125
- readonly bindingDigest: TokenDigest;
126
- readonly retentionUntilMillis: number;
127
- }) => Command["insert"];
115
+ readonly activeStatusValue: unknown;
128
116
  }
129
117
  export interface RequiredEmailSignInConstraints {
118
+ readonly authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)";
130
119
  readonly identifier: "unique(identifier.namespace,identifier.value)";
131
120
  readonly credentialId: "unique(emailCredential.moduleId,emailCredential.credentialId)";
132
121
  readonly credentialIdentifier: "unique(emailCredential.moduleId,emailCredential.identifierNamespace,emailCredential.identifierValue)";
133
122
  }
134
123
  export declare const requiredEmailSignInConstraints: RequiredEmailSignInConstraints;
135
- export interface EmailSignInMapping<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, NativeSubjectId> {
124
+ export interface EmailSignInMapping<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, NativeSubjectId> {
136
125
  readonly subject: EmailSubjectReadTable<Subject>;
137
126
  readonly identifier: EmailIdentifierReadTable<Identifier>;
138
127
  readonly credential: EmailCredentialReadTable<Subject, Identifier, Credential, NativeSubjectId>;
128
+ readonly authorityCredential: EmailAuthorityCredentialTable<AuthorityCredential, NativeSubjectId>;
139
129
  readonly subjectId: SubjectIdCodec<NativeSubjectId>;
140
130
  readonly constraints: RequiredEmailSignInConstraints;
141
131
  readonly decodeInstant: (native: unknown) => Effect.Effect<number, PersistenceMappingError>;
142
132
  }
143
133
  export interface RequiredEmailAddressConstraints extends RequiredEmailSignInConstraints {
144
134
  readonly authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)";
145
- readonly command: "unique(emailCommand.moduleId,emailCommand.commandId)";
146
135
  }
147
136
  export declare const requiredEmailAddressConstraints: RequiredEmailAddressConstraints;
148
- export interface EmailD1Clock<Expression extends SqlExpression = SqlExpression> {
149
- readonly engineNow: Expression;
150
- readonly engineNowMillis: Expression;
151
- readonly engineInstantPlus: (millis: number) => Expression;
152
- }
153
- export interface EmailAddressMapping<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, Command extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> extends EmailSignInMapping<Subject, Identifier, Credential, NativeSubjectId> {
137
+ export interface EmailAddressMapping<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> extends EmailSignInMapping<Subject, Identifier, Credential, AuthorityCredential, NativeSubjectId> {
154
138
  readonly subject: EmailSubjectTable<Subject>;
155
139
  readonly identifier: EmailIdentifierTable<Identifier, NativeSubjectId, Expression>;
156
140
  readonly credential: EmailCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;
157
141
  readonly authorityCredential: EmailAuthorityCredentialTable<AuthorityCredential, NativeSubjectId>;
158
- readonly command: EmailCommandTable<Command>;
159
142
  readonly constraints: RequiredEmailAddressConstraints;
160
143
  readonly addressCardinality: "single" | "multiple";
161
144
  readonly changeDisposition: "retire-source";
@@ -164,61 +147,22 @@ export interface EmailAddressMapping<Subject extends TableModel, Identifier exte
164
147
  readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;
165
148
  readonly allocateRevisionSync?: () => SecurityRevision;
166
149
  readonly encodeInstant: (epochMillis: number) => unknown;
167
- readonly commandRetentionMillis: number;
168
150
  readonly sessionInvalidation: "same-authority-immediate" | "original-absolute-expiry";
169
- readonly isCommandConflict: (cause: unknown) => boolean;
170
151
  readonly isIdentifierConflict: (cause: unknown) => boolean;
171
152
  readonly isCredentialConflict: (cause: unknown) => boolean;
172
- readonly d1?: EmailD1Clock<Expression>;
173
- }
174
- export type D1EmailAddressMapping<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, Command extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> = EmailAddressMapping<Subject, Identifier, Credential, AuthorityCredential, Command, NativeSubjectId, Expression> & {
175
- readonly d1: EmailD1Clock<Expression>;
176
- readonly subject: EmailSubjectTable<Subject> & {
177
- readonly d1ActiveStatusValue: unknown;
178
- };
179
- readonly identifier: EmailIdentifierTable<Identifier, NativeSubjectId, Expression> & {
180
- readonly d1CurrentCondition: NonNullable<EmailIdentifierTable<Identifier, NativeSubjectId, Expression>["d1CurrentCondition"]>;
181
- readonly d1MutableTargetCondition: NonNullable<EmailIdentifierTable<Identifier, NativeSubjectId, Expression>["d1MutableTargetCondition"]>;
182
- };
183
- readonly credential: EmailCredentialTable<Subject, Identifier, Credential, NativeSubjectId> & {
184
- readonly d1ActiveStatusValue: unknown;
153
+ readonly clock: ProofClock<Expression>;
154
+ readonly d1?: {
155
+ readonly primary: true;
185
156
  };
186
- readonly authorityCredential: EmailAuthorityCredentialTable<AuthorityCredential, NativeSubjectId> & {
187
- readonly d1ActiveStatusValue: unknown;
188
- };
189
- };
190
- export type EmailRegistrationState = "pending" | "registered";
157
+ }
191
158
  export interface EmailRegistrationIntent<Registration> {
192
159
  readonly moduleId: string;
193
160
  readonly commandId: string;
194
161
  readonly identifier: LoginIdentifier;
195
162
  readonly registration: Registration;
163
+ readonly requestId: string;
196
164
  readonly fingerprint: TokenDigest;
197
- readonly completion: {
198
- readonly moduleId: string;
199
- readonly purpose: ProofPurpose;
200
- readonly continuationId: ProofContinuationId;
201
- readonly binding: ProofBinding;
202
- };
203
- }
204
- export interface EmailRegistrationTable<Registration, Request extends TableModel, NativeSubjectId> {
205
- readonly table: Request["table"];
206
- readonly moduleId: ColumnKey<Request>;
207
- readonly commandId: ColumnKey<Request>;
208
- readonly fingerprint: ColumnKey<Request>;
209
- readonly state: ColumnKey<Request>;
210
- readonly subjectId: ColumnKey<Request>;
211
- readonly pendingReference: ColumnKey<Request>;
212
- readonly retentionUntil: ColumnKey<Request>;
213
- readonly encodeInsert: (input: EmailRegistrationIntent<Registration>, state: {
214
- readonly state: EmailRegistrationState;
215
- readonly nativeSubjectId?: NativeSubjectId;
216
- readonly pendingReference?: string;
217
- readonly retentionUntilMillis: number;
218
- }) => Request["insert"];
219
- readonly decodeReplay: (row: Request["select"]) => Effect.Effect<Exclude<EmailRegistrationDecision, {
220
- readonly _tag: "Registered";
221
- }>, PersistenceMappingError>;
165
+ readonly redemption: ProofRedemptionInput;
222
166
  }
223
167
  export interface EmailRegistrationProvisioning<Registration, Subject extends TableModel, NativeSubjectId> {
224
168
  readonly encodeSubjectInsert: (input: EmailRegistrationIntent<Registration>, values: {
@@ -241,6 +185,11 @@ export interface EmailRegistrationIdentifierTable<Identifier extends TableModel,
241
185
  readonly verifiedAt: ColumnKey<Identifier>;
242
186
  readonly bindingRevision: ColumnKey<Identifier>;
243
187
  readonly isCurrent: (row: Identifier["select"]) => boolean;
188
+ readonly isMutableTarget: (row: Identifier["select"]) => boolean;
189
+ readonly d1MutableTargetCondition?: (input: {
190
+ readonly identifier: LoginIdentifier;
191
+ readonly nativeSubjectId: NativeSubjectId;
192
+ }) => Expression;
244
193
  readonly d1CurrentCondition?: (input: {
245
194
  readonly identifier: LoginIdentifier;
246
195
  readonly nativeSubjectId: NativeSubjectId;
@@ -263,7 +212,7 @@ export interface EmailRegistrationCredentialTable<Credential extends TableModel,
263
212
  readonly credentialRevision: ColumnKey<Credential>;
264
213
  readonly status: ColumnKey<Credential>;
265
214
  readonly isActiveStatus: (value: unknown) => boolean;
266
- readonly d1ActiveStatusValue?: unknown;
215
+ readonly activeStatusValue: unknown;
267
216
  readonly encodeVerifiedInsert: (input: {
268
217
  readonly moduleId: string;
269
218
  readonly subjectId: NativeSubjectId;
@@ -279,7 +228,7 @@ export interface EmailRegistrationAuthorityCredentialTable<Credential extends Ta
279
228
  readonly revision: ColumnKey<Credential>;
280
229
  readonly status: ColumnKey<Credential>;
281
230
  readonly isActiveStatus: (value: unknown) => boolean;
282
- readonly d1ActiveStatusValue?: unknown;
231
+ readonly activeStatusValue: unknown;
283
232
  readonly encodeInsert: (input: {
284
233
  readonly subjectId: NativeSubjectId;
285
234
  readonly credentialId: string;
@@ -288,40 +237,32 @@ export interface EmailRegistrationAuthorityCredentialTable<Credential extends Ta
288
237
  }
289
238
  export interface RequiredEmailRegistrationConstraints extends RequiredEmailSignInConstraints {
290
239
  readonly authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)";
291
- readonly request: "unique(emailRegistration.moduleId,emailRegistration.commandId)";
292
- readonly pendingReference: "unique(emailRegistration.pendingReference)";
293
240
  }
294
241
  export declare const requiredEmailRegistrationConstraints: RequiredEmailRegistrationConstraints;
295
- type EmailRegistrationBase<Registration, Request extends TableModel, NativeSubjectId> = {
296
- readonly registration: EmailRegistrationTable<Registration, Request, NativeSubjectId>;
297
- readonly constraints: Pick<RequiredEmailRegistrationConstraints, "request" | "pendingReference">;
242
+ type EmailRegistrationBase<Registration> = {
298
243
  readonly inspect: (input: {
299
244
  readonly identifier: LoginIdentifier;
300
245
  readonly registration: Registration;
301
246
  }) => Effect.Effect<{
302
- readonly fingerprint: TokenDigest;
303
247
  readonly eligible: boolean;
248
+ readonly fingerprint: TokenDigest;
304
249
  }, PersistenceMappingError>;
305
- /** Projects one detached value of the factory-specific Registration Type. */
306
250
  readonly snapshotRegistration: (registration: Registration) => Effect.Effect<Registration, PersistenceMappingError>;
307
- /** Required by synchronous transaction-bound services. */
308
251
  readonly snapshotRegistrationSync?: (registration: Registration) => Registration;
309
- /** Required by synchronous Durable Object transaction-bound services. */
310
252
  readonly inspectSync?: (input: {
311
253
  readonly identifier: LoginIdentifier;
312
254
  readonly registration: Registration;
313
255
  }) => {
314
- readonly fingerprint: TokenDigest;
315
256
  readonly eligible: boolean;
257
+ readonly fingerprint: TokenDigest;
316
258
  };
317
- readonly allocatePendingReference?: Effect.Effect<string, PersistenceMappingError>;
318
- readonly allocatePendingReferenceSync?: () => string;
319
- readonly encodeInstant: (epochMillis: number) => unknown;
320
- readonly retentionMillis: number;
321
- readonly isRequestConflict: (cause: unknown) => boolean;
322
259
  };
323
- export type EmailRegistrationMapping<Registration, Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, Request extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> = EmailRegistrationBase<Registration, Request, NativeSubjectId> & ({
260
+ export type EmailRegistrationMapping<Registration, Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> = EmailRegistrationBase<Registration> & {
324
261
  readonly mode: "atomic";
262
+ readonly clock: ProofClock<Expression>;
263
+ readonly d1?: {
264
+ readonly primary: true;
265
+ };
325
266
  readonly subject: EmailSubjectReadTable<Subject>;
326
267
  readonly identifier: EmailRegistrationIdentifierTable<Identifier, NativeSubjectId, Expression>;
327
268
  readonly credential: EmailRegistrationCredentialTable<Credential, NativeSubjectId>;
@@ -344,14 +285,9 @@ export type EmailRegistrationMapping<Registration, Subject extends TableModel, I
344
285
  readonly idMode: "generated";
345
286
  readonly decodeGeneratedId: (rows: ReadonlyArray<unknown>) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;
346
287
  });
347
- } | {
348
- readonly mode: "pending";
349
- });
350
- export type AnyEmailSignInMapping = EmailSignInMapping<AnyTableModel, AnyTableModel, AnyTableModel, unknown>;
351
- export type AnyEmailAddressMapping<Expression extends SqlExpression = SqlExpression> = EmailAddressMapping<AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
352
- export type AnyEmailRegistrationMapping<Registration = unknown, Expression extends SqlExpression = SqlExpression> = EmailRegistrationMapping<Registration, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
353
- export type D1EmailRegistrationMapping<Registration, Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, Request extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> = EmailRegistrationMapping<Registration, Subject, Identifier, Credential, AuthorityCredential, Request, NativeSubjectId, Expression> & {
354
- readonly d1: EmailD1Clock<Expression>;
355
288
  };
289
+ export type AnyEmailSignInMapping = EmailSignInMapping<AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown>;
290
+ export type AnyEmailAddressMapping<Expression extends SqlExpression = SqlExpression> = EmailAddressMapping<AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
291
+ export type AnyEmailRegistrationMapping<Registration = unknown, Expression extends SqlExpression = SqlExpression> = EmailRegistrationMapping<Registration, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
356
292
  //#endregion
357
293
  //# sourceMappingURL=email-model.d.mts.map
@@ -1,19 +1,17 @@
1
1
  //#region src/internal/models/email-model.ts
2
2
  const requiredEmailSignInConstraints = {
3
+ authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)",
3
4
  identifier: "unique(identifier.namespace,identifier.value)",
4
5
  credentialId: "unique(emailCredential.moduleId,emailCredential.credentialId)",
5
6
  credentialIdentifier: "unique(emailCredential.moduleId,emailCredential.identifierNamespace,emailCredential.identifierValue)"
6
7
  };
7
8
  const requiredEmailAddressConstraints = {
8
9
  ...requiredEmailSignInConstraints,
9
- authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)",
10
- command: "unique(emailCommand.moduleId,emailCommand.commandId)"
10
+ authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)"
11
11
  };
12
12
  const requiredEmailRegistrationConstraints = {
13
13
  ...requiredEmailSignInConstraints,
14
- authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)",
15
- request: "unique(emailRegistration.moduleId,emailRegistration.commandId)",
16
- pendingReference: "unique(emailRegistration.pendingReference)"
14
+ authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)"
17
15
  };
18
16
  //#endregion
19
17
  export { requiredEmailAddressConstraints, requiredEmailRegistrationConstraints, requiredEmailSignInConstraints };