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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. package/README.md +6 -8
  2. package/dist/Adapter.d.mts +47 -33
  3. package/dist/Adapter.mjs +36 -23
  4. package/dist/OAuthPersistence.d.mts +35 -51
  5. package/dist/OAuthPersistence.mjs +60 -68
  6. package/dist/OAuthPersistence.mjs.map +1 -1
  7. package/dist/index.d.mts +2 -2
  8. package/dist/index.mjs +2 -2
  9. package/dist/internal/browser-login.d.mts +1 -1
  10. package/dist/internal/browser-login.mjs +29 -9
  11. package/dist/internal/browser-login.mjs.map +1 -1
  12. package/dist/internal/configuration.d.mts +13 -8
  13. package/dist/internal/configuration.mjs.map +1 -1
  14. package/dist/internal/crypto.d.mts +1 -0
  15. package/dist/internal/crypto.mjs +1 -1
  16. package/dist/internal/d1-planning.mjs +8 -0
  17. package/dist/internal/d1-planning.mjs.map +1 -0
  18. package/dist/internal/email-native-state.mjs +135 -0
  19. package/dist/internal/email-native-state.mjs.map +1 -0
  20. package/dist/internal/email-native.d.mts +17 -0
  21. package/dist/internal/email-native.mjs +245 -0
  22. package/dist/internal/email-native.mjs.map +1 -0
  23. package/dist/internal/email-policy.mjs +92 -0
  24. package/dist/internal/email-policy.mjs.map +1 -0
  25. package/dist/internal/email-registration-native.d.mts +38 -0
  26. package/dist/internal/email-registration-native.mjs +171 -0
  27. package/dist/internal/email-registration-native.mjs.map +1 -0
  28. package/dist/internal/models/email-model.d.mts +40 -104
  29. package/dist/internal/models/email-model.mjs +3 -5
  30. package/dist/internal/models/email-model.mjs.map +1 -1
  31. package/dist/internal/models/oauth-connected-model.d.mts +44 -213
  32. package/dist/internal/models/oauth-connected-model.mjs +6 -14
  33. package/dist/internal/models/oauth-connected-model.mjs.map +1 -1
  34. package/dist/internal/models/oauth-model.d.mts +95 -244
  35. package/dist/internal/models/oauth-model.mjs +28 -22
  36. package/dist/internal/models/oauth-model.mjs.map +1 -1
  37. package/dist/internal/models/passkey-model.d.mts +11 -147
  38. package/dist/internal/models/passkey-model.mjs +5 -24
  39. package/dist/internal/models/passkey-model.mjs.map +1 -1
  40. package/dist/internal/models/passkey-registration-ceremony-model.d.mts +5 -39
  41. package/dist/internal/models/passkey-write-model.d.mts +17 -75
  42. package/dist/internal/models/passkey-write-model.mjs +1 -7
  43. package/dist/internal/models/passkey-write-model.mjs.map +1 -1
  44. package/dist/internal/models/password-model.d.mts +16 -82
  45. package/dist/internal/models/password-model.mjs +1 -4
  46. package/dist/internal/models/password-model.mjs.map +1 -1
  47. package/dist/internal/models/phone-model.d.mts +86 -0
  48. package/dist/internal/models/phone-model.mjs +10 -0
  49. package/dist/internal/models/phone-model.mjs.map +1 -0
  50. package/dist/internal/models/proof-model.d.mts +43 -272
  51. package/dist/internal/models/proof-model.mjs +2 -10
  52. package/dist/internal/models/proof-model.mjs.map +1 -1
  53. package/dist/internal/models/session-model.d.mts +74 -93
  54. package/dist/internal/models/session-model.mjs +3 -11
  55. package/dist/internal/models/session-model.mjs.map +1 -1
  56. package/dist/internal/models/step-up-model.d.mts +12 -50
  57. package/dist/internal/models/step-up-model.mjs +2 -4
  58. package/dist/internal/models/step-up-model.mjs.map +1 -1
  59. package/dist/internal/models/totp-model.d.mts +76 -0
  60. package/dist/internal/models/totp-model.mjs +10 -0
  61. package/dist/internal/models/totp-model.mjs.map +1 -0
  62. package/dist/internal/native-sql-table.d.mts +21 -4
  63. package/dist/internal/native-sql-table.mjs +9 -5
  64. package/dist/internal/native-sql-table.mjs.map +1 -1
  65. package/dist/internal/oauth/native-accounts.d.mts +17 -0
  66. package/dist/internal/oauth/native-accounts.mjs +290 -0
  67. package/dist/internal/oauth/native-accounts.mjs.map +1 -0
  68. package/dist/internal/oauth/native-connected-state.d.mts +11 -0
  69. package/dist/internal/oauth/native-connected-state.mjs +146 -0
  70. package/dist/internal/oauth/native-connected-state.mjs.map +1 -0
  71. package/dist/internal/oauth/native-connected.d.mts +15 -0
  72. package/dist/internal/oauth/native-connected.mjs +462 -0
  73. package/dist/internal/oauth/native-connected.mjs.map +1 -0
  74. package/dist/internal/oauth/native-flow.mjs +138 -0
  75. package/dist/internal/oauth/native-flow.mjs.map +1 -0
  76. package/dist/internal/oauth/native-layers.d.mts +24 -0
  77. package/dist/internal/oauth/native-layers.mjs +13 -0
  78. package/dist/internal/oauth/native-layers.mjs.map +1 -0
  79. package/dist/internal/oauth/native-mutation.mjs +122 -0
  80. package/dist/internal/oauth/native-mutation.mjs.map +1 -0
  81. package/dist/internal/oauth/native-registration.d.mts +24 -0
  82. package/dist/internal/oauth/native-registration.mjs +328 -0
  83. package/dist/internal/oauth/native-registration.mjs.map +1 -0
  84. package/dist/internal/oauth/native-revocations.d.mts +17 -0
  85. package/dist/internal/oauth/native-revocations.mjs +106 -0
  86. package/dist/internal/oauth/native-revocations.mjs.map +1 -0
  87. package/dist/internal/oauth/native-sign-in.d.mts +17 -0
  88. package/dist/internal/oauth/native-sign-in.mjs +50 -0
  89. package/dist/internal/oauth/native-sign-in.mjs.map +1 -0
  90. package/dist/internal/oauth/native-state.d.mts +10 -0
  91. package/dist/internal/oauth/native-state.mjs +214 -0
  92. package/dist/internal/oauth/native-state.mjs.map +1 -0
  93. package/dist/internal/oauth/state.d.mts +10 -0
  94. package/dist/internal/oauth/state.mjs +3 -27
  95. package/dist/internal/oauth/state.mjs.map +1 -1
  96. package/dist/internal/passkey-actions.mjs +55 -0
  97. package/dist/internal/passkey-actions.mjs.map +1 -0
  98. package/dist/internal/passkey-inputs.mjs +73 -0
  99. package/dist/internal/passkey-inputs.mjs.map +1 -0
  100. package/dist/internal/passkey-managed.mjs +224 -0
  101. package/dist/internal/passkey-managed.mjs.map +1 -0
  102. package/dist/internal/passkey-native-ceremony.d.mts +35 -0
  103. package/dist/internal/passkey-native-ceremony.mjs +38 -0
  104. package/dist/internal/passkey-native-ceremony.mjs.map +1 -0
  105. package/dist/internal/passkey-native-flow.mjs +91 -0
  106. package/dist/internal/passkey-native-flow.mjs.map +1 -0
  107. package/dist/internal/passkey-native-registration.d.mts +10 -0
  108. package/dist/internal/passkey-native-registration.mjs +114 -0
  109. package/dist/internal/passkey-native-registration.mjs.map +1 -0
  110. package/dist/internal/passkey-native-state.d.mts +15 -0
  111. package/dist/internal/passkey-native-state.mjs +186 -0
  112. package/dist/internal/passkey-native-state.mjs.map +1 -0
  113. package/dist/internal/passkey-native-write.d.mts +82 -0
  114. package/dist/internal/passkey-native-write.mjs +330 -0
  115. package/dist/internal/passkey-native-write.mjs.map +1 -0
  116. package/dist/internal/passkey-native.d.mts +835 -0
  117. package/dist/internal/passkey-native.mjs +175 -0
  118. package/dist/internal/passkey-native.mjs.map +1 -0
  119. package/dist/internal/passkey-policy.mjs +115 -0
  120. package/dist/internal/passkey-policy.mjs.map +1 -0
  121. package/dist/internal/password-credentials.mjs +38 -9
  122. package/dist/internal/password-credentials.mjs.map +1 -1
  123. package/dist/internal/password-native.d.mts +14 -0
  124. package/dist/internal/password-native.mjs +292 -0
  125. package/dist/internal/password-native.mjs.map +1 -0
  126. package/dist/internal/password-policy.mjs +93 -0
  127. package/dist/internal/password-policy.mjs.map +1 -0
  128. package/dist/internal/password-registration-native.d.mts +22 -0
  129. package/dist/internal/password-registration-native.mjs +142 -0
  130. package/dist/internal/password-registration-native.mjs.map +1 -0
  131. package/dist/internal/persistence.d.mts +6 -19
  132. package/dist/internal/persistence.mjs +199 -166
  133. package/dist/internal/persistence.mjs.map +1 -1
  134. package/dist/internal/phone-composed.mjs +79 -0
  135. package/dist/internal/phone-composed.mjs.map +1 -0
  136. package/dist/internal/phone-native.d.mts +15 -0
  137. package/dist/internal/phone-native.mjs +354 -0
  138. package/dist/internal/phone-native.mjs.map +1 -0
  139. package/dist/internal/proof-native.d.mts +15 -0
  140. package/dist/internal/proof-native.mjs +289 -0
  141. package/dist/internal/proof-native.mjs.map +1 -0
  142. package/dist/internal/registration.mjs +50 -60
  143. package/dist/internal/registration.mjs.map +1 -1
  144. package/dist/internal/session-native-authority.d.mts +15 -0
  145. package/dist/internal/session-native-authority.mjs +91 -0
  146. package/dist/internal/session-native-authority.mjs.map +1 -0
  147. package/dist/internal/session-native-cleanup.d.mts +14 -0
  148. package/dist/internal/session-native-cleanup.mjs +48 -0
  149. package/dist/internal/session-native-cleanup.mjs.map +1 -0
  150. package/dist/internal/session-native-login.d.mts +15 -0
  151. package/dist/internal/session-native-login.mjs +87 -0
  152. package/dist/internal/session-native-login.mjs.map +1 -0
  153. package/dist/internal/session-native-pending-read.mjs +42 -0
  154. package/dist/internal/session-native-pending-read.mjs.map +1 -0
  155. package/dist/internal/session-native-pending.mjs +134 -0
  156. package/dist/internal/session-native-pending.mjs.map +1 -0
  157. package/dist/internal/session-native-record.mjs +79 -0
  158. package/dist/internal/session-native-record.mjs.map +1 -0
  159. package/dist/internal/session-native-state.mjs +130 -0
  160. package/dist/internal/session-native-state.mjs.map +1 -0
  161. package/dist/internal/session-native-stateful.d.mts +16 -0
  162. package/dist/internal/session-native-stateful.mjs +225 -0
  163. package/dist/internal/session-native-stateful.mjs.map +1 -0
  164. package/dist/internal/session-native-step-up.d.mts +15 -0
  165. package/dist/internal/session-native-step-up.mjs +212 -0
  166. package/dist/internal/session-native-step-up.mjs.map +1 -0
  167. package/dist/internal/session-native-validity.d.mts +15 -0
  168. package/dist/internal/session-native-validity.mjs +97 -0
  169. package/dist/internal/session-native-validity.mjs.map +1 -0
  170. package/dist/internal/session-policy.mjs +29 -0
  171. package/dist/internal/session-policy.mjs.map +1 -0
  172. package/dist/internal/sql-authority.d.mts +16 -0
  173. package/dist/internal/sql-authority.mjs +32 -0
  174. package/dist/internal/sql-authority.mjs.map +1 -0
  175. package/dist/internal/sql-change.mjs +21 -0
  176. package/dist/internal/sql-change.mjs.map +1 -0
  177. package/dist/internal/sql-cleanup.mjs +35 -0
  178. package/dist/internal/sql-cleanup.mjs.map +1 -0
  179. package/dist/internal/sql-commit.d.mts +72 -0
  180. package/dist/internal/sql-commit.mjs +176 -0
  181. package/dist/internal/sql-commit.mjs.map +1 -0
  182. package/dist/internal/sql-expression.d.mts +17 -0
  183. package/dist/internal/sql-expression.mjs +49 -0
  184. package/dist/internal/sql-expression.mjs.map +1 -0
  185. package/dist/internal/sql-oauth-connected-model.d.mts +7 -23
  186. package/dist/internal/sql-oauth-model.d.mts +27 -52
  187. package/dist/internal/sql-oauth-model.mjs +3 -4
  188. package/dist/internal/sql-oauth-model.mjs.map +1 -1
  189. package/dist/internal/sql-persistence.mjs +5 -9
  190. package/dist/internal/sql-persistence.mjs.map +1 -1
  191. package/dist/internal/sql-storage-validation.mjs +1 -2
  192. package/dist/internal/sql-storage-validation.mjs.map +1 -1
  193. package/dist/internal/sql-table.d.mts +3 -16
  194. package/dist/internal/sql-table.mjs +21 -42
  195. package/dist/internal/sql-table.mjs.map +1 -1
  196. package/dist/internal/standalone.mjs +2 -3
  197. package/dist/internal/standalone.mjs.map +1 -1
  198. package/dist/internal/step-up-state.mjs +5 -8
  199. package/dist/internal/step-up-state.mjs.map +1 -1
  200. package/dist/internal/storage-clock.mjs +44 -0
  201. package/dist/internal/storage-clock.mjs.map +1 -0
  202. package/dist/internal/storage-mapping.d.mts +11 -8
  203. package/dist/internal/storage-mapping.mjs +88 -302
  204. package/dist/internal/storage-mapping.mjs.map +1 -1
  205. package/dist/internal/storage-plans.mjs +15 -73
  206. package/dist/internal/storage-plans.mjs.map +1 -1
  207. package/dist/internal/storage-tables.d.mts +37 -520
  208. package/dist/internal/storage-tables.mjs +31 -211
  209. package/dist/internal/storage-tables.mjs.map +1 -1
  210. package/dist/internal/storage-validation.d.mts +1 -6
  211. package/dist/internal/storage-validation.mjs +1 -42
  212. package/dist/internal/storage-validation.mjs.map +1 -1
  213. package/dist/internal/table-model.d.mts +21 -0
  214. package/dist/internal/totp-native.d.mts +15 -0
  215. package/dist/internal/totp-native.mjs +401 -0
  216. package/dist/internal/totp-native.mjs.map +1 -0
  217. package/package.json +1 -1
  218. package/src/Adapter.ts +143 -199
  219. package/src/OAuthPersistence.ts +128 -271
  220. package/src/index.ts +1 -1
  221. package/src/internal/browser-login.ts +54 -24
  222. package/src/internal/configuration.ts +16 -31
  223. package/src/internal/d1-planning.ts +7 -0
  224. package/src/internal/email-native-state.ts +247 -0
  225. package/src/internal/email-native.ts +514 -0
  226. package/src/internal/email-policy.ts +235 -0
  227. package/src/internal/email-registration-native.ts +386 -0
  228. package/src/internal/models/email-model.ts +76 -214
  229. package/src/internal/models/oauth-connected-model.ts +50 -288
  230. package/src/internal/models/oauth-model.ts +147 -368
  231. package/src/internal/models/passkey-model.ts +11 -208
  232. package/src/internal/models/passkey-registration-ceremony-model.ts +6 -60
  233. package/src/internal/models/passkey-write-model.ts +14 -95
  234. package/src/internal/models/password-model.ts +28 -148
  235. package/src/internal/models/phone-model.ts +110 -0
  236. package/src/internal/models/proof-model.ts +48 -404
  237. package/src/internal/models/session-model.ts +102 -200
  238. package/src/internal/models/step-up-model.ts +17 -96
  239. package/src/internal/models/totp-model.ts +82 -0
  240. package/src/internal/native-sql-table.ts +32 -11
  241. package/src/internal/oauth/native-accounts.ts +576 -0
  242. package/src/internal/oauth/native-connected-state.ts +288 -0
  243. package/src/internal/oauth/native-connected.ts +888 -0
  244. package/src/internal/oauth/native-flow.ts +253 -0
  245. package/src/internal/oauth/native-layers.ts +83 -0
  246. package/src/internal/oauth/native-mutation.ts +222 -0
  247. package/src/internal/oauth/native-registration.ts +545 -0
  248. package/src/internal/oauth/native-revocations.ts +190 -0
  249. package/src/internal/oauth/native-sign-in.ts +111 -0
  250. package/src/internal/oauth/native-state.ts +346 -0
  251. package/src/internal/oauth/state.ts +2 -70
  252. package/src/internal/passkey-actions.ts +70 -0
  253. package/src/internal/passkey-inputs.ts +56 -0
  254. package/src/internal/passkey-managed.ts +360 -0
  255. package/src/internal/passkey-native-ceremony.ts +66 -0
  256. package/src/internal/passkey-native-flow.ts +140 -0
  257. package/src/internal/passkey-native-registration.ts +221 -0
  258. package/src/internal/passkey-native-state.ts +335 -0
  259. package/src/internal/passkey-native-write.ts +611 -0
  260. package/src/internal/passkey-native.ts +372 -0
  261. package/src/internal/passkey-policy.ts +246 -0
  262. package/src/internal/password-credentials.ts +52 -10
  263. package/src/internal/password-native.ts +571 -0
  264. package/src/internal/password-policy.ts +307 -0
  265. package/src/internal/password-registration-native.ts +322 -0
  266. package/src/internal/persistence.ts +336 -290
  267. package/src/internal/phone-composed.ts +86 -0
  268. package/src/internal/phone-native.ts +659 -0
  269. package/src/internal/proof-native.ts +448 -0
  270. package/src/internal/registration.ts +96 -143
  271. package/src/internal/session-native-authority.ts +247 -0
  272. package/src/internal/session-native-cleanup.ts +65 -0
  273. package/src/internal/session-native-login.ts +205 -0
  274. package/src/internal/session-native-pending-read.ts +68 -0
  275. package/src/internal/session-native-pending.ts +223 -0
  276. package/src/internal/session-native-record.ts +141 -0
  277. package/src/internal/session-native-state.ts +259 -0
  278. package/src/internal/session-native-stateful.ts +512 -0
  279. package/src/internal/session-native-step-up.ts +450 -0
  280. package/src/internal/session-native-validity.ts +208 -0
  281. package/src/internal/session-policy.ts +59 -0
  282. package/src/internal/sql-authority.ts +56 -0
  283. package/src/internal/sql-change.ts +38 -0
  284. package/src/internal/sql-cleanup.ts +56 -0
  285. package/src/internal/sql-commit.ts +435 -0
  286. package/src/internal/sql-expression.ts +94 -0
  287. package/src/internal/sql-metadata.ts +100 -0
  288. package/src/internal/sql-oauth-connected-model.ts +6 -95
  289. package/src/internal/sql-oauth-model.ts +31 -134
  290. package/src/internal/sql-persistence.ts +2 -6
  291. package/src/internal/sql-storage-validation.ts +1 -2
  292. package/src/internal/sql-table.ts +19 -52
  293. package/src/internal/standalone.ts +2 -11
  294. package/src/internal/step-up-state.ts +4 -17
  295. package/src/internal/storage-clock.ts +58 -0
  296. package/src/internal/storage-mapping.ts +125 -340
  297. package/src/internal/storage-plans.ts +14 -80
  298. package/src/internal/storage-tables.ts +28 -212
  299. package/src/internal/storage-validation.ts +0 -58
  300. package/src/internal/table-model.ts +24 -0
  301. package/src/internal/totp-native.ts +701 -0
  302. package/dist/internal/PasswordPreparedPostconditions.d.mts +0 -22
  303. package/dist/internal/PasswordPreparedPostconditions.mjs +0 -12
  304. package/dist/internal/PasswordPreparedPostconditions.mjs.map +0 -1
  305. package/dist/internal/authority-snapshot.mjs +0 -53
  306. package/dist/internal/authority-snapshot.mjs.map +0 -1
  307. package/dist/internal/email-kernel.d.mts +0 -276
  308. package/dist/internal/email-kernel.mjs +0 -497
  309. package/dist/internal/email-kernel.mjs.map +0 -1
  310. package/dist/internal/models/passkey-registration-ceremony-model.mjs +0 -18
  311. package/dist/internal/models/passkey-registration-ceremony-model.mjs.map +0 -1
  312. package/dist/internal/oauth/accounts.d.mts +0 -8
  313. package/dist/internal/oauth/accounts.mjs +0 -379
  314. package/dist/internal/oauth/accounts.mjs.map +0 -1
  315. package/dist/internal/oauth/connected-access.d.mts +0 -9
  316. package/dist/internal/oauth/connected-access.mjs +0 -229
  317. package/dist/internal/oauth/connected-access.mjs.map +0 -1
  318. package/dist/internal/oauth/connected-collection.d.mts +0 -7
  319. package/dist/internal/oauth/connected-collection.mjs +0 -214
  320. package/dist/internal/oauth/connected-collection.mjs.map +0 -1
  321. package/dist/internal/oauth/connected-custody.d.mts +0 -6
  322. package/dist/internal/oauth/connected-custody.mjs +0 -165
  323. package/dist/internal/oauth/connected-custody.mjs.map +0 -1
  324. package/dist/internal/oauth/connected-flow.d.mts +0 -7
  325. package/dist/internal/oauth/connected-flow.mjs +0 -324
  326. package/dist/internal/oauth/connected-flow.mjs.map +0 -1
  327. package/dist/internal/oauth/connected-input.mjs +0 -122
  328. package/dist/internal/oauth/connected-input.mjs.map +0 -1
  329. package/dist/internal/oauth/connected-keys.d.mts +0 -2
  330. package/dist/internal/oauth/connected-keys.mjs +0 -22
  331. package/dist/internal/oauth/connected-keys.mjs.map +0 -1
  332. package/dist/internal/oauth/connected-maintenance.d.mts +0 -9
  333. package/dist/internal/oauth/connected-maintenance.mjs +0 -226
  334. package/dist/internal/oauth/connected-maintenance.mjs.map +0 -1
  335. package/dist/internal/oauth/connected-management.d.mts +0 -9
  336. package/dist/internal/oauth/connected-management.mjs +0 -243
  337. package/dist/internal/oauth/connected-management.mjs.map +0 -1
  338. package/dist/internal/oauth/connected-reference.mjs +0 -63
  339. package/dist/internal/oauth/connected-reference.mjs.map +0 -1
  340. package/dist/internal/oauth/connected-settlement.d.mts +0 -8
  341. package/dist/internal/oauth/connected-settlement.mjs +0 -141
  342. package/dist/internal/oauth/connected-settlement.mjs.map +0 -1
  343. package/dist/internal/oauth/connected-sign-in.d.mts +0 -10
  344. package/dist/internal/oauth/connected-sign-in.mjs +0 -281
  345. package/dist/internal/oauth/connected-sign-in.mjs.map +0 -1
  346. package/dist/internal/oauth/connected-state.d.mts +0 -14
  347. package/dist/internal/oauth/connected-state.mjs +0 -469
  348. package/dist/internal/oauth/connected-state.mjs.map +0 -1
  349. package/dist/internal/oauth/connected-target.d.mts +0 -21
  350. package/dist/internal/oauth/connected-target.mjs +0 -117
  351. package/dist/internal/oauth/connected-target.mjs.map +0 -1
  352. package/dist/internal/oauth/flow.d.mts +0 -5
  353. package/dist/internal/oauth/flow.mjs +0 -279
  354. package/dist/internal/oauth/flow.mjs.map +0 -1
  355. package/dist/internal/oauth/input.mjs +0 -127
  356. package/dist/internal/oauth/input.mjs.map +0 -1
  357. package/dist/internal/oauth/owner.d.mts +0 -10
  358. package/dist/internal/oauth/owner.mjs +0 -10
  359. package/dist/internal/oauth/owner.mjs.map +0 -1
  360. package/dist/internal/oauth/query-compiler.d.mts +0 -7
  361. package/dist/internal/oauth/query-compiler.mjs +0 -9
  362. package/dist/internal/oauth/query-compiler.mjs.map +0 -1
  363. package/dist/internal/oauth/registration.d.mts +0 -7
  364. package/dist/internal/oauth/registration.mjs +0 -393
  365. package/dist/internal/oauth/registration.mjs.map +0 -1
  366. package/dist/internal/oauth/target.d.mts +0 -31
  367. package/dist/internal/oauth/target.mjs +0 -273
  368. package/dist/internal/oauth/target.mjs.map +0 -1
  369. package/dist/internal/oauth-kernel.d.mts +0 -1423
  370. package/dist/internal/oauth-kernel.mjs +0 -187
  371. package/dist/internal/oauth-kernel.mjs.map +0 -1
  372. package/dist/internal/passkey/admission.d.mts +0 -6
  373. package/dist/internal/passkey/admission.mjs +0 -220
  374. package/dist/internal/passkey/admission.mjs.map +0 -1
  375. package/dist/internal/passkey/credentials.d.mts +0 -14
  376. package/dist/internal/passkey/credentials.mjs +0 -249
  377. package/dist/internal/passkey/credentials.mjs.map +0 -1
  378. package/dist/internal/passkey/enrollment.mjs +0 -138
  379. package/dist/internal/passkey/enrollment.mjs.map +0 -1
  380. package/dist/internal/passkey/flow.d.mts +0 -21
  381. package/dist/internal/passkey/flow.mjs +0 -452
  382. package/dist/internal/passkey/flow.mjs.map +0 -1
  383. package/dist/internal/passkey/management.mjs +0 -231
  384. package/dist/internal/passkey/management.mjs.map +0 -1
  385. package/dist/internal/passkey/registration-ceremony.d.mts +0 -9
  386. package/dist/internal/passkey/registration-ceremony.mjs +0 -129
  387. package/dist/internal/passkey/registration-ceremony.mjs.map +0 -1
  388. package/dist/internal/passkey/registration-custody.d.mts +0 -2
  389. package/dist/internal/passkey/registration-custody.mjs +0 -52
  390. package/dist/internal/passkey/registration-custody.mjs.map +0 -1
  391. package/dist/internal/passkey/registration-write.mjs +0 -211
  392. package/dist/internal/passkey/registration-write.mjs.map +0 -1
  393. package/dist/internal/passkey/state.d.mts +0 -10
  394. package/dist/internal/passkey/state.mjs +0 -234
  395. package/dist/internal/passkey/state.mjs.map +0 -1
  396. package/dist/internal/passkey/target.d.mts +0 -20
  397. package/dist/internal/passkey/target.mjs +0 -200
  398. package/dist/internal/passkey/target.mjs.map +0 -1
  399. package/dist/internal/passkey/write-state.d.mts +0 -17
  400. package/dist/internal/passkey/write-state.mjs +0 -346
  401. package/dist/internal/passkey/write-state.mjs.map +0 -1
  402. package/dist/internal/passkey/write-target.mjs +0 -192
  403. package/dist/internal/passkey/write-target.mjs.map +0 -1
  404. package/dist/internal/passkey-kernel.d.mts +0 -6045
  405. package/dist/internal/passkey-kernel.mjs +0 -49
  406. package/dist/internal/passkey-kernel.mjs.map +0 -1
  407. package/dist/internal/passkeys.d.mts +0 -7
  408. package/dist/internal/passkeys.mjs +0 -387
  409. package/dist/internal/passkeys.mjs.map +0 -1
  410. package/dist/internal/password-credentials.d.mts +0 -11
  411. package/dist/internal/password-kernel.d.mts +0 -278
  412. package/dist/internal/password-kernel.mjs +0 -508
  413. package/dist/internal/password-kernel.mjs.map +0 -1
  414. package/dist/internal/phone-kernel.d.mts +0 -162
  415. package/dist/internal/phone-kernel.mjs +0 -437
  416. package/dist/internal/phone-kernel.mjs.map +0 -1
  417. package/dist/internal/proof-kernel.d.mts +0 -94
  418. package/dist/internal/proof-kernel.mjs +0 -624
  419. package/dist/internal/proof-kernel.mjs.map +0 -1
  420. package/dist/internal/query-operations.d.mts +0 -68
  421. package/dist/internal/session-kernel.d.mts +0 -62
  422. package/dist/internal/session-kernel.mjs +0 -820
  423. package/dist/internal/session-kernel.mjs.map +0 -1
  424. package/dist/internal/sql-oauth-connected-model.mjs +0 -7
  425. package/dist/internal/sql-oauth-connected-model.mjs.map +0 -1
  426. package/dist/internal/sql-query.d.mts +0 -12
  427. package/dist/internal/sql-query.mjs +0 -206
  428. package/dist/internal/sql-query.mjs.map +0 -1
  429. package/dist/internal/step-up-state.d.mts +0 -49
  430. package/dist/internal/transaction-execution-kernel.d.mts +0 -37
  431. package/dist/internal/transaction-execution-kernel.mjs +0 -120
  432. package/dist/internal/transaction-execution-kernel.mjs.map +0 -1
  433. package/dist/internal/transaction-kernel.d.mts +0 -81
  434. package/dist/internal/transaction-kernel.mjs +0 -264
  435. package/dist/internal/transaction-kernel.mjs.map +0 -1
  436. package/src/internal/PasswordPreparedPostconditions.ts +0 -30
  437. package/src/internal/authority-snapshot.ts +0 -91
  438. package/src/internal/email-kernel.ts +0 -1555
  439. package/src/internal/oauth/accounts.ts +0 -838
  440. package/src/internal/oauth/connected-access.ts +0 -388
  441. package/src/internal/oauth/connected-collection.ts +0 -345
  442. package/src/internal/oauth/connected-custody.ts +0 -308
  443. package/src/internal/oauth/connected-flow.ts +0 -562
  444. package/src/internal/oauth/connected-input.ts +0 -147
  445. package/src/internal/oauth/connected-keys.ts +0 -31
  446. package/src/internal/oauth/connected-maintenance.ts +0 -379
  447. package/src/internal/oauth/connected-management.ts +0 -391
  448. package/src/internal/oauth/connected-reference.ts +0 -135
  449. package/src/internal/oauth/connected-settlement.ts +0 -278
  450. package/src/internal/oauth/connected-sign-in.ts +0 -472
  451. package/src/internal/oauth/connected-state.ts +0 -924
  452. package/src/internal/oauth/connected-target.ts +0 -307
  453. package/src/internal/oauth/flow.ts +0 -505
  454. package/src/internal/oauth/input.ts +0 -201
  455. package/src/internal/oauth/owner.ts +0 -22
  456. package/src/internal/oauth/query-compiler.ts +0 -15
  457. package/src/internal/oauth/registration.ts +0 -676
  458. package/src/internal/oauth/target.ts +0 -803
  459. package/src/internal/oauth-kernel.ts +0 -294
  460. package/src/internal/passkey/admission.ts +0 -368
  461. package/src/internal/passkey/credentials.ts +0 -511
  462. package/src/internal/passkey/enrollment.ts +0 -326
  463. package/src/internal/passkey/flow.ts +0 -1062
  464. package/src/internal/passkey/management.ts +0 -426
  465. package/src/internal/passkey/registration-ceremony.ts +0 -283
  466. package/src/internal/passkey/registration-custody.ts +0 -91
  467. package/src/internal/passkey/registration-write.ts +0 -426
  468. package/src/internal/passkey/state.ts +0 -351
  469. package/src/internal/passkey/target.ts +0 -598
  470. package/src/internal/passkey/write-state.ts +0 -678
  471. package/src/internal/passkey/write-target.ts +0 -450
  472. package/src/internal/passkey-kernel.ts +0 -112
  473. package/src/internal/passkeys.ts +0 -652
  474. package/src/internal/password-kernel.ts +0 -1522
  475. package/src/internal/phone-kernel.ts +0 -872
  476. package/src/internal/proof-kernel.ts +0 -1992
  477. package/src/internal/query-operations.ts +0 -91
  478. package/src/internal/session-kernel.ts +0 -2406
  479. package/src/internal/sql-query.ts +0 -304
  480. package/src/internal/transaction-execution-kernel.ts +0 -335
  481. package/src/internal/transaction-kernel.ts +0 -603
@@ -0,0 +1,130 @@
1
+ import { PersistenceMappingError } from "./mapping-error.mjs";
2
+ import { anySqlCondition, exactSqlText } from "./sql-change.mjs";
3
+ import { Cause, DateTime, Effect, Schema } from "effect";
4
+ import { reportAuthFailure } from "@yielded/auth/Persistence";
5
+ import { AuthenticationRevision, PendingAuthenticationInvalid, SessionConflict, SessionInvalid, SessionStepUpInvalid, SessionUnavailable, StaleAuthentication, assessAuthentication } from "@yielded/auth/Sessions";
6
+ import { SqlClient } from "effect/sql/SqlClient";
7
+ //#region src/internal/session-native-state.ts
8
+ const sessionUnavailable = () => SessionUnavailable.make({});
9
+ const sessionInvariant = (condition) => {
10
+ if (!condition) throw PersistenceMappingError.make({
11
+ operation: "decode",
12
+ cause: "Invalid session authority"
13
+ });
14
+ };
15
+ const isDomainFailure = (error) => Schema.is(SessionConflict)(error) || Schema.is(SessionInvalid)(error) || Schema.is(SessionUnavailable)(error) || Schema.is(SessionStepUpInvalid)(error) || Schema.is(PendingAuthenticationInvalid)(error) || Schema.is(StaleAuthentication)(error);
16
+ /** Only schema-checked domain failures cross the owner boundary; SQL/mapping
17
+ * failures remain Unavailable. The executor preserves every mixed cause reason. */
18
+ const sessionFailure = (error) => isDomainFailure(error) ? error : sessionUnavailable();
19
+ const normalizeSessionOperation = (effect) => effect.pipe(Effect.tapError((error) => isDomainFailure(error) ? Effect.void : reportAuthFailure("auth-persistence", Cause.fail(error))), Effect.mapError(sessionFailure));
20
+ const sameSessionRevision = (left, right) => left.subjectId === right.subjectId && left.securityRevision === right.securityRevision && left.credentials.length === right.credentials.length && new Set(left.credentials.map((f) => f.credentialId)).size === left.credentials.length && left.credentials.every((f) => right.credentials.some((other) => other.credentialId === f.credentialId && other.revision === f.revision));
21
+ /** Known-subject joins bind each physical ID column independently. Subject locks
22
+ * precede every credential lock, including inside an application coordinator. */
23
+ const makeNativeSessionAuthorityState = Effect.fnUntraced(function* (tables, mapping, batch = false) {
24
+ const sql = (yield* SqlClient).withoutTransforms();
25
+ const s = mapping.subject, c = mapping.credential;
26
+ if (batch) sessionInvariant(s.requirementColumns !== void 0);
27
+ const subject = tables(s.table), credential = tables(c.table);
28
+ const joinedSubject = subject.as("session_subject"), joinedCredential = credential.as("session_factor");
29
+ const now = tables.expression(mapping.clock.engineNowMillis);
30
+ const lock = sql.onDialectOrElse({
31
+ sqlite: () => sql``,
32
+ orElse: () => sql`for update`
33
+ });
34
+ const nativeLocks = !batch && sql.onDialectOrElse({
35
+ sqlite: () => false,
36
+ orElse: () => true
37
+ });
38
+ const exact = (table, key, value) => exactSqlText(sql, table.column(key), table.value(key, value));
39
+ const id = (table, key, value) => sql`${table.column(key)} = ${table.value(key, value)}`;
40
+ const activeSubject = (table) => id(table, s.status, s.activeStatusValue);
41
+ const activeCredential = (table) => {
42
+ if (c.status === void 0) return sql`1 = 1`;
43
+ sessionInvariant(c.activeStatusValue !== void 0);
44
+ return id(table, c.status, c.activeStatusValue);
45
+ };
46
+ const requested = (table, ids) => anySqlCondition(ids.map((value) => exact(table, c.credentialId, value)));
47
+ const decode = Effect.fnUntraced(function* (subjectId, native, row, factors, instant) {
48
+ sessionInvariant((yield* mapping.subjectId.toSubject(row[s.id])) === subjectId);
49
+ if (!s.isActiveStatus(row[s.status])) return void 0;
50
+ const credentials = [];
51
+ for (const factor of factors) {
52
+ if (factor[c.credentialId] === null || factor[c.credentialId] === void 0) continue;
53
+ sessionInvariant((yield* mapping.subjectId.toSubject(factor[c.subjectId])) === subjectId);
54
+ if (c.status !== void 0) sessionInvariant(c.isActiveStatus?.(factor[c.status]) === true);
55
+ const value = yield* Schema.decodeUnknownEffect(Schema.Struct({
56
+ credentialId: Schema.String,
57
+ revision: Schema.String
58
+ }))({
59
+ credentialId: factor[c.credentialId],
60
+ revision: factor[c.revision]
61
+ });
62
+ sessionInvariant(!credentials.some((other) => other.credentialId === value.credentialId));
63
+ credentials.push(value);
64
+ }
65
+ sessionInvariant(credentials.length <= 64);
66
+ return {
67
+ native,
68
+ row,
69
+ revision: yield* Schema.decodeUnknownEffect(AuthenticationRevision)({
70
+ subjectId,
71
+ securityRevision: row[s.securityRevision],
72
+ credentials: credentials.sort((a, b) => a.credentialId.localeCompare(b.credentialId))
73
+ }),
74
+ requirement: yield* s.decodeRequirement(row),
75
+ now: yield* Schema.decodeEffect(Schema.Int)(Number(instant))
76
+ };
77
+ });
78
+ const read = Effect.fnUntraced(function* (subjectId, locking = false) {
79
+ const native = yield* mapping.subjectId.toNative(subjectId);
80
+ sessionInvariant((yield* mapping.subjectId.toSubject(native)) === subjectId);
81
+ if (locking && nativeLocks) {
82
+ const owners = yield* sql`select ${subject.fields("s_")}, ${now} as engine_now from ${subject.name} where ${id(subject, s.id, native)} and ${activeSubject(subject)} limit 2 ${lock}`;
83
+ sessionInvariant(owners.length <= 1);
84
+ if (owners[0] === void 0) return void 0;
85
+ const factors = yield* sql`select ${credential.fields("c_")} from ${credential.name} where ${id(credential, c.subjectId, native)} and ${activeCredential(credential)} order by ${credential.column(c.credentialId)} limit 65 ${lock}`;
86
+ return yield* decode(subjectId, native, subject.decode(owners[0], "s_"), factors.map((row) => credential.decode(row, "c_")), owners[0].engine_now);
87
+ }
88
+ const rows = yield* sql`select ${joinedSubject.fields("s_")}, ${joinedCredential.fields("c_")}, ${now} as engine_now from ${joinedSubject.name} left join ${joinedCredential.name} on ${id(joinedCredential, c.subjectId, native)} and ${activeCredential(joinedCredential)} where ${id(joinedSubject, s.id, native)} and ${activeSubject(joinedSubject)} limit 65`;
89
+ if (rows[0] === void 0) return void 0;
90
+ return yield* decode(subjectId, native, joinedSubject.decode(rows[0], "s_"), rows.map((row) => joinedCredential.decode(row, "c_")), rows[0].engine_now);
91
+ });
92
+ const policyCondition = (row, native) => {
93
+ if (!batch) return sql`1 = 1`;
94
+ sessionInvariant(s.requirementColumns !== void 0);
95
+ return sql`exists(select 1 from ${subject.name} where ${id(subject, s.id, native)} and ${sql.and(s.requirementColumns.map((key) => row[key] === null ? sql`${subject.column(key)} is null` : typeof row[key] === "string" ? exact(subject, key, row[key]) : id(subject, key, row[key])))})`;
96
+ };
97
+ const authorityCondition = (revision, native) => sql.and([
98
+ sql`exists(select 1 from ${subject.name} where ${id(subject, s.id, native)} and ${exact(subject, s.securityRevision, revision.securityRevision)} and ${activeSubject(subject)})`,
99
+ sql`(select count(*) from ${credential.name} where ${id(credential, c.subjectId, native)} and ${activeCredential(credential)}) = ${revision.credentials.length}`,
100
+ ...revision.credentials.map((factor) => sql`exists(select 1 from ${credential.name} where ${id(credential, c.subjectId, native)} and ${exact(credential, c.credentialId, factor.credentialId)} and ${exact(credential, c.revision, factor.revision)} and ${activeCredential(credential)})`)
101
+ ]);
102
+ return {
103
+ sql,
104
+ subject,
105
+ credential,
106
+ joinedSubject,
107
+ joinedCredential,
108
+ now,
109
+ lock,
110
+ nativeLocks,
111
+ exact,
112
+ id,
113
+ activeSubject,
114
+ activeCredential,
115
+ requested,
116
+ decode,
117
+ read,
118
+ authorityCondition,
119
+ policyCondition
120
+ };
121
+ });
122
+ /** Evaluate freshness at the database sample. The final write also enforces the
123
+ * earliest future boundary at which the same evidence would cease to satisfy. */
124
+ const assessSessionAt = Effect.fnUntraced(function* (evidence, requirement, now) {
125
+ return yield* assessAuthentication(evidence, requirement, DateTime.makeUnsafe(now));
126
+ });
127
+ //#endregion
128
+ export { assessSessionAt, makeNativeSessionAuthorityState, normalizeSessionOperation, sameSessionRevision, sessionFailure, sessionInvariant, sessionUnavailable };
129
+
130
+ //# sourceMappingURL=session-native-state.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-native-state.mjs","names":[],"sources":["../../src/internal/session-native-state.ts"],"sourcesContent":["import { reportAuthFailure } from \"@yielded/auth/Persistence\";\nimport type { SubjectId } from \"@yielded/auth/Schema\";\nimport {\n type AuthenticationRequirement,\n AuthenticationRevision,\n SessionConflict,\n SessionInvalid,\n SessionUnavailable,\n SessionStepUpInvalid,\n PendingAuthenticationInvalid,\n StaleAuthentication,\n assessAuthentication,\n type AuthenticationEvidence,\n} from \"@yielded/auth/Sessions\";\nimport { Cause, Effect, Schema, DateTime } from \"effect\";\nimport { SqlClient } from \"effect/sql/SqlClient\";\nimport type { Fragment } from \"effect/sql/Statement\";\n\nimport { PersistenceMappingError } from \"./mapping-error\";\nimport type { SessionAuthorityTables, SessionExecution } from \"./models/session-model\";\nimport type { NativeSqlTables, SqlTable } from \"./native-sql-table\";\nimport { anySqlCondition, exactSqlText } from \"./sql-change\";\nimport type { AnyTableModel } from \"./table-model\";\n\nexport const sessionUnavailable = () => SessionUnavailable.make({});\n\nexport const sessionInvariant: (condition: unknown) => asserts condition = (condition) => {\n if (!condition)\n throw PersistenceMappingError.make({ operation: \"decode\", cause: \"Invalid session authority\" });\n};\n\nexport type SessionDomainFailure =\n | SessionConflict\n | SessionInvalid\n | SessionUnavailable\n | SessionStepUpInvalid\n | PendingAuthenticationInvalid\n | StaleAuthentication;\n\nconst isDomainFailure = (error: unknown): error is SessionDomainFailure =>\n Schema.is(SessionConflict)(error) ||\n Schema.is(SessionInvalid)(error) ||\n Schema.is(SessionUnavailable)(error) ||\n Schema.is(SessionStepUpInvalid)(error) ||\n Schema.is(PendingAuthenticationInvalid)(error) ||\n Schema.is(StaleAuthentication)(error);\n\n/** Only schema-checked domain failures cross the owner boundary; SQL/mapping\n * failures remain Unavailable. The executor preserves every mixed cause reason. */\nexport const sessionFailure = <E>(\n error: E,\n): Extract<E, SessionDomainFailure> | SessionUnavailable =>\n isDomainFailure(error) ? (error as Extract<E, SessionDomainFailure>) : sessionUnavailable();\n\nexport const normalizeSessionOperation = <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n effect.pipe(\n Effect.tapError((error) =>\n isDomainFailure(error)\n ? Effect.void\n : reportAuthFailure(\"auth-persistence\", Cause.fail(error)),\n ),\n Effect.mapError(sessionFailure),\n );\n\nexport type NativeSessionAuthorityMapping = SessionAuthorityTables<\n AnyTableModel,\n AnyTableModel,\n unknown\n> &\n SessionExecution;\n\nexport interface NativeSessionAuthority {\n readonly native: unknown;\n readonly row: Record<string, unknown>;\n readonly revision: AuthenticationRevision;\n readonly requirement: AuthenticationRequirement;\n readonly now: number;\n}\n\nexport const sameSessionRevision = (left: AuthenticationRevision, right: AuthenticationRevision) =>\n left.subjectId === right.subjectId &&\n left.securityRevision === right.securityRevision &&\n left.credentials.length === right.credentials.length &&\n new Set(left.credentials.map((f) => f.credentialId)).size === left.credentials.length &&\n left.credentials.every((f) =>\n right.credentials.some(\n (other) => other.credentialId === f.credentialId && other.revision === f.revision,\n ),\n );\n\n/** Known-subject joins bind each physical ID column independently. Subject locks\n * precede every credential lock, including inside an application coordinator. */\nexport const makeNativeSessionAuthorityState = Effect.fnUntraced(function* (\n tables: NativeSqlTables,\n mapping: NativeSessionAuthorityMapping,\n batch = false,\n) {\n const sql = (yield* SqlClient).withoutTransforms();\n\n const s = mapping.subject,\n c = mapping.credential;\n\n if (batch) sessionInvariant(s.requirementColumns !== undefined);\n\n const subject = tables(s.table),\n credential = tables(c.table);\n\n const joinedSubject = subject.as(\"session_subject\"),\n joinedCredential = credential.as(\"session_factor\");\n\n const now = tables.expression(mapping.clock.engineNowMillis);\n const lock = sql.onDialectOrElse({ sqlite: () => sql``, orElse: () => sql`for update` });\n const nativeLocks = !batch && sql.onDialectOrElse({ sqlite: () => false, orElse: () => true });\n\n const exact = (table: SqlTable, key: string, value: unknown) =>\n exactSqlText(sql, table.column(key), table.value(key, value));\n\n const id = (table: SqlTable, key: string, value: unknown) =>\n sql`${table.column(key)} = ${table.value(key, value)}`;\n\n const activeSubject = (table: SqlTable) => id(table, s.status, s.activeStatusValue);\n\n const activeCredential = (table: SqlTable) => {\n if (c.status === undefined) return sql`1 = 1`;\n sessionInvariant(c.activeStatusValue !== undefined);\n\n return id(table, c.status, c.activeStatusValue);\n };\n\n const requested = (table: SqlTable, ids: ReadonlyArray<string>) =>\n anySqlCondition(ids.map((value) => exact(table, c.credentialId, value)));\n\n const decode = Effect.fnUntraced(function* (\n subjectId: SubjectId,\n native: unknown,\n row: Record<string, unknown>,\n factors: ReadonlyArray<Record<string, unknown>>,\n instant: unknown,\n ): Effect.fn.Return<\n NativeSessionAuthority | undefined,\n PersistenceMappingError | Schema.SchemaError\n > {\n sessionInvariant((yield* mapping.subjectId.toSubject(row[s.id])) === subjectId);\n if (!s.isActiveStatus(row[s.status])) return undefined;\n const credentials: { credentialId: string; revision: string }[] = [];\n\n for (const factor of factors) {\n if (factor[c.credentialId] === null || factor[c.credentialId] === undefined) continue;\n sessionInvariant((yield* mapping.subjectId.toSubject(factor[c.subjectId])) === subjectId);\n if (c.status !== undefined) sessionInvariant(c.isActiveStatus?.(factor[c.status]) === true);\n\n const value = yield* Schema.decodeUnknownEffect(\n Schema.Struct({ credentialId: Schema.String, revision: Schema.String }),\n )({ credentialId: factor[c.credentialId], revision: factor[c.revision] });\n\n sessionInvariant(!credentials.some((other) => other.credentialId === value.credentialId));\n credentials.push(value);\n }\n sessionInvariant(credentials.length <= 64);\n\n return {\n native,\n row,\n revision: yield* Schema.decodeUnknownEffect(AuthenticationRevision)({\n subjectId,\n securityRevision: row[s.securityRevision],\n credentials: credentials.sort((a, b) => a.credentialId.localeCompare(b.credentialId)),\n }),\n requirement: yield* s.decodeRequirement(row),\n now: yield* Schema.decodeEffect(Schema.Int)(Number(instant)),\n };\n });\n\n const read = Effect.fnUntraced(function* (subjectId: SubjectId, locking = false) {\n const native = yield* mapping.subjectId.toNative(subjectId);\n\n sessionInvariant((yield* mapping.subjectId.toSubject(native)) === subjectId);\n if (locking && nativeLocks) {\n const owners =\n yield* sql`select ${subject.fields(\"s_\")}, ${now} as engine_now from ${subject.name} where ${id(subject, s.id, native)} and ${activeSubject(subject)} limit 2 ${lock}`;\n\n sessionInvariant(owners.length <= 1);\n if (owners[0] === undefined) return undefined;\n\n const factors =\n yield* sql`select ${credential.fields(\"c_\")} from ${credential.name} where ${id(credential, c.subjectId, native)} and ${activeCredential(credential)} order by ${credential.column(c.credentialId)} limit 65 ${lock}`;\n\n return yield* decode(\n subjectId,\n native,\n subject.decode(owners[0], \"s_\"),\n factors.map((row) => credential.decode(row, \"c_\")),\n owners[0].engine_now,\n );\n }\n\n const rows =\n yield* sql`select ${joinedSubject.fields(\"s_\")}, ${joinedCredential.fields(\"c_\")}, ${now} as engine_now from ${joinedSubject.name} left join ${joinedCredential.name} on ${id(joinedCredential, c.subjectId, native)} and ${activeCredential(joinedCredential)} where ${id(joinedSubject, s.id, native)} and ${activeSubject(joinedSubject)} limit 65`;\n\n if (rows[0] === undefined) return undefined;\n\n return yield* decode(\n subjectId,\n native,\n joinedSubject.decode(rows[0], \"s_\"),\n rows.map((row) => joinedCredential.decode(row, \"c_\")),\n rows[0].engine_now,\n );\n });\n\n const policyCondition = (row: Record<string, unknown>, native: unknown): Fragment => {\n if (!batch) return sql`1 = 1`;\n sessionInvariant(s.requirementColumns !== undefined);\n\n return sql`exists(select 1 from ${subject.name} where ${id(subject, s.id, native)} and ${sql.and(s.requirementColumns.map((key) => (row[key] === null ? sql`${subject.column(key)} is null` : typeof row[key] === \"string\" ? exact(subject, key, row[key]) : id(subject, key, row[key]))))})`;\n };\n\n const authorityCondition = (revision: AuthenticationRevision, native: unknown): Fragment =>\n sql.and([\n sql`exists(select 1 from ${subject.name} where ${id(subject, s.id, native)} and ${exact(subject, s.securityRevision, revision.securityRevision)} and ${activeSubject(subject)})`,\n sql`(select count(*) from ${credential.name} where ${id(credential, c.subjectId, native)} and ${activeCredential(credential)}) = ${revision.credentials.length}`,\n ...revision.credentials.map(\n (factor) =>\n sql`exists(select 1 from ${credential.name} where ${id(credential, c.subjectId, native)} and ${exact(credential, c.credentialId, factor.credentialId)} and ${exact(credential, c.revision, factor.revision)} and ${activeCredential(credential)})`,\n ),\n ]);\n\n return {\n sql,\n subject,\n credential,\n joinedSubject,\n joinedCredential,\n now,\n lock,\n nativeLocks,\n exact,\n id,\n activeSubject,\n activeCredential,\n requested,\n decode,\n read,\n authorityCondition,\n policyCondition,\n };\n});\n\n/** Evaluate freshness at the database sample. The final write also enforces the\n * earliest future boundary at which the same evidence would cease to satisfy. */\nexport const assessSessionAt = Effect.fnUntraced(function* (\n evidence: AuthenticationEvidence,\n requirement: AuthenticationRequirement,\n now: number,\n) {\n const result = yield* assessAuthentication(evidence, requirement, DateTime.makeUnsafe(now));\n\n return result;\n});\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { AnyTableModel } from "./table-model.mjs";
2
+ import { StatefulSessionMapping } from "./models/session-model.mjs";
3
+ import { NativeSqlTables } from "./native-sql-table.mjs";
4
+ import { SqlBatchCommit } from "./sql-commit.mjs";
5
+ import { Effect } from "effect";
6
+ import { LifecycleHooks } from "@yielded/auth/Hooks";
7
+ import { SessionRepository, StatefulSessionPersistence } from "@yielded/auth/Sessions";
8
+ import { SqlClient } from "effect/sql/SqlClient";
9
+ //#region src/internal/session-native-stateful.d.ts
10
+ export type NativeStatefulSessionMapping<Claims> = StatefulSessionMapping<Claims, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, unknown>;
11
+ export declare const makeNativeStatefulSessionServices: <Claims>(tables: NativeSqlTables, mapping: NativeStatefulSessionMapping<Claims>) => Effect.Effect<{
12
+ readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;
13
+ readonly sessionRepository: SessionRepository;
14
+ }, never, LifecycleHooks | SqlBatchCommit | SqlClient>;
15
+ //#endregion
16
+ //# sourceMappingURL=session-native-stateful.d.mts.map
@@ -0,0 +1,225 @@
1
+ import { PersistenceMappingError, isMappedConstraintConflict } from "./mapping-error.mjs";
2
+ import { sqlBatchAssertion } from "./d1-planning.mjs";
3
+ import { exactSqlText, executeSqlChange } from "./sql-change.mjs";
4
+ import { CurrentSqlCommit, SqlBatchCommit, appendSqlBatchStatement, makeSqlCommitExecutor, registerSqlBatchPostcondition, registerSqlPostcondition } from "./sql-commit.mjs";
5
+ import { makeNativeSessionAuthorityState, normalizeSessionOperation, sameSessionRevision, sessionInvariant, sessionUnavailable } from "./session-native-state.mjs";
6
+ import { makeConditionalSqlInsert, makeNativeSessionRecords, sameSessionRecord } from "./session-native-record.mjs";
7
+ import { makeNativeSessionPending, prepareNativeSession } from "./session-native-pending.mjs";
8
+ import { allocateSessionValue, preservesRevision } from "./session-policy.mjs";
9
+ import { sessionEvidenceDeadline } from "./session-native-authority.mjs";
10
+ import { DateTime, Effect, Option, Schema } from "effect";
11
+ import { PendingAuthenticationInvalid, SessionConflict, SessionId, SessionInvalid, SessionMetadata, StaleAuthentication, snapshotSessionAuthenticationProvenance } from "@yielded/auth/Sessions";
12
+ //#region src/internal/session-native-stateful.ts
13
+ const makeNativeStatefulSessionServices = Effect.fnUntraced(function* (tables, mapping) {
14
+ const batch = yield* SqlBatchCommit;
15
+ const state = yield* makeNativeSessionAuthorityState(tables, mapping, batch !== void 0);
16
+ const conditionalInsert = yield* makeConditionalSqlInsert();
17
+ const records = yield* makeNativeSessionRecords(tables, mapping);
18
+ const executor = yield* makeSqlCommitExecutor(sessionUnavailable);
19
+ const external = yield* Effect.serviceOption(CurrentSqlCommit);
20
+ const pending = mapping.pending === void 0 ? void 0 : yield* makeNativeSessionPending(tables, {
21
+ ...mapping,
22
+ ...mapping.pending
23
+ }, batch !== void 0);
24
+ const { sql, s, table, now, exact, live } = records;
25
+ const native = (work, mode = "transaction") => batch === void 0 ? executor.operation(normalizeSessionOperation(work), mode) : executor.operationBatch(normalizeSessionOperation(work)).pipe(Effect.provideService(SqlBatchCommit, batch));
26
+ const stage = Effect.fnUntraced(function* (statement, expected) {
27
+ if (batch !== void 0) {
28
+ yield* appendSqlBatchStatement(sql`${statement}`);
29
+ if (expected !== void 0) yield* appendSqlBatchStatement(sqlBatchAssertion(sql, sql`changes() = ${expected}`));
30
+ return expected;
31
+ }
32
+ return yield* executeSqlChange(sql, statement);
33
+ });
34
+ const finalCondition = Effect.fnUntraced(function* (name, condition) {
35
+ if (batch !== void 0) yield* registerSqlBatchPostcondition({
36
+ name,
37
+ statement: sqlBatchAssertion(sql, condition)
38
+ });
39
+ else if (Option.isSome(external)) yield* registerSqlPostcondition({
40
+ name,
41
+ check: Effect.gen(function* () {
42
+ const rows = yield* sql`select 1 where ${condition}`;
43
+ sessionInvariant(rows.length === 1);
44
+ }).pipe(Effect.mapError((cause) => PersistenceMappingError.make({
45
+ operation: "decode",
46
+ cause
47
+ })))
48
+ });
49
+ });
50
+ const recordCondition = Effect.fnUntraced(function* (record, values) {
51
+ return sql`exists(select 1 from ${table.name} where ${yield* records.owner(record)} and ${exact(table, s.securityRevision, record.securityRevision)} and ${records.millis(table, s.expiresAt)} = ${DateTime.toEpochMillis(record.expiresAt)} and ${records.millis(table, s.absoluteExpiresAt)} = ${DateTime.toEpochMillis(record.absoluteExpiresAt)} and ${records.encodedCondition(values)} and ${live(table)})`;
52
+ });
53
+ const classify = (effect) => effect.pipe(Effect.mapError((error) => isMappedConstraintConflict(mapping.isConstraintConflict, error) ? SessionConflict.make({}) : error));
54
+ const verify = Effect.fnUntraced(function* (digest) {
55
+ const subject = state.subject.as("verified_subject"), session = table.as("verified_session"), owner = mapping.subject;
56
+ if (table.unencodedTextColumn?.(s.subjectId) !== void 0 && state.subject.unencodedTextColumn?.(owner.id) !== void 0) {
57
+ const rows = yield* sql`select ${session.fields("session_")}, ${subject.fields("subject_")} from ${session.name} join ${subject.name} on ${exactSqlText(sql, subject.column(owner.id), session.column(s.subjectId))} and ${state.activeSubject(subject)} and ${exactSqlText(sql, subject.column(owner.securityRevision), session.column(s.securityRevision))} where ${exact(session, s.digest, digest)} and ${live(session)} limit 2`;
58
+ sessionInvariant(rows.length <= 1);
59
+ if (rows[0] === void 0) return void 0;
60
+ const record = yield* records.decode(session.decode(rows[0], "session_"));
61
+ const decoded = subject.decode(rows[0], "subject_");
62
+ sessionInvariant((yield* mapping.subjectId.toSubject(decoded[owner.id])) === record.subjectId && decoded[owner.securityRevision] === record.securityRevision && owner.isActiveStatus(decoded[owner.status]));
63
+ return record;
64
+ }
65
+ const record = yield* records.read(digest);
66
+ if (record === void 0) return void 0;
67
+ const nativeSubject = yield* mapping.subjectId.toNative(record.subjectId);
68
+ const rows = yield* sql`select ${subject.fields("subject_")} from ${subject.name} where ${state.id(subject, owner.id, nativeSubject)} and ${state.activeSubject(subject)} and ${state.exact(subject, owner.securityRevision, record.securityRevision)} and ${now} < ${DateTime.toEpochMillis(record.expiresAt)} limit 2`;
69
+ sessionInvariant(rows.length <= 1);
70
+ if (rows[0] === void 0) return void 0;
71
+ sessionInvariant((yield* mapping.subjectId.toSubject(subject.decode(rows[0], "subject_")[owner.id])) === record.subjectId);
72
+ return record;
73
+ });
74
+ return {
75
+ statefulSessionPersistence: {
76
+ establish: (input, project) => native(classify(Effect.gen(function* () {
77
+ const current = yield* state.read(input.evidence.revision.subjectId, true);
78
+ if (current === void 0 || !sameSessionRevision(current.revision, input.evidence.revision)) return yield* StaleAuthentication.make({});
79
+ const assessment = yield* sessionEvidenceDeadline(input.evidence, current.requirement, current.now);
80
+ const expires = DateTime.toEpochMillis(input.session.expiresAt), absolute = DateTime.toEpochMillis(input.session.absoluteExpiresAt);
81
+ if (current.now >= expires || expires > absolute) return yield* StaleAuthentication.make({});
82
+ let pendingExpiry = Infinity;
83
+ if (input.pending !== void 0) {
84
+ if (pending === void 0 || mapping.pending === void 0) return yield* PendingAuthenticationInvalid.make({});
85
+ const found = yield* pending.read("Login", input.pending.digest);
86
+ if (found === void 0 || found.record.version !== input.pending.version || found.record.subjectId !== current.revision.subjectId || found.record.flowId !== input.pending.flowId || found.record.bindingDigest !== input.pending.bindingDigest) return yield* PendingAuthenticationInvalid.make({});
87
+ const original = yield* mapping.pending.login.decode(found.record.snapshot);
88
+ if (original.digest !== input.pending.digest || original.version !== input.pending.version || !preservesRevision(input.evidence, original.evidence) || DateTime.toEpochMillis(original.expiresAt) !== found.record.expiresAtMillis || original.attemptLimit !== found.record.attemptLimit) return yield* PendingAuthenticationInvalid.make({});
89
+ pendingExpiry = found.record.expiresAtMillis;
90
+ yield* pending.consume("Login", input.pending, current.native);
91
+ }
92
+ const nativeSession = yield* allocateSessionValue("interactive", s.allocateId, s.allocateIdSync);
93
+ const sessionId = yield* mapping.sessionId.toSession(nativeSession);
94
+ if (sessionId === input.handoffSourceSessionId) return yield* SessionConflict.make({});
95
+ const record = {
96
+ ...input.session,
97
+ sessionId,
98
+ subjectId: current.revision.subjectId,
99
+ securityRevision: current.revision.securityRevision,
100
+ assurance: input.handoffSourceSessionId === void 0 ? assessment.assessed.assurance : input.session.assurance,
101
+ provenance: yield* snapshotSessionAuthenticationProvenance({ evidence: input.evidence }),
102
+ issuedAt: DateTime.makeUnsafe(current.now)
103
+ };
104
+ const deadline = Math.min(expires, assessment.validUntil, pendingExpiry);
105
+ const condition = sql`${state.authorityCondition(current.revision, current.native)} and ${state.policyCondition(current.row, current.native)} and ${now} >= ${current.now} and ${now} < ${deadline}`;
106
+ const values = {
107
+ ...s.encodeInsert(record, {
108
+ subjectId: current.native,
109
+ sessionId: nativeSession
110
+ }),
111
+ [s.sessionId]: nativeSession,
112
+ [s.subjectId]: current.native,
113
+ [s.digest]: record.digest,
114
+ [s.securityRevision]: record.securityRevision,
115
+ [s.issuedAt]: s.encodeInstant(record.issuedAt),
116
+ [s.expiresAt]: s.encodeInstant(record.expiresAt),
117
+ [s.absoluteExpiresAt]: s.encodeInstant(record.absoluteExpiresAt)
118
+ };
119
+ if ((yield* stage(conditionalInsert(table, values, condition), 1)) !== 1) return yield* StaleAuthentication.make({});
120
+ const final = sql`${condition} and ${yield* recordCondition(record, values)}${input.pending === void 0 || pending === void 0 ? sql`` : sql` and ${pending.consumedCondition("Login", input.pending, current.native)}`}`;
121
+ yield* finalCondition("stateful-session-issuance", final);
122
+ if (batch === void 0 && Option.isSome(external)) yield* registerSqlPostcondition({
123
+ name: "stateful-session-issued-metadata",
124
+ check: Effect.gen(function* () {
125
+ const finalRecord = yield* records.read(record.digest);
126
+ sessionInvariant(finalRecord !== void 0 && sameSessionRecord(finalRecord, record));
127
+ const authority = yield* state.read(record.subjectId);
128
+ sessionInvariant(authority !== void 0 && sameSessionRevision(authority.revision, input.evidence.revision));
129
+ yield* sessionEvidenceDeadline(input.evidence, authority.requirement, authority.now);
130
+ }).pipe(Effect.mapError((cause) => PersistenceMappingError.make({
131
+ operation: "decode",
132
+ cause
133
+ })))
134
+ });
135
+ return yield* prepareNativeSession(record, project);
136
+ }))),
137
+ verify: ({ digest }) => executor.verify(verify(digest)).pipe(Effect.flatMap((record) => record === void 0 ? Effect.fail(SessionInvalid.make({})) : Effect.succeed(record))),
138
+ rotate: (input, project) => native(classify(Effect.gen(function* () {
139
+ const absolute = DateTime.toEpochMillis(input.record.absoluteExpiresAt), expires = DateTime.toEpochMillis(input.nextExpiresAt);
140
+ if (expires > absolute || input.nextDigest === input.record.digest || input.nextCredentialVersion === input.record.credentialVersion) return yield* SessionConflict.make({});
141
+ const needsSample = batch !== void 0 || sql.onDialectOrElse({
142
+ mysql: () => true,
143
+ orElse: () => false
144
+ });
145
+ const sampled = needsSample ? Number((yield* sql`select ${now} as engine_now`)[0]?.engine_now) : DateTime.toEpochMillis(input.record.issuedAt);
146
+ sessionInvariant(Number.isSafeInteger(sampled));
147
+ const prepared = {
148
+ ...input.record,
149
+ digest: input.nextDigest,
150
+ credentialVersion: input.nextCredentialVersion,
151
+ expiresAt: input.nextExpiresAt,
152
+ issuedAt: DateTime.makeUnsafe(sampled)
153
+ };
154
+ const values = {
155
+ ...s.encodeRotation(prepared),
156
+ [s.digest]: prepared.digest,
157
+ [s.issuedAt]: tables.expression(mapping.clock.fromMillis(now)),
158
+ [s.expiresAt]: s.encodeInstant(prepared.expiresAt)
159
+ };
160
+ const condition = sql`${yield* records.owner(input.record)} and ${live(table)} and ${now} < ${expires} and ${records.millis(table, s.absoluteExpiresAt)} = ${absolute}`;
161
+ const update = sql`${table.update(values)} where ${condition}`;
162
+ let record = prepared;
163
+ if (needsSample) {
164
+ const statement = sql`${table.update({
165
+ ...values,
166
+ [s.issuedAt]: s.encodeInstant(prepared.issuedAt)
167
+ })} where ${condition} and ${now} >= ${sampled}`;
168
+ if ((yield* stage(statement, 1)) !== 1) return yield* SessionConflict.make({});
169
+ } else {
170
+ const rows = yield* sql`${update} returning ${table.fields("session_")}`;
171
+ if (rows.length !== 1) return yield* SessionConflict.make({});
172
+ record = yield* records.decode(table.decode(rows[0], "session_"));
173
+ }
174
+ yield* finalCondition("stateful-session-rotation", yield* recordCondition(record, {
175
+ ...values,
176
+ [s.issuedAt]: s.encodeInstant(record.issuedAt)
177
+ }));
178
+ return yield* prepareNativeSession(record, project);
179
+ })), "statement"),
180
+ revokeDigest: (digest, project) => native(Effect.gen(function* () {
181
+ let expected;
182
+ if (batch !== void 0) expected = (yield* sql`select 1 from ${table.name} where ${exact(table, s.digest, digest)} limit 2`).length;
183
+ const changed = yield* stage(sql`delete from ${table.name} where ${exact(table, s.digest, digest)}`, expected);
184
+ sessionInvariant(changed !== void 0 && changed <= 1);
185
+ yield* finalCondition("stateful-session-digest-revocation", sql`not exists(select 1 from ${table.name} where ${exact(table, s.digest, digest)})`);
186
+ return yield* prepareNativeSession(changed === 1, project);
187
+ }), "statement"),
188
+ revoke: (input, project) => native(Effect.gen(function* () {
189
+ const subject = yield* mapping.subjectId.toNative(input.subjectId), session = yield* mapping.sessionId.toNative(input.sessionId);
190
+ const condition = sql`${state.id(table, s.subjectId, subject)} and ${state.id(table, s.sessionId, session)}`;
191
+ yield* stage(sql`delete from ${table.name} where ${condition}`);
192
+ yield* finalCondition("stateful-session-revocation", sql`not exists(select 1 from ${table.name} where ${condition})`);
193
+ return yield* prepareNativeSession(void 0, project);
194
+ }), "statement"),
195
+ revokeAll: (input, project) => native(Effect.gen(function* () {
196
+ const nativeSubject = yield* mapping.subjectId.toNative(input.subjectId), owner = mapping.subject;
197
+ const next = yield* allocateSessionValue("interactive", owner.nextSecurityRevision?.(input.expectedSecurityRevision), owner.nextSecurityRevisionSync === void 0 ? void 0 : () => owner.nextSecurityRevisionSync(input.expectedSecurityRevision));
198
+ sessionInvariant(next !== input.expectedSecurityRevision);
199
+ if ((yield* stage(sql`${state.subject.update({ [owner.securityRevision]: next })} where ${state.id(state.subject, owner.id, nativeSubject)} and ${state.activeSubject(state.subject)} and ${state.exact(state.subject, owner.securityRevision, input.expectedSecurityRevision)}`, 1)) !== 1) return yield* StaleAuthentication.make({});
200
+ yield* finalCondition("all-session-revocation", sql`exists(select 1 from ${state.subject.name} where ${state.id(state.subject, owner.id, nativeSubject)} and ${state.exact(state.subject, owner.securityRevision, next)})`);
201
+ return yield* prepareNativeSession(void 0, project);
202
+ }), "statement")
203
+ },
204
+ sessionRepository: { list: (input) => executor.read(Effect.gen(function* () {
205
+ sessionInvariant(Number.isSafeInteger(input.limit) && input.limit > 0 && input.limit <= 1e3);
206
+ const nativeSubject = yield* mapping.subjectId.toNative(input.subjectId), st = state.subject.as("listed_subject"), list = table.as("listed_session"), owner = mapping.subject;
207
+ const cursor = input.cursor === void 0 ? void 0 : yield* mapping.sessionId.toNative(yield* Schema.decodeEffect(SessionId)(input.cursor));
208
+ const rows = yield* sql`select ${list.fields("session_")}, ${st.fields("subject_")} from ${list.name} join ${st.name} on ${state.id(st, owner.id, nativeSubject)} and ${state.activeSubject(st)} and ${exactSqlText(sql, st.column(owner.securityRevision), list.column(s.securityRevision))} where ${state.id(list, s.subjectId, nativeSubject)} and ${live(list)}${cursor === void 0 ? sql`` : sql` and ${list.column(s.sessionId)} > ${list.value(s.sessionId, cursor)}`} order by ${list.column(s.sessionId)} limit ${input.limit + 1}`;
209
+ const decoded = yield* Effect.forEach(rows.slice(0, input.limit), (row) => Effect.gen(function* () {
210
+ const record = yield* records.decode(list.decode(row, "session_"));
211
+ sessionInvariant(record.subjectId === input.subjectId && (yield* mapping.subjectId.toSubject(st.decode(row, "subject_")[owner.id])) === input.subjectId);
212
+ return yield* Schema.decodeEffect(Schema.toType(SessionMetadata))(record);
213
+ }));
214
+ const nextCursor = rows.length > input.limit ? decoded.at(-1)?.sessionId : void 0;
215
+ return {
216
+ sessions: decoded,
217
+ ...nextCursor === void 0 ? {} : { nextCursor }
218
+ };
219
+ })) }
220
+ };
221
+ });
222
+ //#endregion
223
+ export { makeNativeStatefulSessionServices };
224
+
225
+ //# sourceMappingURL=session-native-stateful.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-native-stateful.mjs","names":[],"sources":["../../src/internal/session-native-stateful.ts"],"sourcesContent":["import type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport {\n SessionConflict,\n SessionInvalid,\n PendingAuthenticationInvalid,\n StaleAuthentication,\n SessionMetadata,\n SessionId,\n snapshotSessionAuthenticationProvenance,\n type StatefulSessionPersistence,\n type StatefulSessionRecord,\n type SessionRepository,\n} from \"@yielded/auth/Sessions\";\nimport { DateTime, Effect, Option, Schema } from \"effect\";\nimport type { SqlClient } from \"effect/sql/SqlClient\";\nimport type { Fragment } from \"effect/sql/Statement\";\n\nimport { sqlBatchAssertion } from \"./d1-planning\";\nimport { PersistenceMappingError, isMappedConstraintConflict } from \"./mapping-error\";\nimport type { StatefulSessionMapping } from \"./models/session-model\";\nimport type { NativeSqlTables } from \"./native-sql-table\";\nimport { sessionEvidenceDeadline } from \"./session-native-authority\";\nimport { makeNativeSessionPending, prepareNativeSession } from \"./session-native-pending\";\nimport {\n makeConditionalSqlInsert,\n makeNativeSessionRecords,\n sameSessionRecord,\n} from \"./session-native-record\";\nimport {\n makeNativeSessionAuthorityState,\n sameSessionRevision,\n normalizeSessionOperation,\n sessionInvariant,\n sessionUnavailable,\n} from \"./session-native-state\";\nimport { allocateSessionValue, preservesRevision } from \"./session-policy\";\nimport { exactSqlText, executeSqlChange } from \"./sql-change\";\nimport {\n CurrentSqlCommit,\n makeSqlCommitExecutor,\n SqlBatchCommit,\n appendSqlBatchStatement,\n registerSqlBatchPostcondition,\n registerSqlPostcondition,\n} from \"./sql-commit\";\nimport type { AnyTableModel } from \"./table-model\";\n\nexport type NativeStatefulSessionMapping<Claims> = StatefulSessionMapping<\n Claims,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n unknown\n>;\n\nexport const makeNativeStatefulSessionServices = Effect.fnUntraced(function* <Claims>(\n tables: NativeSqlTables,\n mapping: NativeStatefulSessionMapping<Claims>,\n): Effect.fn.Return<\n {\n readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;\n readonly sessionRepository: SessionRepository;\n },\n never,\n SqlClient | LifecycleHooks | SqlBatchCommit\n> {\n const batch = yield* SqlBatchCommit;\n\n const state = yield* makeNativeSessionAuthorityState(tables, mapping, batch !== undefined);\n const conditionalInsert = yield* makeConditionalSqlInsert();\n const records = yield* makeNativeSessionRecords(tables, mapping);\n const executor = yield* makeSqlCommitExecutor(sessionUnavailable);\n const external = yield* Effect.serviceOption(CurrentSqlCommit);\n\n const pending =\n mapping.pending === undefined\n ? undefined\n : yield* makeNativeSessionPending(\n tables,\n { ...mapping, ...mapping.pending },\n batch !== undefined,\n );\n\n const { sql, s, table, now, exact, live } = records;\n\n const native = <A, E, R>(\n work: Effect.Effect<A, E, R>,\n mode: \"transaction\" | \"statement\" = \"transaction\",\n ) =>\n batch === undefined\n ? executor.operation(normalizeSessionOperation(work), mode)\n : executor\n .operationBatch(normalizeSessionOperation(work))\n .pipe(Effect.provideService(SqlBatchCommit, batch));\n\n const stage = Effect.fnUntraced(function* (statement: Fragment, expected?: number) {\n if (batch !== undefined) {\n yield* appendSqlBatchStatement(sql`${statement}`);\n if (expected !== undefined)\n yield* appendSqlBatchStatement(sqlBatchAssertion(sql, sql`changes() = ${expected}`));\n\n return expected;\n }\n\n return yield* executeSqlChange(sql, statement);\n });\n\n const finalCondition = Effect.fnUntraced(function* (name: string, condition: Fragment) {\n if (batch !== undefined)\n yield* registerSqlBatchPostcondition({ name, statement: sqlBatchAssertion(sql, condition) });\n else if (Option.isSome(external))\n yield* registerSqlPostcondition({\n name,\n check: Effect.gen(function* () {\n const rows = yield* sql`select 1 where ${condition}`;\n\n sessionInvariant(rows.length === 1);\n }).pipe(\n Effect.mapError((cause) => PersistenceMappingError.make({ operation: \"decode\", cause })),\n ),\n });\n });\n\n const recordCondition = Effect.fnUntraced(function* (\n record: StatefulSessionRecord<Claims>,\n values: Readonly<Record<string, unknown>>,\n ) {\n return sql`exists(select 1 from ${table.name} where ${yield* records.owner(record)} and ${exact(table, s.securityRevision, record.securityRevision)} and ${records.millis(table, s.expiresAt)} = ${DateTime.toEpochMillis(record.expiresAt)} and ${records.millis(table, s.absoluteExpiresAt)} = ${DateTime.toEpochMillis(record.absoluteExpiresAt)} and ${records.encodedCondition(values)} and ${live(table)})`;\n });\n\n const classify = <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n effect.pipe(\n Effect.mapError((error) =>\n isMappedConstraintConflict(mapping.isConstraintConflict, error)\n ? SessionConflict.make({})\n : error,\n ),\n );\n\n const verify = Effect.fnUntraced(function* (digest: StatefulSessionRecord<Claims>[\"digest\"]) {\n const subject = state.subject.as(\"verified_subject\"),\n session = table.as(\"verified_session\"),\n owner = mapping.subject;\n\n if (\n table.unencodedTextColumn?.(s.subjectId) !== undefined &&\n state.subject.unencodedTextColumn?.(owner.id) !== undefined\n ) {\n const rows =\n yield* sql`select ${session.fields(\"session_\")}, ${subject.fields(\"subject_\")} from ${session.name} join ${subject.name} on ${exactSqlText(sql, subject.column(owner.id), session.column(s.subjectId))} and ${state.activeSubject(subject)} and ${exactSqlText(sql, subject.column(owner.securityRevision), session.column(s.securityRevision))} where ${exact(session, s.digest, digest)} and ${live(session)} limit 2`;\n\n sessionInvariant(rows.length <= 1);\n if (rows[0] === undefined) return undefined;\n const record = yield* records.decode(session.decode(rows[0], \"session_\"));\n const decoded = subject.decode(rows[0], \"subject_\");\n\n sessionInvariant(\n (yield* mapping.subjectId.toSubject(decoded[owner.id])) === record.subjectId &&\n decoded[owner.securityRevision] === record.securityRevision &&\n owner.isActiveStatus(decoded[owner.status]),\n );\n\n return record;\n }\n const record = yield* records.read(digest);\n\n if (record === undefined) return undefined;\n const nativeSubject = yield* mapping.subjectId.toNative(record.subjectId);\n\n const rows =\n yield* sql`select ${subject.fields(\"subject_\")} from ${subject.name} where ${state.id(subject, owner.id, nativeSubject)} and ${state.activeSubject(subject)} and ${state.exact(subject, owner.securityRevision, record.securityRevision)} and ${now} < ${DateTime.toEpochMillis(record.expiresAt)} limit 2`;\n\n sessionInvariant(rows.length <= 1);\n if (rows[0] === undefined) return undefined;\n sessionInvariant(\n (yield* mapping.subjectId.toSubject(subject.decode(rows[0], \"subject_\")[owner.id])) ===\n record.subjectId,\n );\n\n return record;\n });\n\n const persistence: StatefulSessionPersistence<Claims> = {\n establish: (input, project) =>\n native(\n classify(\n Effect.gen(function* () {\n const current = yield* state.read(input.evidence.revision.subjectId, true);\n\n if (\n current === undefined ||\n !sameSessionRevision(current.revision, input.evidence.revision)\n )\n return yield* StaleAuthentication.make({});\n\n const assessment = yield* sessionEvidenceDeadline(\n input.evidence,\n current.requirement,\n current.now,\n );\n\n const expires = DateTime.toEpochMillis(input.session.expiresAt),\n absolute = DateTime.toEpochMillis(input.session.absoluteExpiresAt);\n\n if (current.now >= expires || expires > absolute)\n return yield* StaleAuthentication.make({});\n let pendingExpiry = Infinity;\n\n if (input.pending !== undefined) {\n if (pending === undefined || mapping.pending === undefined)\n return yield* PendingAuthenticationInvalid.make({});\n const found = yield* pending.read(\"Login\", input.pending.digest);\n\n if (\n found === undefined ||\n found.record.version !== input.pending.version ||\n found.record.subjectId !== current.revision.subjectId ||\n found.record.flowId !== input.pending.flowId ||\n found.record.bindingDigest !== input.pending.bindingDigest\n )\n return yield* PendingAuthenticationInvalid.make({});\n const original = yield* mapping.pending.login.decode(found.record.snapshot);\n\n if (\n original.digest !== input.pending.digest ||\n original.version !== input.pending.version ||\n !preservesRevision(input.evidence, original.evidence) ||\n DateTime.toEpochMillis(original.expiresAt) !== found.record.expiresAtMillis ||\n original.attemptLimit !== found.record.attemptLimit\n )\n return yield* PendingAuthenticationInvalid.make({});\n pendingExpiry = found.record.expiresAtMillis;\n yield* pending.consume(\"Login\", input.pending, current.native);\n }\n\n const nativeSession = yield* allocateSessionValue(\n \"interactive\",\n s.allocateId,\n s.allocateIdSync,\n );\n\n const sessionId = yield* mapping.sessionId.toSession(nativeSession);\n\n if (sessionId === input.handoffSourceSessionId) return yield* SessionConflict.make({});\n\n const record: StatefulSessionRecord<Claims> = {\n ...input.session,\n sessionId,\n subjectId: current.revision.subjectId,\n securityRevision: current.revision.securityRevision,\n assurance:\n input.handoffSourceSessionId === undefined\n ? assessment.assessed.assurance\n : input.session.assurance,\n provenance: yield* snapshotSessionAuthenticationProvenance({\n evidence: input.evidence,\n }),\n issuedAt: DateTime.makeUnsafe(current.now),\n };\n\n const deadline = Math.min(expires, assessment.validUntil, pendingExpiry);\n const condition = sql`${state.authorityCondition(current.revision, current.native)} and ${state.policyCondition(current.row, current.native)} and ${now} >= ${current.now} and ${now} < ${deadline}`;\n\n const values = {\n ...s.encodeInsert(record, { subjectId: current.native, sessionId: nativeSession }),\n [s.sessionId]: nativeSession,\n [s.subjectId]: current.native,\n [s.digest]: record.digest,\n [s.securityRevision]: record.securityRevision,\n [s.issuedAt]: s.encodeInstant(record.issuedAt),\n [s.expiresAt]: s.encodeInstant(record.expiresAt),\n [s.absoluteExpiresAt]: s.encodeInstant(record.absoluteExpiresAt),\n };\n\n const changed = yield* stage(conditionalInsert(table, values, condition), 1);\n\n if (changed !== 1) return yield* StaleAuthentication.make({});\n const final = sql`${condition} and ${yield* recordCondition(record, values)}${input.pending === undefined || pending === undefined ? sql`` : sql` and ${pending.consumedCondition(\"Login\", input.pending, current.native)}`}`;\n\n yield* finalCondition(\"stateful-session-issuance\", final);\n if (batch === undefined && Option.isSome(external))\n yield* registerSqlPostcondition({\n name: \"stateful-session-issued-metadata\",\n check: Effect.gen(function* () {\n const finalRecord = yield* records.read(record.digest);\n\n sessionInvariant(\n finalRecord !== undefined && sameSessionRecord(finalRecord, record),\n );\n const authority = yield* state.read(record.subjectId);\n\n sessionInvariant(\n authority !== undefined &&\n sameSessionRevision(authority.revision, input.evidence.revision),\n );\n yield* sessionEvidenceDeadline(\n input.evidence,\n authority.requirement,\n authority.now,\n );\n }).pipe(\n Effect.mapError((cause) =>\n PersistenceMappingError.make({ operation: \"decode\", cause }),\n ),\n ),\n });\n\n return yield* prepareNativeSession(record, project);\n }),\n ),\n ),\n verify: ({ digest }) =>\n executor\n .verify(verify(digest))\n .pipe(\n Effect.flatMap((record) =>\n record === undefined ? Effect.fail(SessionInvalid.make({})) : Effect.succeed(record),\n ),\n ),\n rotate: (input, project) =>\n native(\n classify(\n Effect.gen(function* () {\n const absolute = DateTime.toEpochMillis(input.record.absoluteExpiresAt),\n expires = DateTime.toEpochMillis(input.nextExpiresAt);\n\n if (\n expires > absolute ||\n input.nextDigest === input.record.digest ||\n input.nextCredentialVersion === input.record.credentialVersion\n )\n return yield* SessionConflict.make({});\n\n const needsSample =\n batch !== undefined ||\n sql.onDialectOrElse({ mysql: () => true, orElse: () => false });\n\n const sampled = needsSample\n ? Number((yield* sql`select ${now} as engine_now`)[0]?.engine_now)\n : DateTime.toEpochMillis(input.record.issuedAt);\n\n sessionInvariant(Number.isSafeInteger(sampled));\n\n const prepared = {\n ...input.record,\n digest: input.nextDigest,\n credentialVersion: input.nextCredentialVersion,\n expiresAt: input.nextExpiresAt,\n issuedAt: DateTime.makeUnsafe(sampled),\n };\n\n const values = {\n ...s.encodeRotation(prepared),\n [s.digest]: prepared.digest,\n [s.issuedAt]: tables.expression(mapping.clock.fromMillis(now)),\n [s.expiresAt]: s.encodeInstant(prepared.expiresAt),\n };\n\n const condition = sql`${yield* records.owner(input.record)} and ${live(table)} and ${now} < ${expires} and ${records.millis(table, s.absoluteExpiresAt)} = ${absolute}`;\n const update = sql`${table.update(values)} where ${condition}`;\n let record = prepared;\n\n if (needsSample) {\n // Batch receipts are prepared before execution. The exact sampled time is\n // written and checked; no speculative UPDATE result is treated as committed.\n const statement = sql`${table.update({ ...values, [s.issuedAt]: s.encodeInstant(prepared.issuedAt) })} where ${condition} and ${now} >= ${sampled}`;\n const changed = yield* stage(statement, 1);\n\n if (changed !== 1) return yield* SessionConflict.make({});\n } else {\n const rows = yield* sql`${update} returning ${table.fields(\"session_\")}`;\n\n if (rows.length !== 1) return yield* SessionConflict.make({});\n record = yield* records.decode(table.decode(rows[0]!, \"session_\"));\n }\n yield* finalCondition(\n \"stateful-session-rotation\",\n yield* recordCondition(record, {\n ...values,\n [s.issuedAt]: s.encodeInstant(record.issuedAt),\n }),\n );\n\n return yield* prepareNativeSession(record, project);\n }),\n ),\n \"statement\",\n ),\n revokeDigest: (digest, project) =>\n native(\n Effect.gen(function* () {\n let expected: number | undefined;\n\n if (batch !== undefined)\n expected =\n (yield* sql`select 1 from ${table.name} where ${exact(table, s.digest, digest)} limit 2`)\n .length;\n\n const changed = yield* stage(\n sql`delete from ${table.name} where ${exact(table, s.digest, digest)}`,\n expected,\n );\n\n sessionInvariant(changed !== undefined && changed <= 1);\n yield* finalCondition(\n \"stateful-session-digest-revocation\",\n sql`not exists(select 1 from ${table.name} where ${exact(table, s.digest, digest)})`,\n );\n\n return yield* prepareNativeSession(changed === 1, project);\n }),\n \"statement\",\n ),\n revoke: (input, project) =>\n native(\n Effect.gen(function* () {\n const subject = yield* mapping.subjectId.toNative(input.subjectId),\n session = yield* mapping.sessionId.toNative(input.sessionId);\n\n const condition = sql`${state.id(table, s.subjectId, subject)} and ${state.id(table, s.sessionId, session)}`;\n\n yield* stage(sql`delete from ${table.name} where ${condition}`);\n yield* finalCondition(\n \"stateful-session-revocation\",\n sql`not exists(select 1 from ${table.name} where ${condition})`,\n );\n\n return yield* prepareNativeSession(undefined, project);\n }),\n \"statement\",\n ),\n revokeAll: (input, project) =>\n native(\n Effect.gen(function* () {\n const nativeSubject = yield* mapping.subjectId.toNative(input.subjectId),\n owner = mapping.subject;\n\n const next = yield* allocateSessionValue(\n \"interactive\",\n owner.nextSecurityRevision?.(input.expectedSecurityRevision),\n owner.nextSecurityRevisionSync === undefined\n ? undefined\n : () => owner.nextSecurityRevisionSync!(input.expectedSecurityRevision),\n );\n\n sessionInvariant(next !== input.expectedSecurityRevision);\n\n const changed = yield* stage(\n sql`${state.subject.update({ [owner.securityRevision]: next })} where ${state.id(state.subject, owner.id, nativeSubject)} and ${state.activeSubject(state.subject)} and ${state.exact(state.subject, owner.securityRevision, input.expectedSecurityRevision)}`,\n 1,\n );\n\n if (changed !== 1) return yield* StaleAuthentication.make({});\n yield* finalCondition(\n \"all-session-revocation\",\n sql`exists(select 1 from ${state.subject.name} where ${state.id(state.subject, owner.id, nativeSubject)} and ${state.exact(state.subject, owner.securityRevision, next)})`,\n );\n\n return yield* prepareNativeSession(undefined, project);\n }),\n \"statement\",\n ),\n };\n\n const sessionRepository: SessionRepository = {\n list: (input) =>\n executor.read(\n Effect.gen(function* () {\n sessionInvariant(\n Number.isSafeInteger(input.limit) && input.limit > 0 && input.limit <= 1000,\n );\n\n const nativeSubject = yield* mapping.subjectId.toNative(input.subjectId),\n st = state.subject.as(\"listed_subject\"),\n list = table.as(\"listed_session\"),\n owner = mapping.subject;\n\n const cursor =\n input.cursor === undefined\n ? undefined\n : yield* mapping.sessionId.toNative(\n yield* Schema.decodeEffect(SessionId)(input.cursor),\n );\n\n const rows =\n yield* sql`select ${list.fields(\"session_\")}, ${st.fields(\"subject_\")} from ${list.name} join ${st.name} on ${state.id(st, owner.id, nativeSubject)} and ${state.activeSubject(st)} and ${exactSqlText(sql, st.column(owner.securityRevision), list.column(s.securityRevision))} where ${state.id(list, s.subjectId, nativeSubject)} and ${live(list)}${cursor === undefined ? sql`` : sql` and ${list.column(s.sessionId)} > ${list.value(s.sessionId, cursor)}`} order by ${list.column(s.sessionId)} limit ${input.limit + 1}`;\n\n const decoded = yield* Effect.forEach(rows.slice(0, input.limit), (row) =>\n Effect.gen(function* () {\n const record = yield* records.decode(list.decode(row, \"session_\"));\n\n sessionInvariant(\n record.subjectId === input.subjectId &&\n (yield* mapping.subjectId.toSubject(st.decode(row, \"subject_\")[owner.id])) ===\n input.subjectId,\n );\n\n return yield* Schema.decodeEffect(Schema.toType(SessionMetadata))(record);\n }),\n );\n\n const nextCursor = rows.length > input.limit ? decoded.at(-1)?.sessionId : undefined;\n\n return { sessions: decoded, ...(nextCursor === undefined ? {} : { nextCursor }) };\n }),\n ),\n };\n\n return { statefulSessionPersistence: persistence, sessionRepository };\n});\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { AnyTableModel } from "./table-model.mjs";
2
+ import { SessionStepUpMapping } from "./models/step-up-model.mjs";
3
+ import { NativeSqlTables } from "./native-sql-table.mjs";
4
+ import { SqlBatchCommit } from "./sql-commit.mjs";
5
+ import { Effect } from "effect";
6
+ import { LifecycleHooks } from "@yielded/auth/Hooks";
7
+ import { SessionStepUpPersistence } from "@yielded/auth/Sessions";
8
+ import { SqlClient } from "effect/sql/SqlClient";
9
+ //#region src/internal/session-native-step-up.d.ts
10
+ export type NativeSessionStepUpMapping<Claims> = SessionStepUpMapping<Claims, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, unknown>;
11
+ export declare const makeNativeSessionStepUpServices: <Claims>(tables: NativeSqlTables, mapping: NativeSessionStepUpMapping<Claims>) => Effect.Effect<{
12
+ readonly sessionStepUpPersistence: SessionStepUpPersistence<Claims>;
13
+ }, never, LifecycleHooks | SqlBatchCommit | SqlClient>;
14
+ //#endregion
15
+ //# sourceMappingURL=session-native-step-up.d.mts.map