@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
@@ -1 +0,0 @@
1
- {"version":3,"file":"email-kernel.mjs","names":[],"sources":["../../src/internal/email-kernel.ts"],"sourcesContent":["import {\n EmailAddressPersistence,\n type EmailAddressMutation,\n type EmailAction,\n type EmailCredentialSnapshot,\n EmailSignInTargets,\n EmailUnavailable,\n snapshotEmailCredential,\n snapshotEmailRequirement,\n snapshotEmailRevision,\n} from \"@yielded/auth/Email\";\nimport {\n coordinateCommit,\n CurrentCommitJournal,\n hasCommitScope,\n type CommitJournal,\n type PreparedCommit,\n LifecycleHooks,\n HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\nimport type { LoginIdentifier } from \"@yielded/auth/Identity\";\nimport { reportPersistenceFailure } from \"@yielded/auth/Persistence\";\nimport {\n ProofUnavailable,\n type ProofCompletionDecision,\n type ProofCompletionInput,\n} from \"@yielded/auth/Proofs\";\nimport {\n assessAuthentication,\n snapshotAuthenticationEvidence,\n type AuthenticationRevision,\n type SecurityRevision,\n} from \"@yielded/auth/Sessions\";\nimport { Cause, Context, DateTime, Effect, Option, Schema } from \"effect\";\nimport type * as SqlError from \"effect/sql/SqlError\";\n\nimport { isMappedConstraintConflict, PersistenceMappingError } from \"./mapping-error\";\nimport {\n type AnyEmailAddressMapping,\n type AnyEmailSignInMapping,\n requiredEmailAddressConstraints,\n requiredEmailSignInConstraints,\n} from \"./models/email-model\";\nimport {\n CurrentProofSql,\n type makeProofKernel,\n type ProofSqlConfiguration,\n type ProofSqlDatabase,\n} from \"./proof-kernel\";\n/* oxlint-disable no-explicit-any -- the shared dialect kernel erases consumer Drizzle table types internally. */\nimport type { QueryFailure } from \"./query-operations\";\nimport type { QueryOperations, SqlFragment, SqlColumn } from \"./query-operations\";\nimport type { NativeDatabase } from \"./transaction-kernel\";\n\ntype AdapterFailure = QueryFailure | PersistenceMappingError | SqlError.SqlError;\ntype SignInMapping = AnyEmailSignInMapping;\n\nexport interface EmailSqlQuery<A = ReadonlyArray<any>> extends Effect.Effect<A, AdapterFailure> {\n readonly getSQL: () => ReturnType<QueryOperations[\"sql\"]>;\n readonly from: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly where: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly limit: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly orderBy: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly for: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly set: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly values: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly returning: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly innerJoin: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly onConflictDoNothing: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly onDuplicateKeyUpdate: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly $returningId: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n}\n\nexport interface EmailSqlDatabase {\n readonly select: (...args: ReadonlyArray<any>) => EmailSqlQuery;\n readonly insert: (...args: ReadonlyArray<any>) => EmailSqlQuery;\n readonly update: (...args: ReadonlyArray<any>) => EmailSqlQuery;\n readonly delete: (...args: ReadonlyArray<any>) => EmailSqlQuery;\n readonly transaction: <A, E, R>(\n body: (transaction: EmailSqlDatabase) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | SqlError.SqlError, R>;\n}\n\nexport class CurrentEmailSql extends Context.Service<CurrentEmailSql, EmailSqlDatabase>()(\n \"effect-auth/CurrentEmailSql\",\n) {}\n\nexport interface EmailSqlConfiguration {\n readonly mode: \"interactive\" | \"synchronous\";\n readonly locking: boolean;\n readonly standaloneGuard: Effect.Effect<void, EmailUnavailable>;\n readonly coordinated?: boolean;\n readonly proof?: {\n readonly mapping: any;\n readonly configuration: ProofSqlConfiguration;\n };\n}\n\nexport interface CurrentAddress {\n readonly nativeSubjectId: unknown;\n readonly subject: any;\n readonly revision: AuthenticationRevision;\n readonly source?: {\n readonly credential: any;\n readonly identifier: any;\n readonly snapshot: EmailCredentialSnapshot;\n };\n readonly targetIdentifier?: any;\n readonly targetCredential?: any;\n readonly targetIdentifierRevision?: SecurityRevision;\n readonly eligible: boolean;\n}\n\nexport const makeEmailKernel = <\n Fragment extends SqlFragment = SqlFragment,\n Column extends SqlColumn = SqlColumn,\n>(\n operations: QueryOperations<Fragment, Column>,\n proofs: Pick<ReturnType<typeof makeProofKernel>, \"completeProofPlanIn\">,\n) => {\n type AddressMapping = AnyEmailAddressMapping<Fragment>;\n\n const { and, eq, inArray, lte, column, updateValues } = operations;\n const { completeProofPlanIn } = proofs;\n const unavailable = () => EmailUnavailable.make({});\n\n const translateFailure = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n ): Effect.Effect<A, EmailUnavailable, R> =>\n reportPersistenceFailure(\n effect,\n (error) =>\n Schema.is(EmailUnavailable)(error) ||\n Schema.is(ProofUnavailable)(error) ||\n Schema.is(HookConfigurationError)(error),\n ).pipe(Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, () => unavailable()))));\n\n const nowMillis = Effect.map(DateTime.now, DateTime.toEpochMillis);\n\n const selectRows = (query: EmailSqlQuery, locking: boolean) =>\n locking && typeof query.for === \"function\" ? query.for(\"update\") : query;\n\n const sameIdentifier = (left: LoginIdentifier, right: LoginIdentifier) =>\n left.namespace === right.namespace && left.value === right.value;\n\n const validEmailSignInConstraints = (mapping: SignInMapping) =>\n Object.entries(requiredEmailSignInConstraints).every(\n ([key, value]) =>\n mapping.constraints[key as keyof typeof requiredEmailSignInConstraints] === value,\n );\n\n const validAddressConstraints = (mapping: AddressMapping) =>\n Object.entries(requiredEmailAddressConstraints).every(\n ([key, value]) =>\n mapping.constraints[key as keyof typeof requiredEmailAddressConstraints] === value,\n );\n\n const subjectColumns = (mapping: SignInMapping) => ({\n id: column(mapping.subject.table, mapping.subject.id),\n status: column(mapping.subject.table, mapping.subject.status),\n securityRevision: column(mapping.subject.table, mapping.subject.securityRevision),\n });\n\n const identifierColumns = (mapping: SignInMapping) => ({\n namespace: column(mapping.identifier.table, mapping.identifier.namespace),\n value: column(mapping.identifier.table, mapping.identifier.value),\n subjectId: column(mapping.identifier.table, mapping.identifier.subjectId),\n verifiedAt: column(mapping.identifier.table, mapping.identifier.verifiedAt),\n bindingRevision: column(mapping.identifier.table, mapping.identifier.bindingRevision),\n });\n\n const credentialColumns = (mapping: SignInMapping) => ({\n moduleId: column(mapping.credential.table, mapping.credential.moduleId),\n subjectId: column(mapping.credential.table, mapping.credential.subjectId),\n credentialId: column(mapping.credential.table, mapping.credential.credentialId),\n identifierNamespace: column(mapping.credential.table, mapping.credential.identifierNamespace),\n identifierValue: column(mapping.credential.table, mapping.credential.identifierValue),\n credentialRevision: column(mapping.credential.table, mapping.credential.credentialRevision),\n status: column(mapping.credential.table, mapping.credential.status),\n });\n\n const authorityColumns = (mapping: AddressMapping) => ({\n subjectId: column(mapping.authorityCredential.table, mapping.authorityCredential.subjectId),\n credentialId: column(\n mapping.authorityCredential.table,\n mapping.authorityCredential.credentialId,\n ),\n revision: column(mapping.authorityCredential.table, mapping.authorityCredential.revision),\n status: column(mapping.authorityCredential.table, mapping.authorityCredential.status),\n });\n\n const commandColumns = (mapping: AddressMapping) => ({\n moduleId: column(mapping.command.table, mapping.command.moduleId),\n commandId: column(mapping.command.table, mapping.command.commandId),\n action: column(mapping.command.table, mapping.command.action),\n bindingDigest: column(mapping.command.table, mapping.command.bindingDigest),\n retentionUntil: column(mapping.command.table, mapping.command.retentionUntil),\n });\n\n const allocate = <A>(\n mode: EmailSqlConfiguration[\"mode\"],\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) => new PersistenceMappingError({ 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) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n });\n };\n\n const nextSecurityRevision = (\n mapping: AddressMapping,\n mode: EmailSqlConfiguration[\"mode\"],\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) => new PersistenceMappingError({ 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) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n });\n\n return Effect.fail(unavailable());\n };\n\n const safeRead = <A, E, R>(\n database: EmailSqlDatabase,\n configuration: EmailSqlConfiguration,\n body: Effect.Effect<A, E, R>,\n ) =>\n Effect.gen(function* () {\n if (configuration.coordinated !== true) {\n if (yield* hasCommitScope) return yield* unavailable();\n yield* configuration.standaloneGuard;\n }\n\n return yield* database.transaction((transaction) =>\n body.pipe(\n Effect.provideService(CurrentEmailSql, transaction),\n Effect.provideService(CurrentProofSql, transaction as unknown as ProofSqlDatabase),\n ),\n );\n });\n\n const owned = <A, E, R>(\n database: EmailSqlDatabase,\n configuration: EmailSqlConfiguration,\n body: Effect.Effect<A, E, R>,\n ) => {\n const run = coordinateCommit(\n () =>\n database.transaction((transaction) =>\n body.pipe(\n Effect.provideService(CurrentEmailSql, transaction),\n Effect.provideService(CurrentProofSql, transaction as unknown as ProofSqlDatabase),\n ),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.map((result) => result.value));\n\n return configuration.coordinated !== true\n ? Effect.gen(function* () {\n if (yield* hasCommitScope) return yield* unavailable();\n yield* configuration.standaloneGuard;\n\n return yield* run;\n })\n : run;\n };\n\n const emailLookupQuery = (\n mapping: SignInMapping,\n moduleId: string,\n identifier: LoginIdentifier,\n ) => {\n const subject = subjectColumns(mapping),\n binding = identifierColumns(mapping),\n credential = credentialColumns(mapping);\n\n return {\n fields: {\n subject: mapping.subject.table,\n identifier: mapping.identifier.table,\n credential: mapping.credential.table,\n },\n from: mapping.identifier.table,\n subjectTable: mapping.subject.table,\n subjectJoin: eq(subject.id, binding.subjectId),\n credentialTable: mapping.credential.table,\n credentialJoin: and(\n eq(credential.moduleId, moduleId),\n eq(credential.subjectId, binding.subjectId),\n eq(credential.identifierNamespace, binding.namespace),\n eq(credential.identifierValue, binding.value),\n ),\n predicate: and(\n eq(binding.namespace, identifier.namespace),\n eq(binding.value, identifier.value),\n ),\n limit: 1,\n };\n };\n\n const emailLookupRows = Effect.fn(\"Drizzle.emailLookupRows\")(function* (\n mapping: SignInMapping,\n moduleId: string,\n identifier: LoginIdentifier,\n ) {\n const database = yield* CurrentEmailSql;\n const query = emailLookupQuery(mapping, moduleId, identifier);\n\n return yield* database\n .select(query.fields)\n .from(query.from)\n .innerJoin(query.subjectTable, query.subjectJoin)\n .innerJoin(query.credentialTable, query.credentialJoin)\n .where(query.predicate)\n .limit(query.limit);\n });\n\n const decodeEmailSnapshot = Effect.fn(\"DrizzleEmail.decodeSnapshot\")(function* (\n mapping: SignInMapping,\n moduleId: string,\n requested: LoginIdentifier,\n row: any,\n ) {\n if (\n !mapping.subject.isActiveStatus(row.subject[mapping.subject.status]) ||\n !mapping.identifier.isCurrent(row.identifier) ||\n !mapping.credential.isActiveStatus(row.credential[mapping.credential.status])\n )\n return undefined;\n\n const snapshot = yield* mapping.credential\n .decode({\n moduleId,\n subject: row.subject,\n identifier: row.identifier,\n credential: row.credential,\n })\n .pipe(Effect.flatMap(snapshotEmailCredential));\n\n const subjectId = yield* mapping.subjectId.toSubject(row.subject[mapping.subject.id]);\n\n const verifiedAtMillis = yield* mapping.decodeInstant(\n row.identifier[mapping.identifier.verifiedAt],\n );\n\n if (\n snapshot.moduleId !== moduleId ||\n !sameIdentifier(snapshot.identifier, requested) ||\n snapshot.revision.subjectId !== subjectId ||\n snapshot.revision.securityRevision !== row.subject[mapping.subject.securityRevision] ||\n snapshot.identifierRevision !== row.identifier[mapping.identifier.bindingRevision] ||\n snapshot.verifiedAtMillis !== verifiedAtMillis ||\n snapshot.credentialId !== row.credential[mapping.credential.credentialId] ||\n snapshot.credentialRevision !== row.credential[mapping.credential.credentialRevision]\n )\n return undefined;\n\n return snapshot;\n });\n\n const makeSqlEmailSignInTargets = Effect.fn(\"makeSqlEmailSignInTargets\")(function* (\n mapping: SignInMapping,\n configuration: EmailSqlConfiguration,\n ): Effect.fn.Return<\n EmailSignInTargets[\"Service\"],\n EmailUnavailable,\n CurrentEmailSql | NativeDatabase\n > {\n const database = yield* CurrentEmailSql;\n\n if (!configuration.coordinated)\n yield* (\n operations.validateStorage?.({\n ...mapping,\n proof: configuration.proof?.mapping,\n }) ?? Effect.void\n ).pipe(Effect.mapError(unavailable));\n\n return EmailSignInTargets.of({\n lookup: (input) =>\n (validEmailSignInConstraints(mapping)\n ? safeRead(\n database,\n configuration,\n Effect.gen(function* () {\n const row = (yield* emailLookupRows(mapping, input.moduleId, input.identifier))[0];\n\n if (row === undefined) return Option.none();\n\n const snapshot = yield* decodeEmailSnapshot(\n mapping,\n input.moduleId,\n input.identifier,\n row,\n );\n\n return snapshot === undefined ? Option.none() : Option.some(snapshot);\n }),\n )\n : Effect.fail(unavailable())\n ).pipe(Effect.provideService(CurrentEmailSql, database), translateFailure),\n });\n });\n\n const readSubject = Effect.fn(\"DrizzleEmail.readSubject\")(function* (\n mapping: AddressMapping,\n subjectId: string,\n locking: boolean,\n ) {\n const database = yield* CurrentEmailSql;\n\n const nativeSubjectId = yield* mapping.subjectId.toNative(subjectId as any);\n const s = subjectColumns(mapping);\n\n const subject = (yield* selectRows(\n database.select().from(mapping.subject.table).where(eq(s.id, nativeSubjectId)).limit(1),\n locking,\n ))[0];\n\n return { nativeSubjectId, subject };\n });\n\n const identifierRow = Effect.fn(\"Drizzle.identifierRow\")(function* (\n mapping: SignInMapping,\n identifier: LoginIdentifier,\n locking: boolean,\n ) {\n const database = yield* CurrentEmailSql;\n\n const i = identifierColumns(mapping);\n\n return yield* selectRows(\n database\n .select()\n .from(mapping.identifier.table)\n .where(and(eq(i.namespace, identifier.namespace), eq(i.value, identifier.value)))\n .limit(1),\n locking,\n );\n });\n\n const credentialById = Effect.fn(\"Drizzle.credentialById\")(function* (\n mapping: SignInMapping,\n moduleId: string,\n credentialId: string,\n locking: boolean,\n ) {\n const database = yield* CurrentEmailSql;\n\n const c = credentialColumns(mapping);\n\n return yield* selectRows(\n database\n .select()\n .from(mapping.credential.table)\n .where(and(eq(c.moduleId, moduleId), eq(c.credentialId, credentialId)))\n .limit(1),\n locking,\n );\n });\n\n const credentialByIdentifier = Effect.fn(\"Drizzle.credentialByIdentifier\")(function* (\n mapping: SignInMapping,\n moduleId: string,\n identifier: LoginIdentifier,\n locking: boolean,\n ) {\n const database = yield* CurrentEmailSql;\n\n const c = credentialColumns(mapping);\n\n return yield* selectRows(\n database\n .select()\n .from(mapping.credential.table)\n .where(\n and(\n eq(c.moduleId, moduleId),\n eq(c.identifierNamespace, identifier.namespace),\n eq(c.identifierValue, identifier.value),\n ),\n )\n .limit(1),\n locking,\n );\n });\n\n const currentAddress = Effect.fn(\"DrizzleEmail.currentAddress\")(function* (\n mapping: AddressMapping,\n input: {\n readonly moduleId: string;\n readonly subjectId: string;\n readonly target: LoginIdentifier;\n readonly sourceCredentialId?: string;\n },\n locking: boolean,\n ) {\n const database = yield* CurrentEmailSql;\n\n const locked = yield* readSubject(mapping, input.subjectId, locking);\n\n if (\n locked.subject === undefined ||\n !mapping.subject.isActiveStatus(locked.subject[mapping.subject.status])\n )\n return undefined;\n\n const discoveredSource =\n input.sourceCredentialId === undefined\n ? undefined\n : (yield* credentialById(mapping, input.moduleId, input.sourceCredentialId, false))[0];\n\n const sourceIdentifier: LoginIdentifier | undefined =\n discoveredSource === undefined\n ? undefined\n : {\n namespace: discoveredSource[mapping.credential.identifierNamespace],\n value: discoveredSource[mapping.credential.identifierValue],\n };\n\n const identifiers = [\n input.target,\n ...(sourceIdentifier === undefined ? [] : [sourceIdentifier]),\n ]\n .filter(\n (value, index, values) =>\n values.findIndex((candidate) => sameIdentifier(candidate, value)) === index,\n )\n .sort((left, right) =>\n `${left.namespace}\\u0000${left.value}`.localeCompare(\n `${right.namespace}\\u0000${right.value}`,\n ),\n );\n\n const lockedIdentifiers = new Map<string, any>();\n\n for (const identifier of identifiers) {\n const row = (yield* identifierRow(mapping, identifier, locking))[0];\n\n if (row !== undefined)\n lockedIdentifiers.set(`${identifier.namespace}\\u0000${identifier.value}`, row);\n }\n\n const sourceCredential =\n input.sourceCredentialId === undefined\n ? undefined\n : (yield* credentialById(mapping, input.moduleId, input.sourceCredentialId, locking))[0];\n\n const targetCredential = (yield* credentialByIdentifier(\n mapping,\n input.moduleId,\n input.target,\n locking,\n ))[0];\n\n const a = authorityColumns(mapping);\n\n const authority = yield* selectRows(\n database\n .select()\n .from(mapping.authorityCredential.table)\n .where(eq(a.subjectId, locked.nativeSubjectId))\n .orderBy(a.credentialId),\n locking,\n );\n\n const activeAuthority = authority.filter((row: any) =>\n mapping.authorityCredential.isActiveStatus(row[mapping.authorityCredential.status]),\n );\n\n const subjectId = yield* mapping.subjectId.toSubject(locked.nativeSubjectId);\n\n const revision: AuthenticationRevision = Object.freeze({\n subjectId,\n securityRevision: locked.subject[mapping.subject.securityRevision],\n credentials: Object.freeze(\n activeAuthority.map((row: any) =>\n Object.freeze({\n credentialId: row[mapping.authorityCredential.credentialId],\n revision: row[mapping.authorityCredential.revision],\n }),\n ),\n ),\n });\n\n const targetIdentifier = lockedIdentifiers.get(\n `${input.target.namespace}\\u0000${input.target.value}`,\n );\n\n const targetOwned =\n targetIdentifier !== undefined &&\n mapping.subjectId.equals(\n targetIdentifier[mapping.identifier.subjectId],\n locked.nativeSubjectId,\n );\n\n const targetMutable =\n targetOwned &&\n mapping.identifier.isMutableTarget(targetIdentifier) &&\n (targetCredential === undefined ||\n (!mapping.credential.isActiveStatus(targetCredential[mapping.credential.status]) &&\n mapping.subjectId.equals(\n targetCredential[mapping.credential.subjectId],\n locked.nativeSubjectId,\n )));\n\n let source: CurrentAddress[\"source\"];\n\n if (input.sourceCredentialId !== undefined) {\n if (\n sourceCredential === undefined ||\n sourceIdentifier === undefined ||\n !mapping.subjectId.equals(\n sourceCredential[mapping.credential.subjectId],\n locked.nativeSubjectId,\n ) ||\n !mapping.credential.isActiveStatus(sourceCredential[mapping.credential.status])\n )\n return undefined;\n\n const sourceIdentifierRow = lockedIdentifiers.get(\n `${sourceIdentifier.namespace}\\u0000${sourceIdentifier.value}`,\n );\n\n if (\n sourceIdentifierRow === undefined ||\n !mapping.identifier.isCurrent(sourceIdentifierRow) ||\n !mapping.subjectId.equals(\n sourceIdentifierRow[mapping.identifier.subjectId],\n locked.nativeSubjectId,\n )\n )\n return undefined;\n\n const snapshot = yield* mapping.credential\n .decode({\n moduleId: input.moduleId,\n subject: locked.subject,\n identifier: sourceIdentifierRow,\n credential: sourceCredential,\n })\n .pipe(Effect.flatMap(snapshotEmailCredential));\n\n source = { credential: sourceCredential, identifier: sourceIdentifierRow, snapshot };\n }\n let eligible = targetIdentifier === undefined ? targetCredential === undefined : targetMutable;\n\n if (input.sourceCredentialId !== undefined && source === undefined) eligible = false;\n if (source !== undefined && sameIdentifier(source.snapshot.identifier, input.target))\n eligible = false;\n if (mapping.addressCardinality === \"single\" && input.sourceCredentialId === undefined) {\n const c = credentialColumns(mapping);\n\n const rows = yield* selectRows(\n database\n .select()\n .from(mapping.credential.table)\n .where(and(eq(c.moduleId, input.moduleId), eq(c.subjectId, locked.nativeSubjectId))),\n locking,\n );\n\n if (\n rows.some((row: any) => mapping.credential.isActiveStatus(row[mapping.credential.status]))\n )\n eligible = false;\n }\n\n return {\n nativeSubjectId: locked.nativeSubjectId,\n subject: locked.subject,\n revision,\n ...(source === undefined ? {} : { source }),\n ...(targetIdentifier === undefined ? {} : { targetIdentifier }),\n ...(targetCredential === undefined ? {} : { targetCredential }),\n ...(targetMutable\n ? { targetIdentifierRevision: targetIdentifier[mapping.identifier.bindingRevision] }\n : {}),\n eligible,\n };\n });\n\n 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\n const actionModule = (moduleId: string, action: EmailAction) =>\n `${moduleId}/${action === \"verify-address\" ? \"verify-address\" : \"change-address\"}`;\n\n const actionPurpose = (action: EmailAction) =>\n action === \"verify-address\" ? \"email-address-verification\" : \"email-address-change\";\n\n const completionMatches = (input: EmailAddressMutation, action: EmailAction) => {\n const completion = input.completion.input;\n const binding = completion.binding;\n\n return (\n completion.moduleId === actionModule(input.moduleId, action) &&\n completion.purpose === actionPurpose(action) &&\n binding._tag === \"IdentifierChange\" &&\n sameIdentifier(binding.identifier, input.target) &&\n sameEmailRevision(binding.revision, input.captured.revision)\n );\n };\n\n const snapshotEmailMutation = Effect.fn(\"DrizzleEmail.snapshotMutation\")(function* (\n input: EmailAddressMutation,\n ) {\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 const validateEmailAuthority = Effect.fn(\"DrizzleEmail.validateAuthority\")(function* (\n mapping: AddressMapping,\n configuration: EmailSqlConfiguration,\n input: EmailAddressMutation,\n action: EmailAction,\n ) {\n const confirmsExisting =\n action === \"verify-address\" && input.captured.targetIdentifierRevision !== undefined;\n\n if (\n !input.captured.eligible ||\n !completionMatches(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 mapping.sessionInvalidation !== \"same-authority-immediate\")\n )\n return undefined;\n\n const current = yield* currentAddress(\n mapping,\n {\n moduleId: input.moduleId,\n subjectId: input.captured.revision.subjectId,\n target: input.target,\n ...(input.captured.source === undefined\n ? {}\n : { sourceCredentialId: input.captured.source.credentialId }),\n },\n configuration.locking,\n );\n\n if (\n current === undefined ||\n !current.eligible ||\n !sameEmailRevision(current.revision, input.captured.revision) ||\n current.targetIdentifierRevision !== input.captured.targetIdentifierRevision ||\n (input.captured.source !== undefined &&\n (current.source === undefined ||\n current.source.snapshot.identifierRevision !== input.captured.source.identifierRevision ||\n current.source.snapshot.credentialRevision !== input.captured.source.credentialRevision ||\n !sameIdentifier(current.source.snapshot.identifier, input.captured.source.identifier)))\n )\n return undefined;\n\n const currentRequirement = yield* mapping.subject.decodeActionRequirement(\n current.subject,\n action,\n );\n\n const original = yield* assessAuthentication(\n input.authorization.evidence,\n input.authorization.requirement,\n ).pipe(Effect.mapError(unavailable));\n\n const configured = yield* assessAuthentication(\n input.authorization.evidence,\n currentRequirement,\n ).pipe(Effect.mapError(unavailable));\n\n return original.satisfied && configured.satisfied ? current : undefined;\n });\n\n const commandExists = Effect.fn(\"Drizzle.commandExists\")(function* (\n mapping: AddressMapping,\n moduleId: string,\n commandId: string,\n locking: boolean,\n ) {\n const database = yield* CurrentEmailSql;\n\n const c = commandColumns(mapping);\n\n return yield* selectRows(\n database\n .select()\n .from(mapping.command.table)\n .where(and(eq(c.moduleId, moduleId), eq(c.commandId, commandId)))\n .limit(1),\n locking,\n );\n });\n\n const applyMutation = Effect.fn(\"DrizzleEmail.applyMutation\")(function* (\n mapping: AddressMapping,\n input: EmailAddressMutation,\n action: EmailAction,\n current: CurrentAddress,\n allocated: {\n readonly targetCredentialId: string;\n readonly targetIdentifierRevision: SecurityRevision;\n readonly targetCredentialRevision: SecurityRevision;\n readonly sourceIdentifierRevision: SecurityRevision;\n readonly sourceCredentialRevision: SecurityRevision;\n readonly nextSecurityRevision: SecurityRevision;\n },\n now: number,\n ) {\n const database = yield* CurrentEmailSql;\n\n const i = identifierColumns(mapping);\n const c = credentialColumns(mapping);\n const a = authorityColumns(mapping);\n const s = subjectColumns(mapping);\n\n const targetCredentialId =\n current.targetCredential?.[mapping.credential.credentialId] ?? allocated.targetCredentialId;\n\n if (action === \"change-address\") {\n const source = current.source!;\n\n yield* database\n .update(mapping.identifier.table)\n .set(\n mapping.identifier.encodeRetirement({\n source: source.snapshot.identifier,\n bindingRevision: allocated.sourceIdentifierRevision,\n }),\n )\n .where(\n and(\n eq(i.namespace, source.snapshot.identifier.namespace),\n eq(i.value, source.snapshot.identifier.value),\n eq(i.subjectId, current.nativeSubjectId),\n eq(i.bindingRevision, source.snapshot.identifierRevision),\n ),\n );\n yield* database\n .update(mapping.credential.table)\n .set(\n mapping.credential.encodeRetirement({\n source: source.snapshot.identifier,\n credentialRevision: allocated.sourceCredentialRevision,\n }),\n )\n .where(\n and(\n eq(c.moduleId, input.moduleId),\n eq(c.credentialId, source.snapshot.credentialId),\n eq(c.subjectId, current.nativeSubjectId),\n eq(c.credentialRevision, source.snapshot.credentialRevision),\n ),\n );\n yield* database\n .update(mapping.authorityCredential.table)\n .set(mapping.authorityCredential.encodeRetirement(allocated.sourceCredentialRevision))\n .where(\n and(\n eq(a.subjectId, current.nativeSubjectId),\n eq(a.credentialId, source.snapshot.credentialId),\n eq(a.revision, source.snapshot.credentialRevision),\n ),\n );\n }\n if (current.targetIdentifier === undefined) {\n yield* database.insert(mapping.identifier.table).values(\n mapping.identifier.encodeVerifiedInsert({\n identifier: input.target,\n subjectId: current.nativeSubjectId,\n verifiedAtMillis: now,\n bindingRevision: allocated.targetIdentifierRevision,\n }),\n );\n } else {\n yield* database\n .update(mapping.identifier.table)\n .set(\n mapping.identifier.encodeVerification({\n verifiedAtMillis: now,\n bindingRevision: allocated.targetIdentifierRevision,\n }),\n )\n .where(\n and(\n eq(i.namespace, input.target.namespace),\n eq(i.value, input.target.value),\n eq(i.subjectId, current.nativeSubjectId),\n eq(i.bindingRevision, current.targetIdentifier![mapping.identifier.bindingRevision]),\n ),\n );\n }\n if (current.targetCredential === undefined) {\n yield* database.insert(mapping.credential.table).values(\n mapping.credential.encodeVerifiedInsert({\n moduleId: input.moduleId,\n subjectId: current.nativeSubjectId,\n credentialId: targetCredentialId,\n identifier: input.target,\n credentialRevision: allocated.targetCredentialRevision,\n }),\n );\n yield* database.insert(mapping.authorityCredential.table).values(\n mapping.authorityCredential.encodeInsert({\n subjectId: current.nativeSubjectId,\n credentialId: targetCredentialId,\n revision: allocated.targetCredentialRevision,\n }),\n );\n } else {\n const oldRevision = current.targetCredential[mapping.credential.credentialRevision];\n\n yield* database\n .update(mapping.credential.table)\n .set(\n mapping.credential.encodeActivation({\n identifier: input.target,\n credentialRevision: allocated.targetCredentialRevision,\n }),\n )\n .where(\n and(\n eq(c.moduleId, input.moduleId),\n eq(c.credentialId, targetCredentialId),\n eq(c.subjectId, current.nativeSubjectId),\n eq(c.credentialRevision, oldRevision),\n ),\n );\n yield* database\n .update(mapping.authorityCredential.table)\n .set(mapping.authorityCredential.encodeActivation(allocated.targetCredentialRevision))\n .where(\n and(\n eq(a.subjectId, current.nativeSubjectId),\n eq(a.credentialId, targetCredentialId),\n eq(a.revision, oldRevision),\n ),\n );\n }\n yield* database\n .update(mapping.subject.table)\n .set(updateValues([[mapping.subject.securityRevision, allocated.nextSecurityRevision]]))\n .where(\n and(\n eq(s.id, current.nativeSubjectId),\n eq(s.securityRevision, input.captured.revision.securityRevision),\n ),\n );\n yield* database.insert(mapping.command.table).values(\n mapping.command.encodeInsert({\n moduleId: input.moduleId,\n commandId: input.commandId,\n action,\n bindingDigest: input.authorization.challenge.bindingDigest,\n retentionUntilMillis: now + mapping.commandRetentionMillis,\n }),\n );\n\n const sourceStillActive =\n action === \"verify-address\"\n ? []\n : yield* selectRows(\n database\n .select()\n .from(mapping.credential.table)\n .where(\n and(\n eq(c.moduleId, input.moduleId),\n eq(c.credentialId, current.source!.snapshot.credentialId),\n eq(c.subjectId, current.nativeSubjectId),\n ),\n ),\n false,\n );\n\n const target = (yield* emailLookupRows(mapping, input.moduleId, input.target))[0];\n\n const targetAuthority = yield* selectRows(\n database\n .select()\n .from(mapping.authorityCredential.table)\n .where(\n and(eq(a.subjectId, current.nativeSubjectId), eq(a.credentialId, targetCredentialId)),\n )\n .limit(1),\n false,\n );\n\n const command = yield* selectRows(\n database\n .select()\n .from(mapping.command.table)\n .where(\n and(\n eq(commandColumns(mapping).moduleId, input.moduleId),\n eq(commandColumns(mapping).commandId, input.commandId),\n eq(commandColumns(mapping).action, action),\n eq(commandColumns(mapping).bindingDigest, input.authorization.challenge.bindingDigest),\n eq(\n commandColumns(mapping).retentionUntil,\n mapping.encodeInstant(now + mapping.commandRetentionMillis),\n ),\n ),\n )\n .limit(1),\n false,\n );\n\n const targetVerifiedAt =\n target === undefined\n ? undefined\n : yield* mapping.decodeInstant(target.identifier[mapping.identifier.verifiedAt]);\n\n const sourceIdentifier =\n action === \"verify-address\"\n ? []\n : yield* identifierRow(mapping, current.source!.snapshot.identifier, false);\n\n const sourceAuthority =\n action === \"verify-address\"\n ? []\n : yield* selectRows(\n database\n .select()\n .from(mapping.authorityCredential.table)\n .where(\n and(\n eq(a.subjectId, current.nativeSubjectId),\n eq(a.credentialId, current.source!.snapshot.credentialId),\n ),\n )\n .limit(1),\n false,\n );\n\n return (\n target !== undefined &&\n mapping.subjectId.equals(target.subject[mapping.subject.id], current.nativeSubjectId) &&\n mapping.subject.isActiveStatus(target.subject[mapping.subject.status]) &&\n target.subject[mapping.subject.securityRevision] === allocated.nextSecurityRevision &&\n target.identifier[mapping.identifier.bindingRevision] ===\n allocated.targetIdentifierRevision &&\n targetVerifiedAt === now &&\n target.credential[mapping.credential.credentialRevision] ===\n allocated.targetCredentialRevision &&\n target.credential[mapping.credential.credentialId] === targetCredentialId &&\n mapping.subjectId.equals(\n target.credential[mapping.credential.subjectId],\n current.nativeSubjectId,\n ) &&\n mapping.identifier.isCurrent(target.identifier) &&\n mapping.credential.isActiveStatus(target.credential[mapping.credential.status]) &&\n targetAuthority.length === 1 &&\n targetAuthority[0]![mapping.authorityCredential.revision] ===\n allocated.targetCredentialRevision &&\n mapping.authorityCredential.isActiveStatus(\n targetAuthority[0]![mapping.authorityCredential.status],\n ) &&\n command.length === 1 &&\n (action === \"verify-address\" ||\n (sourceStillActive.length === 1 &&\n sourceStillActive[0]![mapping.credential.credentialRevision] ===\n allocated.sourceCredentialRevision &&\n !mapping.credential.isActiveStatus(sourceStillActive[0]![mapping.credential.status]) &&\n sourceIdentifier.length === 1 &&\n mapping.subjectId.equals(\n sourceIdentifier[0]![mapping.identifier.subjectId],\n current.nativeSubjectId,\n ) &&\n sourceIdentifier[0]![mapping.identifier.bindingRevision] ===\n allocated.sourceIdentifierRevision &&\n !mapping.identifier.isCurrent(sourceIdentifier[0]!) &&\n sourceAuthority.length === 1 &&\n sourceAuthority[0]![mapping.authorityCredential.revision] ===\n allocated.sourceCredentialRevision &&\n !mapping.authorityCredential.isActiveStatus(\n sourceAuthority[0]![mapping.authorityCredential.status],\n )))\n );\n });\n\n const probeProofCompletion = Effect.fn(\"Drizzle.probeProofCompletion\")(function* (\n configuration: EmailSqlConfiguration,\n input: ProofCompletionInput,\n ) {\n const database = yield* CurrentEmailSql;\n\n if (configuration.proof === undefined) return yield* Effect.fail(unavailable());\n const validProbe = { _tag: \"EmailProofCompletionValid\" } as const;\n\n const plan = {\n input,\n prepare: <A>(\n decision: ProofCompletionDecision,\n journal: CommitJournal,\n project: (decision: ProofCompletionDecision) => A,\n ) => journal.prepare(project(decision)),\n };\n\n const probe = coordinateCommit(\n () =>\n database.transaction((transaction) =>\n completeProofPlanIn(\n configuration.proof!.mapping,\n configuration.proof!.configuration,\n plan,\n Effect.fail(validProbe),\n () => false,\n ).pipe(\n Effect.provideService(CurrentProofSql, transaction as unknown as ProofSqlDatabase),\n ),\n ),\n { mode: configuration.mode },\n );\n\n return yield* probe.pipe(\n Effect.as(false),\n Effect.catchCause((cause) => {\n const reason = cause.reasons[0];\n\n return cause.reasons.length === 1 &&\n reason !== undefined &&\n Cause.isFailReason(reason) &&\n reason.error === validProbe\n ? Effect.succeed(true)\n : Effect.failCause(cause);\n }),\n );\n });\n\n const prepareRejected = Effect.fn(\"Drizzle.prepareRejected\")(function* <A>(\n configuration: EmailSqlConfiguration,\n prepare: (value: \"rejected\", journal: CommitJournal) => PreparedCommit<A>,\n ) {\n const database = yield* CurrentEmailSql;\n\n return yield* owned(\n database,\n configuration,\n Effect.gen(function* () {\n const journal = yield* CurrentCommitJournal;\n\n return yield* Effect.succeed(prepare(\"rejected\", journal));\n }),\n );\n });\n\n const makeSqlEmailAddressPersistence = Effect.fn(\"makeSqlEmailAddressPersistence\")(function* (\n mapping: AddressMapping,\n configuration: EmailSqlConfiguration,\n ): Effect.fn.Return<\n EmailAddressPersistence[\"Service\"],\n EmailUnavailable,\n LifecycleHooks | CurrentEmailSql | NativeDatabase\n > {\n const database = yield* CurrentEmailSql;\n\n if (!configuration.coordinated)\n yield* (\n operations.validateStorage?.({\n ...mapping,\n proof: configuration.proof?.mapping,\n }) ?? Effect.void\n ).pipe(Effect.mapError(unavailable));\n const hooks = yield* LifecycleHooks;\n\n return EmailAddressPersistence.of({\n target: (input) =>\n (validAddressConstraints(mapping)\n ? safeRead(\n database,\n configuration,\n Effect.gen(function* () {\n const current = yield* currentAddress(mapping, input, configuration.locking);\n\n if (current === undefined) return yield* unavailable();\n\n return Object.freeze({\n revision: snapshotEmailRevision(current.revision),\n eligible: current.eligible,\n ...(current.targetIdentifierRevision === undefined\n ? {}\n : { targetIdentifierRevision: current.targetIdentifierRevision }),\n ...(current.source === undefined\n ? {}\n : { source: yield* snapshotEmailCredential(current.source.snapshot) }),\n });\n }),\n )\n : Effect.fail(unavailable())\n ).pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n ),\n checkCompletion: (input) => {\n if (configuration.proof === undefined || input.binding._tag !== \"IdentifierChange\")\n return Effect.succeed(false).pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n );\n const binding = input.binding;\n\n return safeRead(\n database,\n configuration,\n Effect.gen(function* () {\n const action: EmailAction | undefined =\n input.moduleId.endsWith(\"/verify-address\") &&\n input.purpose === \"email-address-verification\"\n ? \"verify-address\"\n : input.moduleId.endsWith(\"/change-address\") &&\n input.purpose === \"email-address-change\"\n ? \"change-address\"\n : undefined;\n\n if (action === undefined) return false;\n const moduleId = input.moduleId.slice(0, -`/${action}`.length);\n\n const current = yield* currentAddress(\n mapping,\n {\n moduleId,\n subjectId: binding.revision.subjectId,\n target: binding.identifier,\n },\n false,\n );\n\n return current !== undefined && sameEmailRevision(current.revision, binding.revision);\n }),\n )\n .pipe(\n Effect.flatMap((current) =>\n current ? probeProofCompletion(configuration, input) : Effect.succeed(false),\n ),\n )\n .pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n );\n },\n verifyWithProof: (uncaptured, prepare) =>\n mutateAddress(mapping, configuration, uncaptured, \"verify-address\", prepare).pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n ),\n changeWithProof: (uncaptured, prepare) =>\n mutateAddress(mapping, configuration, uncaptured, \"change-address\", prepare).pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n ),\n cleanup: (input, prepare) =>\n owned(\n database,\n configuration,\n Effect.gen(function* () {\n const transaction = yield* CurrentEmailSql;\n const journal = yield* CurrentCommitJournal;\n\n const c = commandColumns(mapping);\n const now = yield* nowMillis;\n\n const rows = yield* selectRows(\n transaction\n .select({ commandId: c.commandId })\n .from(mapping.command.table)\n .where(\n and(\n eq(c.moduleId, input.moduleId),\n lte(c.retentionUntil, mapping.encodeInstant(now)),\n ),\n )\n .limit(input.limit + 1),\n configuration.locking,\n );\n\n const selected = rows.slice(0, input.limit);\n\n const receipt = prepare(\n { removed: selected.length, hasMore: rows.length > input.limit },\n journal,\n );\n\n if (selected.length > 0)\n yield* transaction.delete(mapping.command.table).where(\n and(\n eq(c.moduleId, input.moduleId),\n inArray(\n c.commandId,\n selected.map((row: any) => row.commandId),\n ),\n lte(c.retentionUntil, mapping.encodeInstant(now)),\n ),\n );\n\n return receipt;\n }),\n ).pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n ),\n });\n });\n\n const mutateAddress = Effect.fn(\"Drizzle.mutateAddress\")(function* <A>(\n mapping: AddressMapping,\n configuration: EmailSqlConfiguration,\n uncaptured: EmailAddressMutation,\n action: EmailAction,\n prepare: (value: \"changed\" | \"rejected\", journal: CommitJournal) => PreparedCommit<A>,\n ) {\n const database = yield* CurrentEmailSql;\n\n if (!validAddressConstraints(mapping) || configuration.proof === undefined)\n return yield* unavailable();\n const input = yield* snapshotEmailMutation(uncaptured);\n\n const targetCredentialId = yield* allocate(\n configuration.mode,\n mapping.allocateCredentialId,\n mapping.allocateCredentialIdSync,\n );\n\n const targetIdentifierRevision = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const targetCredentialRevision = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const sourceIdentifierRevision = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const sourceCredentialRevision = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const confirmsExisting =\n action === \"verify-address\" && input.captured.targetIdentifierRevision !== undefined;\n\n const nextRevision = confirmsExisting\n ? input.captured.revision.securityRevision\n : yield* nextSecurityRevision(\n mapping,\n configuration.mode,\n input.captured.revision.securityRevision,\n );\n\n if (\n (!confirmsExisting && nextRevision === input.captured.revision.securityRevision) ||\n [\n targetIdentifierRevision,\n targetCredentialRevision,\n sourceIdentifierRevision,\n sourceCredentialRevision,\n ].some((value) => input.captured.revision.credentials.some((item) => item.revision === value))\n )\n return yield* unavailable();\n\n const run = owned(\n database,\n configuration,\n Effect.gen(function* () {\n const journal = yield* CurrentCommitJournal;\n\n const current = yield* validateEmailAuthority(mapping, configuration, input, action);\n\n if (current === undefined) return prepare(\"rejected\", journal);\n if (\n (yield* commandExists(mapping, input.moduleId, input.commandId, configuration.locking))\n .length > 0\n )\n return prepare(\"rejected\", journal);\n let receipt: PreparedCommit<A> | undefined;\n\n yield* completeProofPlanIn(\n configuration.proof!.mapping,\n configuration.proof!.configuration,\n input.completion,\n Effect.gen(function* () {\n // The proof helper may wait on continuation/series locks. Read the\n // commit clock and reassess both policies only after those locks.\n const currentRequirement = yield* mapping.subject.decodeActionRequirement(\n current.subject,\n action,\n );\n\n const original = yield* assessAuthentication(\n input.authorization.evidence,\n input.authorization.requirement,\n ).pipe(Effect.mapError(unavailable));\n\n const configured = yield* assessAuthentication(\n input.authorization.evidence,\n currentRequirement,\n ).pipe(Effect.mapError(unavailable));\n\n if (!original.satisfied || !configured.satisfied) return false;\n const now = yield* nowMillis;\n\n return yield* applyMutation(\n mapping,\n input,\n action,\n current,\n {\n targetCredentialId,\n targetIdentifierRevision,\n targetCredentialRevision,\n sourceIdentifierRevision,\n sourceCredentialRevision,\n nextSecurityRevision: nextRevision,\n },\n now,\n );\n }),\n (decision) => {\n receipt = prepare(decision === \"completed\" ? \"changed\" : \"rejected\", journal);\n\n return decision;\n },\n );\n\n return receipt ?? prepare(\"rejected\", journal);\n }),\n );\n\n return yield* run.pipe(\n Effect.catchCause((cause) =>\n (cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isCommandConflict, cause)) ||\n (cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isIdentifierConflict, cause)) ||\n (cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isCredentialConflict, cause))\n ? prepareRejected(configuration, prepare)\n : Effect.failCause(cause),\n ),\n );\n });\n\n return {\n validEmailSignInConstraints,\n emailLookupQuery,\n decodeEmailSnapshot,\n makeSqlEmailSignInTargets,\n currentAddress,\n sameEmailRevision,\n snapshotEmailMutation,\n validateEmailAuthority,\n makeSqlEmailAddressPersistence,\n };\n};\n"],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- //#region src/internal/models/passkey-registration-ceremony-model.ts
2
- const requiredPasskeyRegistrationCeremonyConstraints = {
3
- flow: ["moduleId", "flowId"],
4
- command: ["moduleId", "commandId"],
5
- admission: ["authorityScope", "moduleId"],
6
- charge: [
7
- "moduleId",
8
- "flowId",
9
- "kind"
10
- ],
11
- intentFlow: ["moduleId", "flowId"],
12
- intentCommand: ["moduleId", "commandId"],
13
- handle: ["handleKey"]
14
- };
15
- //#endregion
16
- export { requiredPasskeyRegistrationCeremonyConstraints };
17
-
18
- //# sourceMappingURL=passkey-registration-ceremony-model.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"passkey-registration-ceremony-model.mjs","names":[],"sources":["../../../src/internal/models/passkey-registration-ceremony-model.ts"],"sourcesContent":["import type { TableModel as Table, SqlExpression } from \"../query-operations\";\nimport type {\n PasskeyCeremonyMapping,\n PasskeyChargeTable,\n PasskeyColumn,\n PasskeyFlowTable,\n PasskeyHandleReservationTable,\n PasskeyPersistenceServices,\n} from \"./passkey-model\";\n\nexport interface PasskeyRegistrationCeremonyCapabilities {\n readonly purposes: readonly [\"registration\"];\n readonly issue: \"registration-authority\";\n readonly assertionSettlement: false;\n}\n\nexport interface PasskeyRegistrationCeremonyServices extends PasskeyPersistenceServices {\n readonly capabilities: PasskeyRegistrationCeremonyCapabilities;\n}\n\n/** Read-only custody supplied by a separate registration issuance authority.\n * No application payload codec, subject codec or provisioning callback runs here. */\nexport interface PasskeyRegistrationIntentReadTable<\n T extends Table,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly moduleId: PasskeyColumn<T>;\n readonly flowId: PasskeyColumn<T>;\n readonly commandId: PasskeyColumn<T>;\n readonly state: PasskeyColumn<T>;\n readonly version: PasskeyColumn<T>;\n readonly fingerprint: PasskeyColumn<T>;\n readonly handleKey: PasskeyColumn<T>;\n readonly reservationId: PasskeyColumn<T>;\n readonly ceremonySnapshot: PasskeyColumn<T>;\n /** Already validated by the issuing authority; compare opaque bytes only. */\n readonly applicationSnapshot: PasskeyColumn<T>;\n readonly pendingCondition: Expression;\n readonly isPendingState: (value: unknown) => boolean;\n /** Any unresolved initial intent or provisioning job; cleanup never releases it. */\n readonly custodyCondition: Expression;\n}\n\nexport const requiredPasskeyRegistrationCeremonyConstraints = {\n flow: [\"moduleId\", \"flowId\"],\n command: [\"moduleId\", \"commandId\"],\n admission: [\"authorityScope\", \"moduleId\"],\n charge: [\"moduleId\", \"flowId\", \"kind\"],\n intentFlow: [\"moduleId\", \"flowId\"],\n intentCommand: [\"moduleId\", \"commandId\"],\n handle: [\"handleKey\"],\n} as const;\n\nexport interface PasskeyRegistrationCeremonyMapping<\n Module extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n Intent extends Table,\n Handle extends Table,\n Expression extends SqlExpression = SqlExpression,\n> extends Omit<\n PasskeyCeremonyMapping<Module, Flow, Admission, Charge, Expression>,\n \"constraints\" | \"flow\" | \"charge\"\n> {\n readonly flow: Omit<PasskeyFlowTable<Flow>, \"encodeInsert\">;\n readonly charge: Omit<PasskeyChargeTable<Charge>, \"encodeInsert\">;\n readonly intent: PasskeyRegistrationIntentReadTable<Intent, Expression>;\n readonly handle: PasskeyHandleReservationTable<Handle, Expression>;\n readonly constraints: typeof requiredPasskeyRegistrationCeremonyConstraints;\n}\n"],"mappings":";AA4CA,MAAa,iDAAiD;CAC5D,MAAM,CAAC,YAAY,QAAQ;CAC3B,SAAS,CAAC,YAAY,WAAW;CACjC,WAAW,CAAC,kBAAkB,UAAU;CACxC,QAAQ;EAAC;EAAY;EAAU;CAAM;CACrC,YAAY,CAAC,YAAY,QAAQ;CACjC,eAAe,CAAC,YAAY,WAAW;CACvC,QAAQ,CAAC,WAAW;AACtB"}
@@ -1,8 +0,0 @@
1
- import "../mapping-error.mjs";
2
- import "./owner.mjs";
3
- import "./query-compiler.mjs";
4
- import "./flow.mjs";
5
- import "./registration.mjs";
6
- import { Context, Effect, Layer } from "effect";
7
- import { SecurityRevision } from "@yielded/auth/Sessions";
8
- import { OAuthAccountRevision, OAuthLinkAccess } from "@yielded/auth/OAuth";
@@ -1,379 +0,0 @@
1
- import { CurrentOAuthTransaction } from "./owner.mjs";
2
- import { OAuthQueryCompiler } from "./query-compiler.mjs";
3
- import { invariant, oauthIdentityKey, sameRevision, satisfies, storage, validAction } from "./state.mjs";
4
- import { OAuthFlow } from "./flow.mjs";
5
- import { OAuthRegistration } from "./registration.mjs";
6
- import { Context, DateTime, Effect, Layer } from "effect";
7
- import { AuthenticationRequirement, SecurityRevision, SessionInvalidationWindow } from "@yielded/auth/Sessions";
8
- import { OAuthAccountRevision, OAuthActionAuthorization, OAuthCredentialSnapshot, OAuthLinkAccess, OAuthLinkClaim, OAuthLinkPendingFlow, OAuthLinkTransactionContext, OAuthUnlinked, snapshotOAuthSync } from "@yielded/auth/OAuth";
9
- //#region src/internal/oauth/accounts.ts
10
- const make$1 = Effect.gen(function* () {
11
- const operations = yield* OAuthQueryCompiler;
12
- const flow = yield* OAuthFlow;
13
- const registration = yield* OAuthRegistration;
14
- const { eq, sql } = operations;
15
- const { claimFlow, credentialStorage, currentSubject, exactClaim, issueFlow, linkStorage, matchesAccess, readFlow, terminalFlow } = flow;
16
- const { both, col, copiedRow, equal } = operations;
17
- const { acquireTuple, readTuple } = registration;
18
- const contextStorage = storage(OAuthLinkTransactionContext);
19
- const unlinkedStorage = storage(OAuthUnlinked);
20
- const accountCurrent = (mapping, subjectId) => Effect.gen(function* () {
21
- const native = yield* mapping.subjectId.toNative(subjectId);
22
- return yield* currentSubject(mapping, native);
23
- });
24
- const authorization = (mapping, current, auth, action, flowId, commandId, intent, maximumAge) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
25
- const now = yield* owner.now(mapping.clock);
26
- const currentRequirement = snapshotOAuthSync(AuthenticationRequirement, mapping.subject.decodeActionRequirement(copiedRow(current.row), action));
27
- if (!(yield* validAction(auth, {
28
- moduleId: auth.challenge.moduleId,
29
- action,
30
- flowId,
31
- commandId,
32
- revision: current.revision,
33
- intent
34
- }, currentRequirement, now, maximumAge))) return false;
35
- const age = Math.min(maximumAge, auth.requirement.maximumAgeMillis, currentRequirement.maximumAgeMillis);
36
- const fresh = auth.evidence.proofs.filter((proof) => now - DateTime.toEpochMillis(proof.verifiedAt) < age);
37
- invariant(fresh.length > 0);
38
- const deadline = Math.min(...fresh.map((proof) => DateTime.toEpochMillis(proof.verifiedAt) + age));
39
- owner.postconditions.push(sql`${mapping.clock.engineNowMillis} >= ${now} and ${mapping.clock.engineNowMillis} < ${deadline}`);
40
- return true;
41
- }));
42
- const currentLink = (mapping, flow) => Effect.gen(function* () {
43
- const current = yield* accountCurrent(mapping, flow.context.revision.subjectId);
44
- return current !== void 0 && sameRevision(current.revision, flow.context.revision) ? current : void 0;
45
- });
46
- const issueLink = (mapping, input) => Effect.gen(function* () {
47
- const flow = snapshotOAuthSync(OAuthLinkPendingFlow, input.flow), c = flow.context;
48
- const current = yield* currentLink(mapping, flow);
49
- const auth = snapshotOAuthSync(OAuthActionAuthorization, input.authorization);
50
- if (current === void 0 || auth.challenge.moduleId !== c.moduleId || !(yield* authorization(mapping, current, auth, "link-begin", c.flowId, c.commandId, contextStorage.encode(c), c.maximumEvidenceAgeMillis))) return { _tag: "Rejected" };
51
- return yield* issueFlow(mapping, flow, "link");
52
- });
53
- const preflightLink = (mapping, original) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
54
- const input = snapshotOAuthSync(OAuthLinkAccess, original);
55
- const current = yield* accountCurrent(mapping, input.subjectId);
56
- const found = yield* readFlow(mapping, input, "link");
57
- const now = yield* owner.now(mapping.clock);
58
- if (current === void 0 || found.flow === void 0 || found.row?.[mapping.flow.state] !== "Pending" || !matchesAccess(found.flow, input)) return void 0;
59
- const flow = snapshotOAuthSync(OAuthLinkPendingFlow, found.flow), c = flow.context;
60
- if (c.revision.subjectId !== input.subjectId || !sameRevision(current.revision, c.revision) || now < c.issuedAtMillis || now >= c.expiresAtMillis) return void 0;
61
- owner.postconditions.push(sql`${mapping.clock.engineNowMillis} >= ${c.issuedAtMillis} and ${mapping.clock.engineNowMillis} < ${c.expiresAtMillis}`);
62
- return {
63
- current,
64
- flow,
65
- row: found.row
66
- };
67
- }));
68
- const claimLink = (mapping, input) => Effect.gen(function* () {
69
- const found = yield* preflightLink(mapping, input.access);
70
- const flow = snapshotOAuthSync(OAuthLinkPendingFlow, input.flow);
71
- const auth = snapshotOAuthSync(OAuthActionAuthorization, input.authorization), c = flow.context;
72
- if (found === void 0 || linkStorage.encode(found.flow) !== linkStorage.encode(flow) || auth.challenge.moduleId !== c.moduleId || !(yield* authorization(mapping, found.current, auth, "link-complete", c.flowId, c.commandId, contextStorage.encode(c), c.maximumEvidenceAgeMillis))) return { _tag: "Rejected" };
73
- const claim = yield* claimFlow(mapping, {
74
- row: found.row,
75
- flow
76
- }, input.claimId);
77
- return claim === void 0 ? { _tag: "Rejected" } : {
78
- _tag: "Claimed",
79
- claim
80
- };
81
- });
82
- const checkInvalidation = (mapping, original) => {
83
- const value = snapshotOAuthSync(SessionInvalidationWindow, original);
84
- invariant(value.trigger === "credential-change" && value.oldAuthenticationEvidence === "rejected" && (mapping.sessionInvalidation === "same-authority-immediate" ? value.existingSessions === "immediate" && value.maximumExposureMillis === 0 : value.existingSessions === "original-absolute-expiry"));
85
- return value;
86
- };
87
- const advance = (mapping, current, removed) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
88
- const revision = mapping.subject.nextSecurityRevision(current.revision.securityRevision);
89
- invariant(typeof revision === "string" && revision.length > 0 && revision.length <= 256 && revision !== current.revision.securityRevision);
90
- const subject = mapping.subject;
91
- yield* owner.update(subject.table, { [subject.id]: current.nativeId }, { [subject.securityRevision]: revision });
92
- for (const cleanup of mapping.cleanup) {
93
- const condition = both(eq(col(cleanup.table, cleanup.subjectId), current.nativeId), cleanup.condition({
94
- subjectId: current.nativeId,
95
- revision: snapshotOAuthSync(OAuthAccountRevision, current.revision),
96
- ...removed === void 0 ? {} : { removedCredentialId: removed }
97
- }));
98
- yield* owner.write(owner.database.delete(cleanup.table).where(condition));
99
- owner.postconditions.push(sql`not exists(select 1 from ${cleanup.table} where ${condition})`);
100
- }
101
- return SecurityRevision.make(revision);
102
- }));
103
- const settleLink = (mapping, input, allocated) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
104
- const claim = snapshotOAuthSync(OAuthLinkClaim, input.claim), flow = claim.flow, c = flow.context;
105
- const current = yield* currentLink(mapping, flow);
106
- const identity = input.outcome._tag === "Verified" ? input.outcome.identity.identity : void 0;
107
- if (identity !== void 0) invariant(identity.provider === c.provider && identity.issuer === c.issuer);
108
- const tuple = identity !== void 0 && current !== void 0 ? yield* readTuple(mapping.ownership, identity) : void 0;
109
- if ((yield* exactClaim(mapping, claim, "link")) === void 0) return { _tag: "Rejected" };
110
- let decision = { _tag: input.outcome._tag };
111
- if (input.outcome._tag === "Verified") {
112
- decision = { _tag: "Rejected" };
113
- const auth = snapshotOAuthSync(OAuthActionAuthorization, input.authorization);
114
- if (current !== void 0 && tuple !== void 0 && auth.challenge.moduleId === c.moduleId && (yield* authorization(mapping, current, auth, "link-complete", c.flowId, c.commandId, contextStorage.encode(c), c.maximumEvidenceAgeMillis))) {
115
- const t = mapping.ownership.tuple, cr = mapping.credential, a = mapping.authority;
116
- const login = yield* owner.read(cr.table, eq(col(cr.table, cr.identityKey), tuple.key), { limit: 1 });
117
- const previous = login.rows[0];
118
- if (tuple.row[t.state] === "Reserved" || tuple.row[t.state] === "Owned" && !mapping.subjectId.equals(tuple.row[t.subjectId], current.nativeId) || previous !== void 0 && (previous[cr.moduleId] !== c.moduleId || !mapping.subjectId.equals(previous[cr.subjectId], current.nativeId) || !cr.isActiveStatus(previous[cr.status]))) decision = { _tag: "Conflict" };
119
- else if (previous !== void 0) {
120
- const shared = current.revision.credentials.find((item) => item.credentialId === previous[cr.credentialId]);
121
- if (tuple.row[t.state] !== "Owned" || shared?.revision !== previous[cr.credentialRevision] || !(yield* owner.check(sql`exists(select 1 from ${cr.table} where ${both(eq(col(cr.table, cr.identityKey), tuple.key), cr.activeCondition)})`))) decision = { _tag: "Conflict" };
122
- else decision = {
123
- _tag: "Linked",
124
- changed: false,
125
- credential: snapshotOAuthSync(OAuthCredentialSnapshot, {
126
- moduleId: c.moduleId,
127
- identity,
128
- credentialId: previous[cr.credentialId],
129
- credentialRevision: previous[cr.credentialRevision],
130
- revision: current.revision
131
- })
132
- };
133
- } else {
134
- checkInvalidation(mapping, input.invalidation);
135
- const values = {
136
- ...cr.encodeInsert({
137
- moduleId: c.moduleId,
138
- subjectId: current.nativeId,
139
- identityKey: tuple.key,
140
- credentialId: allocated.credentialId,
141
- credentialRevision: allocated.revision
142
- }),
143
- [cr.moduleId]: c.moduleId,
144
- [cr.subjectId]: current.nativeId,
145
- [cr.identityKey]: tuple.key,
146
- [cr.credentialId]: allocated.credentialId,
147
- [cr.credentialRevision]: allocated.revision
148
- };
149
- invariant(cr.isActiveStatus(values[cr.status]));
150
- login.rows = (yield* owner.insert(cr.table, values, { [cr.credentialId]: allocated.credentialId })).rows;
151
- const sharedValues = {
152
- ...a.encodeInsert({
153
- subjectId: current.nativeId,
154
- credentialId: allocated.credentialId,
155
- revision: allocated.revision
156
- }),
157
- [a.subjectId]: current.nativeId,
158
- [a.credentialId]: allocated.credentialId,
159
- [a.revision]: allocated.revision
160
- };
161
- invariant(a.isActiveStatus(sharedValues[a.status]));
162
- const shared = yield* owner.insert(a.table, sharedValues, {
163
- [a.subjectId]: current.nativeId,
164
- [a.credentialId]: allocated.credentialId
165
- });
166
- current.authorities.rows = [...current.authorities.rows, ...shared.rows];
167
- owner.postconditions.push(sql`exists(select 1 from ${cr.table} where ${both(eq(col(cr.table, cr.credentialId), allocated.credentialId), cr.activeCondition)})`, sql`exists(select 1 from ${a.table} where ${both(eq(col(a.table, a.subjectId), current.nativeId), eq(col(a.table, a.credentialId), allocated.credentialId), a.activeCondition)})`);
168
- if (tuple.row[t.state] === "Unowned") yield* acquireTuple(mapping.ownership, identity, tuple.key, current.nativeId);
169
- const next = yield* advance(mapping, current);
170
- const revision = snapshotOAuthSync(OAuthAccountRevision, {
171
- ...current.revision,
172
- securityRevision: next,
173
- credentials: [...current.revision.credentials, {
174
- credentialId: allocated.credentialId,
175
- revision: allocated.revision
176
- }]
177
- });
178
- decision = {
179
- _tag: "Linked",
180
- changed: true,
181
- credential: snapshotOAuthSync(OAuthCredentialSnapshot, {
182
- moduleId: c.moduleId,
183
- identity,
184
- credentialId: allocated.credentialId,
185
- credentialRevision: allocated.revision,
186
- revision
187
- })
188
- };
189
- }
190
- }
191
- }
192
- yield* terminalFlow(mapping, flow, decision._tag);
193
- return decision;
194
- }));
195
- const targetCredential = (mapping, moduleId, credentialId, current) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
196
- const cr = mapping.credential;
197
- const row = (yield* owner.read(cr.table, eq(col(cr.table, cr.credentialId), credentialId), { limit: 1 })).rows[0];
198
- if (row === void 0 || row[cr.moduleId] !== moduleId || !mapping.subjectId.equals(row[cr.subjectId], current.nativeId) || !cr.isActiveStatus(row[cr.status])) return void 0;
199
- const t = mapping.ownership.tuple;
200
- const ownership = (yield* owner.read(t.table, eq(col(t.table, t.identityKey), row[cr.identityKey]), { limit: 1 })).rows[0];
201
- if (ownership === void 0 || ownership[t.state] !== "Owned" || !mapping.subjectId.equals(ownership[t.subjectId], current.nativeId)) return void 0;
202
- const identity = {
203
- provider: ownership[t.provider],
204
- issuer: ownership[t.issuer],
205
- subject: ownership[t.externalSubject]
206
- };
207
- invariant((yield* oauthIdentityKey(identity)) === row[cr.identityKey]);
208
- if (current.revision.credentials.find((item) => item.credentialId === credentialId)?.revision !== row[cr.credentialRevision] || !(yield* owner.check(sql`exists(select 1 from ${cr.table} where ${both(eq(col(cr.table, cr.credentialId), credentialId), cr.activeCondition)})`))) return void 0;
209
- return snapshotOAuthSync(OAuthCredentialSnapshot, {
210
- moduleId,
211
- identity,
212
- credentialId,
213
- credentialRevision: row[cr.credentialRevision],
214
- revision: current.revision
215
- });
216
- }));
217
- const unlinkCommand = (mapping, moduleId, commandId) => Effect.flatMap(CurrentOAuthTransaction, (owner) => owner.read(mapping.command.table, equal(mapping.command.table, {
218
- [mapping.command.moduleId]: moduleId,
219
- [mapping.command.commandId]: commandId
220
- }), { limit: 1 }));
221
- const inspectUnlink = (mapping, input) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
222
- const current = yield* accountCurrent(mapping, input.subjectId);
223
- if (current === void 0) return { _tag: "Rejected" };
224
- const command = yield* unlinkCommand(mapping, input.moduleId, input.commandId), r = mapping.command;
225
- const old = command.rows[0];
226
- if (old !== void 0) {
227
- const intent = credentialStorage.decode(old[r.intentSnapshot]);
228
- if (intent.moduleId !== input.moduleId || intent.revision.subjectId !== input.subjectId || intent.credentialId !== input.credentialId || !mapping.subjectId.equals(old[r.subjectId], current.nativeId) || old[r.credentialId] !== input.credentialId) return { _tag: "Conflict" };
229
- const metadata = mapping.metadata.condition(current.nativeId);
230
- if (!(yield* owner.check(metadata))) return { _tag: "Rejected" };
231
- owner.postconditions.push(metadata);
232
- return {
233
- _tag: "Replay",
234
- result: unlinkedStorage.decode(old[r.decision])
235
- };
236
- }
237
- const credential = yield* targetCredential(mapping, input.moduleId, input.credentialId, current);
238
- return credential === void 0 ? { _tag: "Rejected" } : {
239
- _tag: "Target",
240
- credential
241
- };
242
- }));
243
- const remainingEligibility = (mapping, current, removed) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
244
- invariant(mapping.eligibility.length > 0 && mapping.eligibility.length <= 32);
245
- const facts = /* @__PURE__ */ new Map();
246
- const revisions = new Map(current.revision.credentials.map((item) => [item.credentialId, item.revision]));
247
- for (const descriptor of mapping.eligibility) {
248
- const observed = yield* owner.read(descriptor.table, both(eq(col(descriptor.table, descriptor.subjectId), current.nativeId), descriptor.condition(current.nativeId)), { orderBy: col(descriptor.table, descriptor.credentialId) });
249
- for (const row of observed.rows) {
250
- const fact = descriptor.decode(copiedRow(row));
251
- if (fact === void 0 || fact.credentialId === removed) continue;
252
- invariant(fact.credentialId === row[descriptor.credentialId] && fact.revision === row[descriptor.revision] && revisions.get(fact.credentialId) === fact.revision && fact.factors.length <= 8 && fact.factors.every((factor) => [
253
- "knowledge",
254
- "possession",
255
- "inherence"
256
- ].includes(factor)));
257
- invariant(typeof fact.usablePrimary === "boolean" && typeof fact.userVerified === "boolean" && typeof fact.phishingResistant === "boolean");
258
- const normalized = {
259
- credentialId: fact.credentialId,
260
- revision: fact.revision,
261
- usablePrimary: fact.usablePrimary,
262
- factors: [...new Set(fact.factors)].sort(),
263
- userVerified: fact.userVerified,
264
- phishingResistant: fact.phishingResistant
265
- };
266
- const prior = facts.get(fact.credentialId);
267
- invariant(prior === void 0 || JSON.stringify(prior) === JSON.stringify(normalized));
268
- facts.set(fact.credentialId, normalized);
269
- }
270
- }
271
- const available = [...facts.values()];
272
- const requirement = snapshotOAuthSync(AuthenticationRequirement, mapping.subject.decodeAuthenticationRequirement(copiedRow(current.row)));
273
- return available.some((fact) => fact.usablePrimary) && satisfies(available, requirement);
274
- }));
275
- const unlink = (mapping, input) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
276
- const expected = snapshotOAuthSync(OAuthCredentialSnapshot, input.credential);
277
- invariant(expected.moduleId === input.moduleId);
278
- const current = yield* accountCurrent(mapping, expected.revision.subjectId);
279
- if (current === void 0) return { _tag: "Rejected" };
280
- const guards = mapping.connectedReferenceGuards ?? [];
281
- invariant(guards.length <= 32);
282
- let referencesGuarded = mapping.connectedReference !== void 0 && guards.length > 0;
283
- if (mapping.connectedReference !== void 0) for (const guard of guards) {
284
- const condition = guard.condition({
285
- identity: snapshotOAuthSync(OAuthCredentialSnapshot.fields.identity, expected.identity),
286
- identityKey: yield* oauthIdentityKey(expected.identity),
287
- subjectId: copiedRow({ value: current.nativeId }).value
288
- });
289
- if ((yield* owner.read(guard.table, Effect.isEffect(condition) ? yield* condition : condition, { orderBy: col(guard.table, guard.orderBy) })).rows.length === 0) referencesGuarded = false;
290
- }
291
- const command = yield* unlinkCommand(mapping, input.moduleId, input.commandId), r = mapping.command;
292
- const previous = command.rows[0];
293
- if (previous !== void 0) {
294
- if (previous[r.intentSnapshot] !== credentialStorage.encode(expected) || previous[r.credentialId] !== expected.credentialId || !mapping.subjectId.equals(previous[r.subjectId], current.nativeId)) return { _tag: "Conflict" };
295
- const metadata = mapping.metadata.condition(current.nativeId);
296
- if (!(yield* owner.check(metadata))) return { _tag: "Rejected" };
297
- owner.postconditions.push(metadata);
298
- return {
299
- _tag: "Unlinked",
300
- replayed: true,
301
- result: unlinkedStorage.decode(previous[r.decision])
302
- };
303
- }
304
- const actual = yield* targetCredential(mapping, input.moduleId, expected.credentialId, current);
305
- if (actual === void 0 || credentialStorage.encode(actual) !== credentialStorage.encode(expected)) return { _tag: "Rejected" };
306
- const auth = snapshotOAuthSync(OAuthActionAuthorization, input.authorization);
307
- if (auth.challenge.moduleId !== input.moduleId || !(yield* authorization(mapping, current, auth, "unlink", input.commandId, input.commandId, credentialStorage.encode(expected), auth.requirement.maximumAgeMillis))) return { _tag: "Rejected" };
308
- if (!(yield* remainingEligibility(mapping, current, expected.credentialId))) return { _tag: "LastSignInMethod" };
309
- const invalidation = checkInvalidation(mapping, input.invalidation), cr = mapping.credential, a = mapping.authority;
310
- const key = yield* oauthIdentityKey(expected.identity), t = mapping.ownership.tuple;
311
- const connected = mapping.connectedReference?.({
312
- identityKey: key,
313
- subjectId: copiedRow({ value: current.nativeId }).value
314
- });
315
- const retain = connected !== void 0 && (!referencesGuarded || (yield* owner.check(connected)));
316
- if (connected !== void 0 && referencesGuarded) owner.postconditions.push(retain ? connected : sql`not (${connected})`);
317
- yield* owner.remove(cr.table, { [cr.credentialId]: expected.credentialId });
318
- yield* owner.remove(a.table, {
319
- [a.subjectId]: current.nativeId,
320
- [a.credentialId]: expected.credentialId
321
- });
322
- if (!retain) {
323
- yield* owner.update(t.table, { [t.identityKey]: key }, {
324
- [t.state]: "Unowned",
325
- [t.subjectId]: null,
326
- [t.reservation]: null,
327
- [t.version]: owner.marker
328
- });
329
- if (mapping.ownership.mode === "separate") yield* owner.remove(mapping.ownership.external.table, { [mapping.ownership.external.identityKey]: key });
330
- }
331
- yield* advance(mapping, current, expected.credentialId);
332
- const result = snapshotOAuthSync(OAuthUnlinked, {
333
- _tag: "Unlinked",
334
- credentialId: expected.credentialId,
335
- invalidation
336
- });
337
- const now = yield* owner.now(mapping.clock);
338
- invariant(Number.isSafeInteger(input.retentionUntilMillis) && input.retentionUntilMillis > now && input.retentionUntilMillis >= input.nowMillis + 12e4);
339
- const commandKey = {
340
- [r.moduleId]: input.moduleId,
341
- [r.commandId]: input.commandId
342
- };
343
- const values = {
344
- ...r.encodeInsert({
345
- moduleId: input.moduleId,
346
- commandId: input.commandId,
347
- credential: snapshotOAuthSync(OAuthCredentialSnapshot, expected)
348
- }),
349
- ...commandKey,
350
- [r.subjectId]: current.nativeId,
351
- [r.credentialId]: expected.credentialId,
352
- [r.intentSnapshot]: credentialStorage.encode(expected),
353
- [r.decision]: unlinkedStorage.encode(result),
354
- [r.retentionUntil]: mapping.clock.encodeInstant(input.retentionUntilMillis)
355
- };
356
- command.rows = (yield* owner.insert(r.table, values, commandKey)).rows;
357
- return {
358
- _tag: "Unlinked",
359
- result,
360
- replayed: false
361
- };
362
- }));
363
- return {
364
- accountCurrent,
365
- issueLink,
366
- preflightLink,
367
- claimLink,
368
- settleLink,
369
- inspectUnlink,
370
- unlink
371
- };
372
- });
373
- var OAuthAccounts = class OAuthAccounts extends Context.Service()("effect-auth/persistence/OAuthAccounts") {
374
- static layer = Layer.effect(OAuthAccounts, make$1);
375
- };
376
- //#endregion
377
- export { OAuthAccounts };
378
-
379
- //# sourceMappingURL=accounts.mjs.map