@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,652 +0,0 @@
1
- import {
2
- PasskeyCredentials,
3
- PasskeyCredential,
4
- PasskeyEnrollmentContext,
5
- PasskeyManagementPersistence,
6
- PasskeyManagementPolicy,
7
- PasskeyMethodPolicy,
8
- PasskeyPersistence,
9
- PasskeyProfile,
10
- PasskeyRequirement,
11
- PasskeyUnavailable,
12
- } from "@yielded/auth/Passkey";
13
- import { Context, Effect, Schema } from "effect";
14
- import { SqlClient } from "effect/sql";
15
-
16
- import {
17
- PersistenceConfigurationError,
18
- type MappingInput,
19
- type PasskeyFeature,
20
- } from "./configuration";
21
- import { digest } from "./crypto";
22
- import { PersistenceMappingError } from "./mapping-error";
23
- import {
24
- requiredPasskeyCredentialConstraints,
25
- requiredPasskeyPersistenceConstraints,
26
- type PasskeyCredentialMapping,
27
- type PasskeyPersistenceMapping,
28
- } from "./models/passkey-model";
29
- import {
30
- requiredPasskeyManagementConstraints,
31
- type PasskeyManagementMapping,
32
- } from "./models/passkey-write-model";
33
- import { makePasskeyKernel } from "./passkey-kernel";
34
- import type { PasskeyTargetConfiguration } from "./passkey/target";
35
- import type { Backend } from "./persistence";
36
- import { CurrentProofSql } from "./proof-kernel";
37
- import type { SqlExpression as SQL, QueryOperations, TableModel } from "./query-operations";
38
- import { requireStandalone } from "./standalone";
39
- import { storageTables, type StorageRole } from "./storage-tables";
40
-
41
- const profileJson = Schema.fromJsonString(PasskeyProfile);
42
- const policyJson = Schema.fromJsonString(PasskeyMethodPolicy);
43
-
44
- const seedJson = Schema.fromJsonString(
45
- Schema.Struct({
46
- policy: PasskeyMethodPolicy,
47
- management: Schema.optionalKey(PasskeyManagementPolicy),
48
- }),
49
- );
50
-
51
- const ModuleRow = Schema.Struct({
52
- active: Schema.Boolean,
53
- policy: Schema.String,
54
- policyRevision: Schema.String,
55
- });
56
-
57
- const ConfiguredModuleRow = Schema.Struct({
58
- moduleId: Schema.String,
59
- active: Schema.Boolean,
60
- policyRevision: Schema.String,
61
- admitted: Schema.Literals(["present", "missing"]),
62
- });
63
-
64
- const credentialData = PasskeyCredential.mapFields(
65
- ({ revision: _revision, active: _active, ...fields }) => fields,
66
- );
67
-
68
- const unavailable = () => PasskeyUnavailable.make({});
69
- const configurationError = (reason: string) => PersistenceConfigurationError.make({ reason });
70
-
71
- type ReadMapping = PasskeyCredentialMapping<
72
- TableModel,
73
- TableModel,
74
- TableModel,
75
- TableModel,
76
- TableModel,
77
- unknown
78
- >;
79
- type BaseMapping = PasskeyPersistenceMapping<
80
- ReadMapping,
81
- TableModel,
82
- TableModel,
83
- TableModel,
84
- TableModel,
85
- unknown
86
- >;
87
- type ManagementMapping = PasskeyManagementMapping<
88
- TableModel,
89
- TableModel,
90
- TableModel,
91
- TableModel,
92
- TableModel,
93
- TableModel,
94
- TableModel,
95
- TableModel,
96
- TableModel,
97
- TableModel,
98
- unknown
99
- >;
100
-
101
- /** Share the same passkey algorithms across raw SQL and Drizzle compilers. */
102
- export const makeComposedPasskeys = (
103
- operations: QueryOperations,
104
- ): Backend<object, never>["passkeys"] => {
105
- const { and, eq, getTableColumns, inArray, or, sql } = operations;
106
- const { target, writeTarget } = makePasskeyKernel(operations);
107
-
108
- const {
109
- makeTargetPasskeyCredentials,
110
- makeTargetPasskeyEnrollmentContext,
111
- makeTargetPasskeyPersistence,
112
- } = target;
113
-
114
- const { makeTargetPasskeyManagement } = writeTarget;
115
-
116
- const mappings = (
117
- storage: MappingInput,
118
- namespace: string,
119
- dialect: "pg" | "sqlite",
120
- passwordModules: ReadonlyArray<string>,
121
- signInProfiles: ReadonlyArray<PasskeyProfile>,
122
- ) => {
123
- const table = (role: StorageRole) => {
124
- const value = storage.tables[role];
125
-
126
- if (value === undefined) throw configurationError(`Missing ${role} mapping`);
127
-
128
- // Backend validation owns the foreign table shape. Row values are decoded below.
129
- return value;
130
- };
131
-
132
- const mapped = <Role extends StorageRole>(role: Role) => ({
133
- table: table(role),
134
- ...(Object.fromEntries(Object.keys(storageTables[role].columns).map((key) => [key, key])) as {
135
- readonly [Key in keyof (typeof storageTables)[Role]["columns"]]: Key;
136
- }),
137
- });
138
-
139
- const column = (role: StorageRole, key: string) => getTableColumns(table(role))[key];
140
- const s = storage.subjects;
141
- const subject = s.table;
142
- const sc = getTableColumns(subject);
143
- const active = (value: unknown) => value === true;
144
- const owned = (value: unknown) => value === "owned";
145
-
146
- const read: ReadMapping = {
147
- subject: {
148
- table: subject,
149
- id: s.id,
150
- status: s.status,
151
- securityRevision: s.securityRevision,
152
- decodeId: (row) => row[s.id],
153
- isActiveStatus: (value) => Object.is(value, s.activeValue),
154
- activeCondition: eq(sc[s.status], s.activeValue),
155
- },
156
- credential: {
157
- ...mapped("passkeyCredentials"),
158
- status: "active",
159
- decode: (row) =>
160
- Schema.decodeUnknownSync(credentialData)({
161
- ...row,
162
- profile: Schema.decodeUnknownSync(profileJson)(row.profile),
163
- }),
164
- decodeSubjectId: (row) => row.subjectId,
165
- isActiveStatus: active,
166
- activeCondition: eq(column("passkeyCredentials", "active"), true),
167
- },
168
- authority: {
169
- ...mapped("credentials"),
170
- status: "active",
171
- isActiveStatus: active,
172
- activeCondition: eq(column("credentials", "active"), true),
173
- },
174
- credentialOwnership: {
175
- ...mapped("passkeyOwnership"),
176
- isOwnedState: owned,
177
- ownedCondition: eq(column("passkeyOwnership", "state"), "owned"),
178
- decodeSubjectId: (row) => row.subjectId,
179
- },
180
- handleOwnership: {
181
- ...mapped("passkeyHandles"),
182
- isOwnedState: owned,
183
- ownedCondition: eq(column("passkeyHandles", "state"), "owned"),
184
- decodeSubjectId: (row) => row.subjectId,
185
- },
186
- subjectIds: { toNative: s.toNativeSync, toSubject: s.toSubjectSync, equals: Object.is },
187
- constraints: requiredPasskeyCredentialConstraints,
188
- };
189
-
190
- const base = (feature: PasskeyFeature): BaseMapping => ({
191
- moduleId: feature.moduleId,
192
- authorityScope: namespace,
193
- read,
194
- module: {
195
- ...mapped("passkeyModules"),
196
- status: "active",
197
- policyColumns: ["policy", "policyRevision"],
198
- isActiveStatus: active,
199
- activeCondition: eq(column("passkeyModules", "active"), true),
200
- decodeMethodPolicy: (row) => Schema.decodeUnknownSync(policyJson)(row.policy),
201
- },
202
- flow: {
203
- ...mapped("passkeyFlows"),
204
- states: {
205
- Pending: "Pending",
206
- Claimed: "Claimed",
207
- Verified: "Verified",
208
- Rejected: "Rejected",
209
- Ambiguous: "Ambiguous",
210
- RegistrationAccepted: "RegistrationAccepted",
211
- ProvisioningPending: "ProvisioningPending",
212
- },
213
- encodeInsert: () => ({}),
214
- },
215
- admission: mapped("passkeyAdmissions"),
216
- charge: { ...mapped("passkeyCharges"), encodeInsert: () => ({}) },
217
- clock: {
218
- encodeInstant: storage.encodeInstant,
219
- decodeInstant: storage.decodeInstantSync,
220
- engineNowMillis:
221
- dialect === "pg"
222
- ? sql`cast(extract(epoch from clock_timestamp()) * 1000 as bigint)`
223
- : sql`cast(round((julianday('now') - 2440587.5) * 86400000) as integer)`,
224
- toMillis: (expression) => expression,
225
- fromMillis: (expression) => expression,
226
- },
227
- telemetry: { lastUsedAt: "lastUsedAt", encodeBackupState: (value) => value },
228
- constraints: requiredPasskeyPersistenceConstraints,
229
- });
230
-
231
- const management = (feature: PasskeyFeature): ManagementMapping => {
232
- const policy = feature.managementPolicy;
233
-
234
- if (policy === undefined)
235
- throw configurationError(`Missing passkey management policy for ${feature.moduleId}`);
236
- const c = getTableColumns(table("passkeyCredentials"));
237
- const f = getTableColumns(table("credentials"));
238
-
239
- const metadata = (subjectId: unknown) =>
240
- sql`exists(select 1 from ${subject} where ${sc[s.id]} = ${subjectId} and ${sc[s.status]} = ${s.activeValue})`;
241
-
242
- return {
243
- ...base(feature),
244
- write: {
245
- credential: {
246
- name: "name",
247
- createdAt: "createdAt",
248
- encodeInsert: ({ credential, subjectId, summary, marker }) => ({
249
- credentialId: credential.credentialId,
250
- subjectId,
251
- rpId: credential.rpId,
252
- protocolCredentialId: credential.protocolCredentialId,
253
- userHandle: credential.userHandle,
254
- credentialKey: "",
255
- handleKey: "",
256
- publicKey: credential.publicKey,
257
- algorithm: credential.algorithm,
258
- profile: Schema.encodeSync(profileJson)(credential.profile),
259
- credentialRevision: marker,
260
- active: true,
261
- primarySignIn: credential.primarySignIn,
262
- enrollmentUserVerified: credential.enrollmentUserVerified,
263
- backupEligible: credential.backupEligible,
264
- backupState: credential.backupState,
265
- counter: credential.counter,
266
- maximumCounter: credential.maximumCounter,
267
- name: summary.name,
268
- createdAt: storage.encodeInstant(summary.createdAtMillis),
269
- }),
270
- encodePrimarySignIn: (value) => value,
271
- encodeEnrollmentUserVerified: (value) => value,
272
- encodeBackupEligible: (value) => value,
273
- activeStatus: true,
274
- removedStatus: false,
275
- },
276
- authority: {
277
- encodeInsert: ({ subjectId, credential, marker }) => ({
278
- subjectId,
279
- credentialId: credential.credentialId,
280
- revision: marker,
281
- active: true,
282
- }),
283
- activeStatus: true,
284
- removedStatus: false,
285
- },
286
- credentialOwnership: {
287
- encodeInsert: ({ credential, marker }) => ({
288
- credentialKey: "",
289
- rpId: credential.rpId,
290
- protocolCredentialId: credential.protocolCredentialId,
291
- state: "owned",
292
- version: marker,
293
- }),
294
- ownedState: "owned",
295
- removedState: "removed",
296
- },
297
- handleOwnership: {
298
- encodeInsert: ({ subjectId, rpId, userHandle, marker }) => ({
299
- subjectId,
300
- rpId,
301
- userHandle,
302
- handleKey: "",
303
- state: "owned",
304
- version: marker,
305
- }),
306
- ownedState: "owned",
307
- },
308
- policy: {
309
- subjectColumns: Object.keys(sc),
310
- management: () => policy,
311
- requirement: s.actionRequirements,
312
- metadata,
313
- action: metadata,
314
- remainingSignIn: (subjectId, excluded, row) =>
315
- Effect.gen(function* () {
316
- const requirement = yield* Schema.decodeEffect(PasskeyRequirement)(
317
- yield* s.requirements(row),
318
- );
319
-
320
- const alternatives: SQL[] = [];
321
-
322
- // Only retain complete sign-in paths enabled by this Auth definition.
323
- // More involved combinations require an explicit application's predicate.
324
- if (
325
- requirement.alternatives.some(
326
- (alternative) =>
327
- alternative.minimumCredentials === 1 &&
328
- alternative.factors.every((factor) => factor === "possession"),
329
- )
330
- ) {
331
- const profiles = signInProfiles.map((profile) =>
332
- Schema.encodeSync(profileJson)(profile),
333
- );
334
-
335
- alternatives.push(sql`exists(
336
- select 1 from ${table("passkeyCredentials")} join ${table("credentials")}
337
- on ${f.credentialId} = ${c.credentialId} and ${f.subjectId} = ${c.subjectId}
338
- and ${f.revision} = ${c.credentialRevision} and ${f.active} = ${true}
339
- where ${c.subjectId} = ${subjectId} and ${c.credentialId} <> ${excluded}
340
- and ${c.active} = ${true} and ${c.primarySignIn} = ${true}
341
- and ${c.enrollmentUserVerified} = ${true} and ${inArray(c.profile, profiles)}
342
- )`);
343
- }
344
- if (
345
- passwordModules.length > 0 &&
346
- requirement.alternatives.some(
347
- (alternative) =>
348
- alternative.minimumCredentials === 1 &&
349
- !alternative.userVerified &&
350
- !alternative.phishingResistant &&
351
- alternative.factors.every((factor) => factor === "knowledge"),
352
- )
353
- ) {
354
- const p = getTableColumns(table("passwords"));
355
- const i = getTableColumns(table("identifiers"));
356
-
357
- alternatives.push(sql`exists(
358
- select 1 from ${table("passwords")} join ${table("credentials")}
359
- on ${f.credentialId} = ${p.credentialId} and ${f.subjectId} = ${p.subjectId}
360
- and ${f.revision} = ${p.credentialRevision} and ${f.active} = ${true}
361
- join ${table("identifiers")} on ${i.subjectId} = ${p.subjectId}
362
- and ${i.active} = ${true} and ${i.namespace} = 'email'
363
- where ${p.subjectId} = ${subjectId} and ${p.credentialId} <> ${excluded}
364
- and ${inArray(p.moduleId, passwordModules)}
365
- )`);
366
- }
367
-
368
- return or(...alternatives) ?? sql`false`;
369
- }).pipe(
370
- Effect.mapError((cause) =>
371
- PersistenceMappingError.make({ operation: "mapping", cause }),
372
- ),
373
- ),
374
- },
375
- },
376
- command: { ...mapped("passkeyCommands"), encodeInsert: (input) => ({ ...input }) },
377
- managementConstraints: requiredPasskeyManagementConstraints,
378
- invalidation: {
379
- window: {
380
- trigger: "credential-change",
381
- existingSessions: "immediate",
382
- maximumExposureMillis: 0,
383
- oldAuthenticationEvidence: "rejected",
384
- },
385
- mutations: [],
386
- postcondition: ({ subjectId, securityRevision }) =>
387
- sql`exists(select 1 from ${subject} where ${sc[s.id]} = ${subjectId} and ${sc[s.securityRevision]} = ${securityRevision})`,
388
- },
389
- };
390
- };
391
-
392
- return { read, base, management, table };
393
- };
394
-
395
- const make: Backend<object, never>["passkeys"] = Effect.fn("AuthPersistence.passkeys")(
396
- function* ({ storage, namespace, dialect, features, passwordModules }) {
397
- const client = yield* SqlClient.SqlClient;
398
-
399
- const policies = yield* Effect.forEach(features, (feature) =>
400
- Effect.gen(function* () {
401
- const policy = yield* feature.policy;
402
- const encoded = yield* Schema.encodeEffect(policyJson)(policy);
403
-
404
- const policyRevision = yield* digest(
405
- yield* Schema.encodeEffect(seedJson)({
406
- policy,
407
- ...(feature.managementPolicy === undefined
408
- ? {}
409
- : { management: feature.managementPolicy }),
410
- }),
411
- );
412
-
413
- return { feature, policy, encoded, policyRevision };
414
- }),
415
- );
416
-
417
- const m = yield* Effect.try({
418
- try: () =>
419
- mappings(
420
- storage,
421
- namespace,
422
- dialect,
423
- passwordModules,
424
- policies.flatMap(({ feature, policy }) => (feature.management ? [] : policy.profiles)),
425
- ),
426
- catch: () => configurationError("Invalid passkey table mappings"),
427
- });
428
-
429
- const configuration: PasskeyTargetConfiguration = {
430
- mode: "interactive",
431
- dialect,
432
- locking: dialect === "pg",
433
- standaloneGuard: () => requireStandalone(unavailable, client.transactionService),
434
- };
435
-
436
- const native = yield* CurrentProofSql;
437
- const module = m.table("passkeyModules");
438
- const columns = getTableColumns(module);
439
- const admission = m.table("passkeyAdmissions");
440
- const ac = getTableColumns(admission);
441
-
442
- // Read live configuration on every acquisition. Matching modules and
443
- // admission ownership need no initialization writes or advisory lock.
444
- const configured = yield* native
445
- .select({
446
- moduleId: columns.moduleId,
447
- active: columns.active,
448
- policyRevision: columns.policyRevision,
449
- // Predicate SQL preserves qualifiers through single-table projections.
450
- admitted: sql`case when exists(select 1 from ${admission}
451
- where ${and(eq(ac.authorityScope, namespace), eq(ac.moduleId, columns.moduleId))})
452
- then 'present' else 'missing' end`,
453
- })
454
- .from(module)
455
- .where(
456
- inArray(
457
- columns.moduleId,
458
- policies.map(({ feature }) => feature.moduleId),
459
- ),
460
- )
461
- .pipe(
462
- Effect.flatMap(Schema.decodeUnknownEffect(Schema.Array(ConfiguredModuleRow))),
463
- Effect.map((rows) =>
464
- policies.every(({ feature, policyRevision }) =>
465
- rows.some(
466
- (row) =>
467
- row.moduleId === feature.moduleId &&
468
- row.active &&
469
- row.admitted === "present" &&
470
- row.policyRevision === policyRevision,
471
- ),
472
- ),
473
- ),
474
- );
475
-
476
- if (!configured)
477
- yield* client.withTransaction(
478
- Effect.gen(function* () {
479
- if (dialect === "pg")
480
- yield* client`select pg_advisory_xact_lock(hashtext(${`${namespace}/passkeys`}))`;
481
- for (const { feature, policy, encoded, policyRevision } of policies) {
482
- yield* native
483
- .insert(module)
484
- .values({
485
- moduleId: feature.moduleId,
486
- active: true,
487
- policy: encoded,
488
- policyRevision,
489
- })
490
- .onConflictDoNothing();
491
-
492
- const rows = yield* native
493
- .select()
494
- .from(module)
495
- .where(eq(columns.moduleId, feature.moduleId));
496
-
497
- const row = yield* Schema.decodeUnknownEffect(ModuleRow)(rows[0]);
498
-
499
- if (!row.active)
500
- return yield* configurationError(`Passkey module ${feature.moduleId} is disabled`);
501
- if (row.policyRevision !== policyRevision) {
502
- const previous = yield* Schema.decodeEffect(policyJson)(row.policy);
503
-
504
- if (policy.generation <= previous.generation)
505
- return yield* configurationError(
506
- `Increase the passkey policy generation to change ${feature.moduleId}`,
507
- );
508
- yield* native
509
- .update(module)
510
- .set({ policy: encoded, policyRevision })
511
- .where(
512
- and(
513
- eq(columns.moduleId, feature.moduleId),
514
- eq(columns.policyRevision, row.policyRevision),
515
- eq(columns.active, true),
516
- ),
517
- );
518
-
519
- const updated = yield* native
520
- .select()
521
- .from(module)
522
- .where(eq(columns.moduleId, feature.moduleId));
523
-
524
- const applied = yield* Schema.decodeUnknownEffect(ModuleRow)(updated[0]);
525
-
526
- if (!applied.active || applied.policyRevision !== policyRevision)
527
- return yield* configurationError(
528
- `Passkey policy changed while configuring ${feature.moduleId}`,
529
- );
530
- }
531
- yield* native
532
- .insert(m.table("passkeyAdmissions"))
533
- .values({
534
- authorityScope: namespace,
535
- moduleId: feature.moduleId,
536
- version: policyRevision,
537
- ownerMarker: policyRevision,
538
- })
539
- .onConflictDoNothing();
540
- }
541
- }),
542
- );
543
-
544
- const credential = yield* makeTargetPasskeyCredentials<ReadMapping, never>(
545
- m.read,
546
- configuration,
547
- );
548
-
549
- const persistence = new Map<string, PasskeyPersistence["Service"]>();
550
- const managers = new Map<string, PasskeyManagementPersistence["Service"]>();
551
- const enrollment = new Map<string, PasskeyEnrollmentContext["Service"]>();
552
-
553
- for (const feature of features) {
554
- if (feature.management) {
555
- const mapping = yield* Effect.try({
556
- try: () => m.management(feature),
557
- catch: () =>
558
- configurationError(`Invalid passkey management mapping for ${feature.moduleId}`),
559
- });
560
-
561
- const services = yield* makeTargetPasskeyManagement<ManagementMapping, never>(
562
- mapping,
563
- configuration,
564
- );
565
-
566
- persistence.set(feature.moduleId, services.passkeyPersistence);
567
- managers.set(feature.moduleId, services.passkeyManagementPersistence);
568
- enrollment.set(
569
- feature.moduleId,
570
- (yield* makeTargetPasskeyEnrollmentContext<ManagementMapping, never>(
571
- mapping,
572
- configuration,
573
- )).passkeyEnrollmentContext,
574
- );
575
- } else {
576
- persistence.set(
577
- feature.moduleId,
578
- (yield* makeTargetPasskeyPersistence<BaseMapping, never>(
579
- m.base(feature),
580
- configuration,
581
- )).passkeyPersistence,
582
- );
583
- }
584
- }
585
-
586
- const service = <A>(services: ReadonlyMap<string, A>, moduleId: string) => {
587
- const value = services.get(moduleId);
588
-
589
- return value === undefined ? Effect.fail(unavailable()) : Effect.succeed(value);
590
- };
591
-
592
- let context: Context.Context<never> = Context.make(
593
- PasskeyCredentials,
594
- credential.passkeyCredentials,
595
- ).pipe(
596
- Context.add(PasskeyPersistence, {
597
- issue: (input, prepare) =>
598
- Effect.flatMap(service(persistence, input.ceremony.moduleId), (s) =>
599
- s.issue(input, prepare),
600
- ),
601
- context: (input) =>
602
- Effect.flatMap(service(persistence, input.moduleId), (s) => s.context(input)),
603
- claim: (input, prepare) =>
604
- Effect.flatMap(service(persistence, input.ceremony.moduleId), (s) =>
605
- s.claim(input, prepare),
606
- ),
607
- settle: (input, prepare) =>
608
- Effect.flatMap(service(persistence, input.claim.ceremony.moduleId), (s) =>
609
- s.settle(input, prepare),
610
- ),
611
- cleanup: (input, prepare) =>
612
- Effect.flatMap(service(persistence, input.moduleId), (s) => s.cleanup(input, prepare)),
613
- }),
614
- );
615
-
616
- if (managers.size > 0)
617
- context = context.pipe(
618
- Context.add(PasskeyEnrollmentContext, {
619
- capture: (input) =>
620
- Effect.flatMap(service(enrollment, input.moduleId), (s) => s.capture(input)),
621
- }),
622
- Context.add(PasskeyManagementPersistence, {
623
- issueEnrollment: (input, prepare) =>
624
- Effect.flatMap(service(managers, input.ceremony.moduleId), (s) =>
625
- s.issueEnrollment(input, prepare),
626
- ),
627
- completeEnrollment: (input, prepare) =>
628
- Effect.flatMap(service(managers, input.claim.ceremony.moduleId), (s) =>
629
- s.completeEnrollment(input, prepare),
630
- ),
631
- list: (input) =>
632
- Effect.flatMap(service(managers, input.moduleId), (s) => s.list(input)),
633
- inspectRemove: (input) =>
634
- Effect.flatMap(service(managers, input.moduleId), (s) => s.inspectRemove(input)),
635
- rename: (input, prepare) =>
636
- Effect.flatMap(service(managers, input.moduleId), (s) => s.rename(input, prepare)),
637
- remove: (input, prepare) =>
638
- Effect.flatMap(service(managers, input.moduleId), (s) => s.remove(input, prepare)),
639
- }),
640
- );
641
-
642
- return context;
643
- },
644
- Effect.mapError((error) =>
645
- Schema.is(PersistenceConfigurationError)(error)
646
- ? error
647
- : configurationError("Unable to configure passkey persistence"),
648
- ),
649
- );
650
-
651
- return make;
652
- };