@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 +1 @@
1
- {"version":3,"file":"email-model.mjs","names":[],"sources":["../../../src/internal/models/email-model.ts"],"sourcesContent":["import type { EmailAction, EmailRegistrationDecision } from \"@yielded/auth/Email\";\nimport type { LoginIdentifier } from \"@yielded/auth/Identity\";\nimport type { ProofBinding, ProofContinuationId, ProofPurpose } from \"@yielded/auth/Proofs\";\nimport type { TokenDigest } from \"@yielded/auth/Schema\";\nimport type { AuthenticationRequirement, SecurityRevision } from \"@yielded/auth/Sessions\";\nimport type { Effect } from \"effect\";\n\nimport type { AnyTableModel, TableModel as Table, SqlExpression } from \"../query-operations\";\nimport type { PersistenceMappingError, SubjectIdCodec } from \"./common\";\n\ntype ColumnKey<T extends Table> = T[\"column\"];\n\nexport interface EmailSubjectReadTable<Subject extends Table> {\n readonly table: Subject[\"table\"];\n readonly id: ColumnKey<Subject>;\n readonly status: ColumnKey<Subject>;\n readonly securityRevision: ColumnKey<Subject>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly d1ActiveStatusValue?: unknown;\n}\n\nexport interface EmailSubjectTable<Subject extends Table> extends EmailSubjectReadTable<Subject> {\n readonly decodeActionRequirement: (\n row: Subject[\"select\"],\n action: EmailAction,\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n readonly nextSecurityRevision?: (\n current: SecurityRevision,\n ) => Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly nextSecurityRevisionSync?: (current: SecurityRevision) => SecurityRevision;\n readonly d1ActiveStatusValue?: unknown;\n}\n\nexport interface EmailIdentifierReadTable<Identifier extends Table> {\n readonly table: Identifier[\"table\"];\n readonly namespace: ColumnKey<Identifier>;\n readonly value: ColumnKey<Identifier>;\n readonly subjectId: ColumnKey<Identifier>;\n readonly verifiedAt: ColumnKey<Identifier>;\n readonly bindingRevision: ColumnKey<Identifier>;\n readonly isCurrent: (row: Identifier[\"select\"]) => boolean;\n}\n\nexport interface EmailIdentifierTable<\n Identifier extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> extends EmailIdentifierReadTable<Identifier> {\n /** True only for an active, unverified binding. Confirming it preserves existing sessions. */\n readonly isMutableTarget: (row: Identifier[\"select\"]) => boolean;\n readonly encodeVerifiedInsert: (input: {\n readonly identifier: LoginIdentifier;\n readonly subjectId: NativeSubjectId;\n readonly verifiedAtMillis: number;\n readonly bindingRevision: SecurityRevision;\n }) => Identifier[\"insert\"];\n readonly encodeVerification: (input: {\n readonly verifiedAtMillis: number;\n readonly bindingRevision: SecurityRevision;\n }) => Partial<Identifier[\"insert\"]>;\n /** Must make the selected source unavailable to sign-in. */\n readonly encodeRetirement: (input: {\n readonly source: LoginIdentifier;\n readonly bindingRevision: SecurityRevision;\n }) => Partial<Identifier[\"insert\"]>;\n readonly d1CurrentCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n readonly bindingRevision: SecurityRevision;\n }) => Expression;\n readonly d1MutableTargetCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n }) => Expression;\n}\n\nexport interface EmailCredentialReadTable<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n _NativeSubjectId,\n> {\n readonly table: Credential[\"table\"];\n readonly moduleId: ColumnKey<Credential>;\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly identifierNamespace: ColumnKey<Credential>;\n readonly identifierValue: ColumnKey<Credential>;\n readonly credentialRevision: ColumnKey<Credential>;\n readonly status: ColumnKey<Credential>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly decode: (input: {\n readonly moduleId: string;\n readonly subject: Subject[\"select\"];\n readonly identifier: Identifier[\"select\"];\n readonly credential: Credential[\"select\"];\n }) => Effect.Effect<\n import(\"@yielded/auth/Email\").EmailCredentialSnapshot,\n PersistenceMappingError\n >;\n}\n\nexport interface EmailCredentialTable<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n NativeSubjectId,\n> extends EmailCredentialReadTable<Subject, Identifier, Credential, NativeSubjectId> {\n readonly encodeVerifiedInsert: (input: {\n readonly moduleId: string;\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly identifier: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Credential[\"insert\"];\n readonly encodeActivation: (input: {\n readonly identifier: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Partial<Credential[\"insert\"]>;\n readonly encodeRetirement: (input: {\n readonly source: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Partial<Credential[\"insert\"]>;\n readonly d1ActiveStatusValue?: unknown;\n}\n\nexport interface EmailAuthorityCredentialTable<Credential extends Table, NativeSubjectId> {\n readonly table: Credential[\"table\"];\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly revision: ColumnKey<Credential>;\n readonly status: ColumnKey<Credential>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly encodeInsert: (input: {\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly revision: SecurityRevision;\n }) => Credential[\"insert\"];\n readonly encodeActivation: (revision: SecurityRevision) => Partial<Credential[\"insert\"]>;\n readonly encodeRetirement: (revision: SecurityRevision) => Partial<Credential[\"insert\"]>;\n readonly d1ActiveStatusValue?: unknown;\n}\n\nexport interface EmailCommandTable<Command extends Table> {\n readonly table: Command[\"table\"];\n readonly moduleId: ColumnKey<Command>;\n readonly commandId: ColumnKey<Command>;\n readonly action: ColumnKey<Command>;\n readonly bindingDigest: ColumnKey<Command>;\n readonly retentionUntil: ColumnKey<Command>;\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly commandId: string;\n readonly action: EmailAction;\n readonly bindingDigest: TokenDigest;\n readonly retentionUntilMillis: number;\n }) => Command[\"insert\"];\n}\n\nexport interface RequiredEmailSignInConstraints {\n readonly identifier: \"unique(identifier.namespace,identifier.value)\";\n readonly credentialId: \"unique(emailCredential.moduleId,emailCredential.credentialId)\";\n readonly credentialIdentifier: \"unique(emailCredential.moduleId,emailCredential.identifierNamespace,emailCredential.identifierValue)\";\n}\n\nexport const requiredEmailSignInConstraints: RequiredEmailSignInConstraints = {\n identifier: \"unique(identifier.namespace,identifier.value)\",\n credentialId: \"unique(emailCredential.moduleId,emailCredential.credentialId)\",\n credentialIdentifier:\n \"unique(emailCredential.moduleId,emailCredential.identifierNamespace,emailCredential.identifierValue)\",\n};\n\nexport interface EmailSignInMapping<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n NativeSubjectId,\n> {\n readonly subject: EmailSubjectReadTable<Subject>;\n readonly identifier: EmailIdentifierReadTable<Identifier>;\n readonly credential: EmailCredentialReadTable<Subject, Identifier, Credential, NativeSubjectId>;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredEmailSignInConstraints;\n readonly decodeInstant: (native: unknown) => Effect.Effect<number, PersistenceMappingError>;\n}\n\nexport interface RequiredEmailAddressConstraints extends RequiredEmailSignInConstraints {\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n readonly command: \"unique(emailCommand.moduleId,emailCommand.commandId)\";\n}\n\nexport const requiredEmailAddressConstraints: RequiredEmailAddressConstraints = {\n ...requiredEmailSignInConstraints,\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n command: \"unique(emailCommand.moduleId,emailCommand.commandId)\",\n};\n\nexport interface EmailD1Clock<Expression extends SqlExpression = SqlExpression> {\n readonly engineNow: Expression;\n readonly engineNowMillis: Expression;\n readonly engineInstantPlus: (millis: number) => Expression;\n}\n\nexport interface EmailAddressMapping<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n Command extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> extends EmailSignInMapping<Subject, Identifier, Credential, NativeSubjectId> {\n readonly subject: EmailSubjectTable<Subject>;\n readonly identifier: EmailIdentifierTable<Identifier, NativeSubjectId, Expression>;\n readonly credential: EmailCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;\n readonly authorityCredential: EmailAuthorityCredentialTable<AuthorityCredential, NativeSubjectId>;\n readonly command: EmailCommandTable<Command>;\n readonly constraints: RequiredEmailAddressConstraints;\n readonly addressCardinality: \"single\" | \"multiple\";\n readonly changeDisposition: \"retire-source\";\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n readonly encodeInstant: (epochMillis: number) => unknown;\n readonly commandRetentionMillis: number;\n readonly sessionInvalidation: \"same-authority-immediate\" | \"original-absolute-expiry\";\n readonly isCommandConflict: (cause: unknown) => boolean;\n readonly isIdentifierConflict: (cause: unknown) => boolean;\n readonly isCredentialConflict: (cause: unknown) => boolean;\n readonly d1?: EmailD1Clock<Expression>;\n}\n\nexport type D1EmailAddressMapping<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n Command extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> = EmailAddressMapping<\n Subject,\n Identifier,\n Credential,\n AuthorityCredential,\n Command,\n NativeSubjectId,\n Expression\n> & {\n readonly d1: EmailD1Clock<Expression>;\n readonly subject: EmailSubjectTable<Subject> & {\n readonly d1ActiveStatusValue: unknown;\n };\n readonly identifier: EmailIdentifierTable<Identifier, NativeSubjectId, Expression> & {\n readonly d1CurrentCondition: NonNullable<\n EmailIdentifierTable<Identifier, NativeSubjectId, Expression>[\"d1CurrentCondition\"]\n >;\n readonly d1MutableTargetCondition: NonNullable<\n EmailIdentifierTable<Identifier, NativeSubjectId, Expression>[\"d1MutableTargetCondition\"]\n >;\n };\n readonly credential: EmailCredentialTable<Subject, Identifier, Credential, NativeSubjectId> & {\n readonly d1ActiveStatusValue: unknown;\n };\n readonly authorityCredential: EmailAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n > & {\n readonly d1ActiveStatusValue: unknown;\n };\n};\n\nexport type EmailRegistrationState = \"pending\" | \"registered\";\n\nexport interface EmailRegistrationIntent<Registration> {\n readonly moduleId: string;\n readonly commandId: string;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly fingerprint: TokenDigest;\n readonly completion: {\n readonly moduleId: string;\n readonly purpose: ProofPurpose;\n readonly continuationId: ProofContinuationId;\n readonly binding: ProofBinding;\n };\n}\n\nexport interface EmailRegistrationTable<Registration, Request extends Table, NativeSubjectId> {\n readonly table: Request[\"table\"];\n readonly moduleId: ColumnKey<Request>;\n readonly commandId: ColumnKey<Request>;\n readonly fingerprint: ColumnKey<Request>;\n readonly state: ColumnKey<Request>;\n readonly subjectId: ColumnKey<Request>;\n readonly pendingReference: ColumnKey<Request>;\n readonly retentionUntil: ColumnKey<Request>;\n readonly encodeInsert: (\n input: EmailRegistrationIntent<Registration>,\n state: {\n readonly state: EmailRegistrationState;\n readonly nativeSubjectId?: NativeSubjectId;\n readonly pendingReference?: string;\n readonly retentionUntilMillis: number;\n },\n ) => Request[\"insert\"];\n readonly decodeReplay: (row: Request[\"select\"]) => Effect.Effect<\n Exclude<\n EmailRegistrationDecision,\n {\n readonly _tag: \"Registered\";\n }\n >,\n PersistenceMappingError\n >;\n}\n\nexport interface EmailRegistrationProvisioning<\n Registration,\n Subject extends Table,\n NativeSubjectId,\n> {\n readonly encodeSubjectInsert: (\n input: EmailRegistrationIntent<Registration>,\n values: {\n readonly nativeSubjectId: NativeSubjectId | undefined;\n readonly securityRevision: SecurityRevision;\n },\n ) => Subject[\"insert\"];\n readonly allocateSubjectId?: Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n readonly allocateSubjectIdSync?: () => NativeSubjectId;\n readonly decodeGeneratedId?: (\n rows: ReadonlyArray<unknown>,\n ) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n}\n\nexport interface EmailRegistrationIdentifierTable<\n Identifier extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: Identifier[\"table\"];\n readonly namespace: ColumnKey<Identifier>;\n readonly value: ColumnKey<Identifier>;\n /** Atomic mailbox registration may reassign an unverified binding in place.\n * Only subjectId, verifiedAt and bindingRevision change; the supplied proof\n * authority must admit only absent or active-unverified registration targets.\n * Its prior subject's mapped securityRevision advances in the same commit. */\n readonly subjectId: ColumnKey<Identifier>;\n readonly verifiedAt: ColumnKey<Identifier>;\n readonly bindingRevision: ColumnKey<Identifier>;\n readonly isCurrent: (row: Identifier[\"select\"]) => boolean;\n readonly d1CurrentCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n readonly bindingRevision: SecurityRevision;\n }) => Expression;\n readonly encodeVerifiedInsert: (input: {\n readonly identifier: LoginIdentifier;\n readonly subjectId: NativeSubjectId;\n readonly verifiedAtMillis: number;\n readonly bindingRevision: SecurityRevision;\n }) => Identifier[\"insert\"];\n}\n\nexport interface EmailRegistrationCredentialTable<Credential extends Table, NativeSubjectId> {\n readonly table: Credential[\"table\"];\n readonly moduleId: ColumnKey<Credential>;\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly identifierNamespace: ColumnKey<Credential>;\n readonly identifierValue: ColumnKey<Credential>;\n readonly credentialRevision: ColumnKey<Credential>;\n readonly status: ColumnKey<Credential>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly d1ActiveStatusValue?: unknown;\n readonly encodeVerifiedInsert: (input: {\n readonly moduleId: string;\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly identifier: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Credential[\"insert\"];\n}\n\nexport interface EmailRegistrationAuthorityCredentialTable<\n Credential extends Table,\n NativeSubjectId,\n> {\n readonly table: Credential[\"table\"];\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly revision: ColumnKey<Credential>;\n readonly status: ColumnKey<Credential>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly d1ActiveStatusValue?: unknown;\n readonly encodeInsert: (input: {\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly revision: SecurityRevision;\n }) => Credential[\"insert\"];\n}\n\nexport interface RequiredEmailRegistrationConstraints extends RequiredEmailSignInConstraints {\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n readonly request: \"unique(emailRegistration.moduleId,emailRegistration.commandId)\";\n readonly pendingReference: \"unique(emailRegistration.pendingReference)\";\n}\n\nexport const requiredEmailRegistrationConstraints: RequiredEmailRegistrationConstraints = {\n ...requiredEmailSignInConstraints,\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n request: \"unique(emailRegistration.moduleId,emailRegistration.commandId)\",\n pendingReference: \"unique(emailRegistration.pendingReference)\",\n};\n\ntype EmailRegistrationBase<Registration, Request extends Table, NativeSubjectId> = {\n readonly registration: EmailRegistrationTable<Registration, Request, NativeSubjectId>;\n readonly constraints: Pick<RequiredEmailRegistrationConstraints, \"request\" | \"pendingReference\">;\n readonly inspect: (input: {\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n }) => Effect.Effect<\n {\n readonly fingerprint: TokenDigest;\n readonly eligible: boolean;\n },\n PersistenceMappingError\n >;\n /** Projects one detached value of the factory-specific Registration Type. */\n readonly snapshotRegistration: (\n registration: Registration,\n ) => Effect.Effect<Registration, PersistenceMappingError>;\n /** Required by synchronous transaction-bound services. */\n readonly snapshotRegistrationSync?: (registration: Registration) => Registration;\n /** Required by synchronous Durable Object transaction-bound services. */\n readonly inspectSync?: (input: {\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n }) => {\n readonly fingerprint: TokenDigest;\n readonly eligible: boolean;\n };\n readonly allocatePendingReference?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocatePendingReferenceSync?: () => string;\n readonly encodeInstant: (epochMillis: number) => unknown;\n readonly retentionMillis: number;\n readonly isRequestConflict: (cause: unknown) => boolean;\n};\n\nexport type EmailRegistrationMapping<\n Registration,\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n Request extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> = EmailRegistrationBase<Registration, Request, NativeSubjectId> &\n (\n | {\n readonly mode: \"atomic\";\n readonly subject: EmailSubjectReadTable<Subject>;\n readonly identifier: EmailRegistrationIdentifierTable<\n Identifier,\n NativeSubjectId,\n Expression\n >;\n readonly credential: EmailRegistrationCredentialTable<Credential, NativeSubjectId>;\n readonly authorityCredential: EmailRegistrationAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n >;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredEmailRegistrationConstraints;\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n readonly isIdentifierConflict: (cause: unknown) => boolean;\n readonly isCredentialConflict: (cause: unknown) => boolean;\n readonly provisioning: EmailRegistrationProvisioning<\n Registration,\n Subject,\n NativeSubjectId\n > &\n (\n | {\n readonly idMode: \"allocated\";\n readonly allocateSubjectId: Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n }\n | {\n readonly idMode: \"synchronous\";\n readonly allocateSubjectIdSync: () => NativeSubjectId;\n }\n | {\n readonly idMode: \"generated\";\n readonly decodeGeneratedId: (\n rows: ReadonlyArray<unknown>,\n ) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n }\n );\n }\n | {\n readonly mode: \"pending\";\n }\n );\n\nexport type AnyEmailSignInMapping = EmailSignInMapping<\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown\n>;\n\nexport type AnyEmailAddressMapping<Expression extends SqlExpression = SqlExpression> =\n EmailAddressMapping<\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n >;\n\nexport type AnyEmailRegistrationMapping<\n Registration = unknown,\n Expression extends SqlExpression = SqlExpression,\n> = EmailRegistrationMapping<\n Registration,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n>;\n\nexport type D1EmailRegistrationMapping<\n Registration,\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n Request extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> = EmailRegistrationMapping<\n Registration,\n Subject,\n Identifier,\n Credential,\n AuthorityCredential,\n Request,\n NativeSubjectId,\n Expression\n> & {\n readonly d1: EmailD1Clock<Expression>;\n};\n"],"mappings":";AAqKA,MAAa,iCAAiE;CAC5E,YAAY;CACZ,cAAc;CACd,sBACE;AACJ;AAqBA,MAAa,kCAAmE;CAC9E,GAAG;CACH,qBAAqB;CACrB,SAAS;AACX;AAuNA,MAAa,uCAA6E;CACxF,GAAG;CACH,qBAAqB;CACrB,SAAS;CACT,kBAAkB;AACpB"}
1
+ {"version":3,"file":"email-model.mjs","names":[],"sources":["../../../src/internal/models/email-model.ts"],"sourcesContent":["import type { EmailAction } from \"@yielded/auth/Email\";\nimport type { LoginIdentifier } from \"@yielded/auth/Identity\";\nimport type { ProofRedemptionInput } from \"@yielded/auth/Proofs\";\nimport type { TokenDigest } from \"@yielded/auth/Schema\";\nimport type { AuthenticationRequirement, SecurityRevision } from \"@yielded/auth/Sessions\";\nimport type { Effect } from \"effect\";\n\nimport type { AnyTableModel, TableModel as Table, SqlExpression } from \"../table-model\";\nimport type { PersistenceMappingError, SubjectIdCodec } from \"./common\";\nimport type { ProofClock } from \"./proof-model\";\n\ntype ColumnKey<T extends Table> = T[\"column\"];\n\nexport interface EmailSubjectReadTable<Subject extends Table> {\n readonly table: Subject[\"table\"];\n readonly id: ColumnKey<Subject>;\n readonly status: ColumnKey<Subject>;\n readonly securityRevision: ColumnKey<Subject>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeStatusValue: unknown;\n readonly decodeRequirement: (\n row: Subject[\"select\"],\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n}\n\nexport interface EmailSubjectTable<Subject extends Table> extends EmailSubjectReadTable<Subject> {\n readonly decodeActionRequirement: (\n row: Subject[\"select\"],\n action: EmailAction,\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n readonly nextSecurityRevision?: (\n current: SecurityRevision,\n ) => Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly nextSecurityRevisionSync?: (current: SecurityRevision) => SecurityRevision;\n readonly activeStatusValue: unknown;\n}\n\nexport interface EmailIdentifierReadTable<Identifier extends Table> {\n readonly table: Identifier[\"table\"];\n readonly namespace: ColumnKey<Identifier>;\n readonly value: ColumnKey<Identifier>;\n readonly subjectId: ColumnKey<Identifier>;\n readonly verifiedAt: ColumnKey<Identifier>;\n readonly bindingRevision: ColumnKey<Identifier>;\n readonly isCurrent: (row: Identifier[\"select\"]) => boolean;\n}\n\nexport interface EmailIdentifierTable<\n Identifier extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> extends EmailIdentifierReadTable<Identifier> {\n /** True only for an active, unverified binding. Confirming it preserves existing sessions. */\n readonly isMutableTarget: (row: Identifier[\"select\"]) => boolean;\n readonly encodeVerifiedInsert: (input: {\n readonly identifier: LoginIdentifier;\n readonly subjectId: NativeSubjectId;\n readonly verifiedAtMillis: number;\n readonly bindingRevision: SecurityRevision;\n }) => Identifier[\"insert\"];\n readonly encodeVerification: (input: {\n readonly verifiedAtMillis: number;\n readonly bindingRevision: SecurityRevision;\n }) => Partial<Identifier[\"insert\"]>;\n /** Must make the selected source unavailable to sign-in. */\n readonly encodeRetirement: (input: {\n readonly source: LoginIdentifier;\n readonly bindingRevision: SecurityRevision;\n }) => Partial<Identifier[\"insert\"]>;\n readonly d1CurrentCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n readonly bindingRevision: SecurityRevision;\n }) => Expression;\n readonly d1MutableTargetCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n }) => Expression;\n}\n\nexport interface EmailCredentialReadTable<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n _NativeSubjectId,\n> {\n readonly table: Credential[\"table\"];\n readonly moduleId: ColumnKey<Credential>;\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly identifierNamespace: ColumnKey<Credential>;\n readonly identifierValue: ColumnKey<Credential>;\n readonly credentialRevision: ColumnKey<Credential>;\n readonly status: ColumnKey<Credential>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeStatusValue: unknown;\n readonly decode: (input: {\n readonly moduleId: string;\n readonly subject: Subject[\"select\"];\n readonly identifier: Identifier[\"select\"];\n readonly credential: Credential[\"select\"];\n }) => Effect.Effect<\n Omit<import(\"@yielded/auth/Email\").EmailCredentialSnapshot, \"requirement\">,\n PersistenceMappingError\n >;\n}\n\nexport interface EmailCredentialTable<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n NativeSubjectId,\n> extends EmailCredentialReadTable<Subject, Identifier, Credential, NativeSubjectId> {\n readonly encodeVerifiedInsert: (input: {\n readonly moduleId: string;\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly identifier: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Credential[\"insert\"];\n readonly encodeActivation: (input: {\n readonly identifier: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Partial<Credential[\"insert\"]>;\n readonly encodeRetirement: (input: {\n readonly source: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Partial<Credential[\"insert\"]>;\n readonly activeStatusValue: unknown;\n}\n\nexport interface EmailAuthorityCredentialTable<Credential extends Table, NativeSubjectId> {\n readonly table: Credential[\"table\"];\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly revision: ColumnKey<Credential>;\n readonly status: ColumnKey<Credential>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly encodeInsert: (input: {\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly revision: SecurityRevision;\n }) => Credential[\"insert\"];\n readonly encodeActivation: (revision: SecurityRevision) => Partial<Credential[\"insert\"]>;\n readonly encodeRetirement: (revision: SecurityRevision) => Partial<Credential[\"insert\"]>;\n readonly activeStatusValue: unknown;\n}\n\nexport interface RequiredEmailSignInConstraints {\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n readonly identifier: \"unique(identifier.namespace,identifier.value)\";\n readonly credentialId: \"unique(emailCredential.moduleId,emailCredential.credentialId)\";\n readonly credentialIdentifier: \"unique(emailCredential.moduleId,emailCredential.identifierNamespace,emailCredential.identifierValue)\";\n}\n\nexport const requiredEmailSignInConstraints: RequiredEmailSignInConstraints = {\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n identifier: \"unique(identifier.namespace,identifier.value)\",\n credentialId: \"unique(emailCredential.moduleId,emailCredential.credentialId)\",\n credentialIdentifier:\n \"unique(emailCredential.moduleId,emailCredential.identifierNamespace,emailCredential.identifierValue)\",\n};\n\nexport interface EmailSignInMapping<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n NativeSubjectId,\n> {\n readonly subject: EmailSubjectReadTable<Subject>;\n readonly identifier: EmailIdentifierReadTable<Identifier>;\n readonly credential: EmailCredentialReadTable<Subject, Identifier, Credential, NativeSubjectId>;\n readonly authorityCredential: EmailAuthorityCredentialTable<AuthorityCredential, NativeSubjectId>;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredEmailSignInConstraints;\n readonly decodeInstant: (native: unknown) => Effect.Effect<number, PersistenceMappingError>;\n}\n\nexport interface RequiredEmailAddressConstraints extends RequiredEmailSignInConstraints {\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n}\n\nexport const requiredEmailAddressConstraints: RequiredEmailAddressConstraints = {\n ...requiredEmailSignInConstraints,\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n};\n\nexport interface EmailAddressMapping<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> extends EmailSignInMapping<\n Subject,\n Identifier,\n Credential,\n AuthorityCredential,\n NativeSubjectId\n> {\n readonly subject: EmailSubjectTable<Subject>;\n readonly identifier: EmailIdentifierTable<Identifier, NativeSubjectId, Expression>;\n readonly credential: EmailCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;\n readonly authorityCredential: EmailAuthorityCredentialTable<AuthorityCredential, NativeSubjectId>;\n readonly constraints: RequiredEmailAddressConstraints;\n readonly addressCardinality: \"single\" | \"multiple\";\n readonly changeDisposition: \"retire-source\";\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n readonly encodeInstant: (epochMillis: number) => unknown;\n readonly sessionInvalidation: \"same-authority-immediate\" | \"original-absolute-expiry\";\n readonly isIdentifierConflict: (cause: unknown) => boolean;\n readonly isCredentialConflict: (cause: unknown) => boolean;\n readonly clock: ProofClock<Expression>;\n readonly d1?: { readonly primary: true };\n}\n\nexport interface EmailRegistrationIntent<Registration> {\n readonly moduleId: string;\n readonly commandId: string;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly requestId: string;\n readonly fingerprint: TokenDigest;\n readonly redemption: ProofRedemptionInput;\n}\n\nexport interface EmailRegistrationProvisioning<\n Registration,\n Subject extends Table,\n NativeSubjectId,\n> {\n readonly encodeSubjectInsert: (\n input: EmailRegistrationIntent<Registration>,\n values: {\n readonly nativeSubjectId: NativeSubjectId | undefined;\n readonly securityRevision: SecurityRevision;\n },\n ) => Subject[\"insert\"];\n readonly allocateSubjectId?: Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n readonly allocateSubjectIdSync?: () => NativeSubjectId;\n readonly decodeGeneratedId?: (\n rows: ReadonlyArray<unknown>,\n ) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n}\n\nexport interface EmailRegistrationIdentifierTable<\n Identifier extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: Identifier[\"table\"];\n readonly namespace: ColumnKey<Identifier>;\n readonly value: ColumnKey<Identifier>;\n /** Atomic mailbox registration may reassign an unverified binding in place.\n * Only subjectId, verifiedAt and bindingRevision change; the supplied proof\n * authority must admit only absent or active-unverified registration targets.\n * Its prior subject's mapped securityRevision advances in the same commit. */\n readonly subjectId: ColumnKey<Identifier>;\n readonly verifiedAt: ColumnKey<Identifier>;\n readonly bindingRevision: ColumnKey<Identifier>;\n readonly isCurrent: (row: Identifier[\"select\"]) => boolean;\n readonly isMutableTarget: (row: Identifier[\"select\"]) => boolean;\n readonly d1MutableTargetCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n }) => Expression;\n readonly d1CurrentCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n readonly bindingRevision: SecurityRevision;\n }) => Expression;\n readonly encodeVerifiedInsert: (input: {\n readonly identifier: LoginIdentifier;\n readonly subjectId: NativeSubjectId;\n readonly verifiedAtMillis: number;\n readonly bindingRevision: SecurityRevision;\n }) => Identifier[\"insert\"];\n}\n\nexport interface EmailRegistrationCredentialTable<Credential extends Table, NativeSubjectId> {\n readonly table: Credential[\"table\"];\n readonly moduleId: ColumnKey<Credential>;\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly identifierNamespace: ColumnKey<Credential>;\n readonly identifierValue: ColumnKey<Credential>;\n readonly credentialRevision: ColumnKey<Credential>;\n readonly status: ColumnKey<Credential>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeStatusValue: unknown;\n readonly encodeVerifiedInsert: (input: {\n readonly moduleId: string;\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly identifier: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Credential[\"insert\"];\n}\n\nexport interface EmailRegistrationAuthorityCredentialTable<\n Credential extends Table,\n NativeSubjectId,\n> {\n readonly table: Credential[\"table\"];\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly revision: ColumnKey<Credential>;\n readonly status: ColumnKey<Credential>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeStatusValue: unknown;\n readonly encodeInsert: (input: {\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly revision: SecurityRevision;\n }) => Credential[\"insert\"];\n}\n\nexport interface RequiredEmailRegistrationConstraints extends RequiredEmailSignInConstraints {\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n}\n\nexport const requiredEmailRegistrationConstraints: RequiredEmailRegistrationConstraints = {\n ...requiredEmailSignInConstraints,\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n};\n\ntype EmailRegistrationBase<Registration> = {\n readonly inspect: (input: {\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n }) => Effect.Effect<\n { readonly eligible: boolean; readonly fingerprint: TokenDigest },\n PersistenceMappingError\n >;\n readonly snapshotRegistration: (\n registration: Registration,\n ) => Effect.Effect<Registration, PersistenceMappingError>;\n readonly snapshotRegistrationSync?: (registration: Registration) => Registration;\n readonly inspectSync?: (input: {\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n }) => { readonly eligible: boolean; readonly fingerprint: TokenDigest };\n};\n\nexport type EmailRegistrationMapping<\n Registration,\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> = EmailRegistrationBase<Registration> & {\n readonly mode: \"atomic\";\n readonly clock: ProofClock<Expression>;\n readonly d1?: { readonly primary: true };\n readonly subject: EmailSubjectReadTable<Subject>;\n readonly identifier: EmailRegistrationIdentifierTable<Identifier, NativeSubjectId, Expression>;\n readonly credential: EmailRegistrationCredentialTable<Credential, NativeSubjectId>;\n readonly authorityCredential: EmailRegistrationAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n >;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredEmailRegistrationConstraints;\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n readonly isIdentifierConflict: (cause: unknown) => boolean;\n readonly isCredentialConflict: (cause: unknown) => boolean;\n readonly provisioning: EmailRegistrationProvisioning<Registration, Subject, NativeSubjectId> &\n (\n | {\n readonly idMode: \"allocated\";\n readonly allocateSubjectId: Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n }\n | {\n readonly idMode: \"synchronous\";\n readonly allocateSubjectIdSync: () => NativeSubjectId;\n }\n | {\n readonly idMode: \"generated\";\n readonly decodeGeneratedId: (\n rows: ReadonlyArray<unknown>,\n ) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n }\n );\n};\n\nexport type AnyEmailSignInMapping = EmailSignInMapping<\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown\n>;\n\nexport type AnyEmailAddressMapping<Expression extends SqlExpression = SqlExpression> =\n EmailAddressMapping<\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n >;\n\nexport type AnyEmailRegistrationMapping<\n Registration = unknown,\n Expression extends SqlExpression = SqlExpression,\n> = EmailRegistrationMapping<\n Registration,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n>;\n"],"mappings":";AA2JA,MAAa,iCAAiE;CAC5E,qBAAqB;CACrB,YAAY;CACZ,cAAc;CACd,sBACE;AACJ;AAsBA,MAAa,kCAAmE;CAC9E,GAAG;CACH,qBAAqB;AACvB;AA4IA,MAAa,uCAA6E;CACxF,GAAG;CACH,qBAAqB;AACvB"}
@@ -1,166 +1,50 @@
1
- import { SqlExpression, TableModel } from "../query-operations.mjs";
1
+ import { SqlExpression, TableModel } from "../table-model.mjs";
2
2
  import { SubjectIdCodec } from "./common.mjs";
3
- import { OAuthAuthorityReadTable, OAuthClock, OAuthCredentialReadTable, OAuthFlowTable, OAuthOwnershipMutation, OAuthSubjectReadTable, requiredOAuthTupleConstraints } from "./oauth-model.mjs";
4
- import { AuthenticationRequirement } from "@yielded/auth/Sessions";
3
+ import { OAuthAuthorityReadTable, OAuthClock, OAuthCredentialReadTable, OAuthFlowTable, OAuthOwnershipReadTable, OAuthOwnershipTable, OAuthSubjectReadTable } from "./oauth-model.mjs";
5
4
  import * as M from "@yielded/auth/OAuth";
6
- import { OAuthAccountRevision } from "@yielded/auth/OAuth";
7
5
  declare namespace oauth_connected_model_d_exports {
8
- export { OAuthConnectedAction, OAuthConnectedAdmissionTable, OAuthConnectedAuthorityMapping, OAuthConnectedClientRegistrationTable, OAuthConnectedCohortTable, OAuthConnectedCommandTable, OAuthConnectedFlowTable, OAuthConnectedGrantTable, OAuthConnectedMapping, OAuthConnectedOrderCodec, OAuthConnectedOwnershipRead, OAuthConnectedPolicyGuard, OAuthConnectedPolicyGuardTable, OAuthConnectedPolicyInput, OAuthConnectedRevocationJobTable, OAuthConnectedRevocationMapping, OAuthConnectedSqlPolicy, OAuthConnectedSubjectTable, oauthConnectedPolicyGuard, requiredOAuthConnectedConstraints, requiredOAuthConnectedRevocationConstraints };
6
+ export { OAuthConnectedAction, OAuthConnectedGrantTable, OAuthConnectedMapping, OAuthConnectedPolicyInput, OAuthConnectedRevocationJobTable, OAuthConnectedRevocationMapping, OAuthConnectedSqlPolicy, requiredOAuthConnectedConstraints, requiredOAuthConnectedRevocationConstraints };
9
7
  }
10
8
  type Column<T extends TableModel> = T["column"];
11
9
  export type OAuthConnectedAction = M.OAuthConnectedActionChallenge["action"];
12
- export interface OAuthConnectedSubjectTable<S extends TableModel, Expression extends SqlExpression = SqlExpression> extends OAuthSubjectReadTable<S, Expression> {
13
- readonly decodeActionRequirement: (row: S["select"], action: OAuthConnectedAction) => AuthenticationRequirement;
14
- }
15
- /** All mapped order columns use exact SQL integer comparison through 2^53-1.
16
- * These codecs bridge driver representations, not alternative ordering rules. */
17
- export interface OAuthConnectedOrderCodec {
18
- readonly encode: (order: number) => unknown;
19
- readonly decode: (value: unknown) => number;
20
- }
21
- export interface OAuthConnectedFlowTable<F extends TableModel, N> {
22
- readonly table: F["table"];
23
- readonly moduleId: Column<F>;
24
- readonly flowId: Column<F>;
25
- readonly commandId: Column<F>;
26
- readonly subjectId: Column<F>;
27
- readonly clientKey: Column<F>;
28
- readonly cohortKey: Column<F>;
29
- readonly state: Column<F>;
30
- readonly version: Column<F>;
31
- readonly stateDigest: Column<F>;
32
- readonly snapshot: Column<F>;
33
- readonly claimId: Column<F>;
34
- readonly claimDigest: Column<F>;
35
- readonly claimOrder: Column<F>;
36
- readonly claimedAt: Column<F>;
37
- readonly claimExpiresAt: Column<F>;
38
- readonly expiresAt: Column<F>;
39
- readonly retentionUntil: Column<F>;
40
- /** None before claim, Unresolved after claim, Resolved only after definite
41
- * cancellation or atomic transfer to a grant/job. Never reset by cleanup. */
42
- readonly work: Column<F>;
43
- /** Exact sealed quarantine when no correctly sealed revocation job is available. */
44
- readonly custody: Column<F>;
45
- /** Required when retaining grants during sign-in. subjectId is NULL until
46
- * identity resolution; custom required columns are supplied by this encoder. */
47
- readonly encodeSignIn?: (reservation: M.OAuthSignInAccessClaim) => F["insert"];
48
- readonly encodeInsert: (input: {
49
- readonly flow: M.OAuthConnectedPendingFlow;
50
- readonly subjectId: N;
51
- }) => F["insert"];
52
- }
10
+ /** Immutable sealed data plus the exact refresh compare-and-set fields. */
53
11
  export interface OAuthConnectedGrantTable<G extends TableModel, N> {
54
12
  readonly table: G["table"];
55
13
  readonly moduleId: Column<G>;
56
14
  readonly grantId: Column<G>;
57
15
  readonly subjectId: Column<G>;
58
16
  readonly identityKey: Column<G>;
59
- /** Nullable unique active slot; historical/disconnected records use null. */
60
- readonly activeIdentityKey: Column<G>;
61
- readonly clientKey: Column<G>;
62
- readonly cohortKey: Column<G>;
63
17
  readonly profileKey: Column<G>;
64
18
  readonly grantVersion: Column<G>;
65
19
  readonly tokenVersion: Column<G>;
66
- readonly cohortGeneration: Column<G>;
67
20
  readonly state: Column<G>;
68
- readonly version: Column<G>;
69
- readonly context: Column<G>;
70
- readonly sealed: Column<G>;
71
- /** Canonical OAuthConnectedSummary only: list never loads token envelopes. */
21
+ readonly snapshot: Column<G>;
22
+ /** Listing selects this bounded projection, never encrypted token material. */
72
23
  readonly summary: Column<G>;
73
- readonly revocationJobId: Column<G>;
74
- readonly refreshWork: Column<G>;
75
- readonly refreshClaim: Column<G>;
24
+ readonly refreshClaimId: Column<G>;
25
+ readonly refreshNextTokenVersion: Column<G>;
26
+ readonly refreshClaimedAt: Column<G>;
76
27
  readonly refreshClaimExpiresAt: Column<G>;
77
- readonly retentionUntil: Column<G>;
28
+ readonly expiresAt: Column<G>;
78
29
  readonly encodeInsert: (input: {
79
30
  readonly grant: M.OAuthConnectedStoredGrant;
80
31
  readonly subjectId: N;
81
32
  }) => G["insert"];
82
33
  }
83
- /** Also stores a permanent provider/issuer scope anchor. clientKey must fit 52
84
- * ASCII characters. Empty clientRegistrationId is reserved for that anchor;
85
- * actual profile registrations are nonempty. Scope counter stays zero. */
86
- export interface OAuthConnectedClientRegistrationTable<C extends TableModel> {
87
- readonly table: C["table"];
88
- readonly clientKey: Column<C>;
89
- readonly provider: Column<C>;
90
- readonly issuer: Column<C>;
91
- readonly clientRegistrationId: Column<C>;
92
- readonly counter: Column<C>;
93
- readonly version: Column<C>;
94
- readonly encodeInsert: (configuration: M.OAuthConnectedConfiguration) => C["insert"];
95
- }
96
- /** Remote authority: no local-subject column or subject-scoped key. Retain this
97
- * anchor/cutoff when a legitimately released tuple gains a different local owner. */
98
- export interface OAuthConnectedCohortTable<C extends TableModel> {
99
- readonly table: C["table"];
100
- readonly cohortKey: Column<C>;
101
- readonly clientKey: Column<C>;
102
- readonly identityKey: Column<C>;
103
- readonly generation: Column<C>;
104
- readonly cutoff: Column<C>;
105
- readonly state: Column<C>;
106
- readonly version: Column<C>;
107
- readonly encodeInsert: (input: {
108
- readonly clientKey: string;
109
- readonly identityKey: string;
110
- }) => C["insert"];
111
- }
112
- export interface OAuthConnectedAdmissionTable<A extends TableModel, N> {
113
- readonly table: A["table"];
114
- readonly admissionId: Column<A>;
115
- readonly moduleId: Column<A>;
116
- readonly grantId: Column<A>;
117
- readonly subjectId: Column<A>;
118
- readonly identityKey: Column<A>;
119
- readonly clientKey: Column<A>;
120
- readonly cohortKey: Column<A>;
121
- readonly snapshot: Column<A>;
122
- readonly admittedAt: Column<A>;
123
- readonly expiresAt: Column<A>;
124
- readonly version: Column<A>;
125
- readonly encodeInsert: (input: {
126
- readonly admissionId: string;
127
- readonly grant: M.OAuthConnectedStoredGrant;
128
- readonly authorization: M.OAuthConnectedUseAuthorization;
129
- readonly subjectId: N;
130
- }) => A["insert"];
131
- }
132
- export interface OAuthConnectedCommandTable<C extends TableModel, N> {
133
- readonly table: C["table"];
134
- readonly moduleId: Column<C>;
135
- readonly commandId: Column<C>;
136
- readonly subjectId: Column<C>;
137
- readonly grantId: Column<C>;
138
- readonly intent: Column<C>;
139
- readonly decision: Column<C>;
140
- readonly retentionUntil: Column<C>;
141
- readonly version: Column<C>;
142
- readonly encodeInsert: (input: {
143
- readonly commandId: string;
144
- readonly grant: M.OAuthConnectedDisconnectGrant;
145
- readonly subjectId: N;
146
- }) => C["insert"];
147
- }
34
+ /** Optional provider revocation retains the exact removed grant ciphertext. A
35
+ * possibly spent claim is never reset to Pending or reclaimed after timeout. */
148
36
  export interface OAuthConnectedRevocationJobTable<J extends TableModel, N> {
149
37
  readonly table: J["table"];
150
38
  readonly jobId: Column<J>;
151
39
  readonly moduleId: Column<J>;
152
40
  readonly subjectId: Column<J>;
153
41
  readonly identityKey: Column<J>;
154
- readonly clientKey: Column<J>;
155
- readonly cohortKey: Column<J>;
156
- readonly grantId: Column<J>;
157
42
  readonly snapshot: Column<J>;
158
43
  readonly state: Column<J>;
159
44
  readonly claimId: Column<J>;
160
45
  readonly claimedAt: Column<J>;
161
46
  readonly claimExpiresAt: Column<J>;
162
47
  readonly retentionUntil: Column<J>;
163
- readonly version: Column<J>;
164
48
  readonly encodeInsert: (input: {
165
49
  readonly job: M.OAuthConnectedRevocationJob;
166
50
  readonly subjectId: N;
@@ -168,125 +52,72 @@ export interface OAuthConnectedRevocationJobTable<J extends TableModel, N> {
168
52
  }
169
53
  export type OAuthConnectedPolicyInput<N> = {
170
54
  readonly subjectId: N;
171
- readonly revision: OAuthAccountRevision;
55
+ readonly revision: M.OAuthAccountRevision;
172
56
  } & ({
173
57
  readonly kind: "action";
174
- readonly operation: "issue" | "claim" | "settle" | "disconnect";
58
+ readonly operation: "settle" | "disconnect";
175
59
  readonly authorization: M.OAuthConnectedActionAuthorization;
176
- readonly configuration: M.OAuthConnectedConfiguration;
177
60
  readonly grant?: M.OAuthConnectedTokenContext;
178
61
  } | {
179
62
  readonly kind: "sign-in";
180
63
  readonly credential: M.OAuthCredentialSnapshot;
181
- readonly configuration: M.OAuthConnectedConfiguration;
182
- readonly grant?: M.OAuthConnectedTokenContext;
64
+ readonly grant: M.OAuthConnectedTokenContext;
183
65
  } | {
184
66
  readonly kind: "metadata" | "use";
185
67
  readonly authorization: M.OAuthConnectedUseAuthorization;
186
68
  readonly grant?: M.OAuthConnectedTokenContext;
187
69
  });
188
- export interface OAuthConnectedPolicyGuardTable<T extends TableModel, N, Expression extends SqlExpression = SqlExpression> {
189
- readonly table: T["table"];
190
- readonly orderBy: Column<T>;
191
- readonly condition: (input: OAuthConnectedPolicyInput<N>) => Expression;
192
- }
193
- export interface OAuthConnectedPolicyGuard<N, Expression extends SqlExpression = SqlExpression, Descriptor extends object = object> {
194
- readonly table: Descriptor;
195
- readonly orderBy: string;
196
- readonly condition: (input: OAuthConnectedPolicyInput<N>) => Expression;
197
- }
198
- export declare const oauthConnectedPolicyGuard: <T extends TableModel, N, Expression extends SqlExpression = SqlExpression>(input: OAuthConnectedPolicyGuardTable<T, N, Expression>) => OAuthConnectedPolicyGuard<N, Expression, T["table"]>;
199
- export interface OAuthConnectedSqlPolicy<N, Expression extends SqlExpression = SqlExpression, Descriptor extends object = object> {
200
- /** Up to 32 scopes, each selecting 1..64 stable rows in global lock order.
201
- * Omit only when subject/shared authority locks already serialize every mutable
202
- * policy dependency or policy is immutable. All writers follow that order. */
203
- readonly guards?: ReadonlyArray<OAuthConnectedPolicyGuard<N, Expression, Descriptor>>;
204
- /** Recheck exact policy revision, purpose, optional grant/profile restrictions
205
- * and current profile/permissions; joins and absence assumptions are authority.
206
- * The engine checks this before and after every owner/application write. */
70
+ /** Changes to mutable policy advance the same subject security revision. This
71
+ * predicate participates in the guarded write and final application postcondition. */
72
+ export interface OAuthConnectedSqlPolicy<N, Expression extends SqlExpression = SqlExpression> {
207
73
  readonly condition: (input: OAuthConnectedPolicyInput<N>) => Expression;
208
74
  }
209
75
  export declare const requiredOAuthConnectedConstraints: {
210
- readonly flow: "unique(connectedFlow.moduleId,connectedFlow.flowId)";
211
- readonly flowCommand: "unique(connectedFlow.moduleId,connectedFlow.commandId)";
212
- readonly stateDigest: "unique(connectedFlow.stateDigest)";
213
- readonly client: "unique(connectedClient.clientKey)";
214
- readonly cohort: "unique(connectedCohort.cohortKey)";
76
+ readonly flow: "unique(flow.moduleId,flow.flowId)";
77
+ readonly stateDigest: "unique(flow.stateDigest)";
78
+ readonly ownership: "unique(ownership.identityKey)";
215
79
  readonly grant: "unique(connectedGrant.moduleId,connectedGrant.grantId)";
216
- readonly grantIdentity: "unique(connectedGrant.moduleId,connectedGrant.subjectId,connectedGrant.profileKey,connectedGrant.activeIdentityKey)";
217
- readonly admission: "unique(connectedAdmission.admissionId)";
218
- readonly command: "unique(connectedCommand.moduleId,connectedCommand.commandId)";
80
+ readonly activeIdentity: "unique(connectedGrant.moduleId,connectedGrant.subjectId,connectedGrant.profileKey,connectedGrant.identityKey)";
81
+ readonly authorityCredential: "unique(authority.subjectId,authority.credentialId)";
219
82
  };
220
83
  export declare const requiredOAuthConnectedRevocationConstraints: {
221
84
  readonly job: "unique(connectedRevocation.jobId)";
222
85
  };
223
- /** Existing ownership only; workers never allocate or acquire a tuple. */
224
- export type OAuthConnectedOwnershipRead<T extends TableModel, O extends TableModel, N, Expression extends SqlExpression = SqlExpression> = {
225
- readonly mode: "integrated";
226
- readonly tuple: Omit<OAuthOwnershipMutation<T, O, N, Expression>["tuple"], "encodeInsert">;
227
- } | {
228
- readonly mode: "separate";
229
- readonly tuple: Omit<OAuthOwnershipMutation<T, O, N, Expression>["tuple"], "encodeInsert">;
230
- readonly external: Omit<Extract<OAuthOwnershipMutation<T, O, N, Expression>, {
231
- readonly mode: "separate";
232
- }>["external"], "encodeInsert">;
233
- };
234
- export interface OAuthConnectedAuthorityMapping<T extends TableModel, O extends TableModel, F extends TableModel, G extends TableModel, C extends TableModel, H extends TableModel, N, Expression extends SqlExpression = SqlExpression> {
235
- readonly ownership: OAuthConnectedOwnershipRead<T, O, N, Expression>;
86
+ export interface OAuthConnectedMapping<S extends TableModel, AC extends TableModel, O extends TableModel, F extends TableModel, G extends TableModel, N, J extends TableModel = TableModel, Expression extends SqlExpression = SqlExpression, SignIn extends TableModel = TableModel> {
87
+ readonly ownership: OAuthOwnershipTable<O, N>;
88
+ readonly subject: OAuthSubjectReadTable<S, Expression>;
89
+ readonly authority: OAuthAuthorityReadTable<AC, Expression>;
236
90
  readonly subjectId: SubjectIdCodec<N>;
237
- readonly flow: Omit<OAuthConnectedFlowTable<F, N>, "encodeInsert">;
238
- readonly grant: Omit<OAuthConnectedGrantTable<G, N>, "encodeInsert">;
239
- readonly client: Omit<OAuthConnectedClientRegistrationTable<C>, "encodeInsert">;
240
- readonly cohort: Omit<OAuthConnectedCohortTable<H>, "encodeInsert">;
241
- readonly clock: OAuthClock<Expression>;
242
- readonly order: OAuthConnectedOrderCodec;
243
- readonly tupleConstraints: typeof requiredOAuthTupleConstraints;
244
- /** Safe metadata retention, never an expiry/quiescence proof for unresolved work. */
245
- readonly retentionMillis: number;
246
- }
247
- export interface OAuthConnectedMapping<S extends TableModel, AC extends TableModel, T extends TableModel, O extends TableModel, F extends TableModel, G extends TableModel, C extends TableModel, H extends TableModel, A extends TableModel, D extends TableModel, N, J extends TableModel = never, Expression extends SqlExpression = SqlExpression, Descriptor extends object = object, SignIn extends TableModel = TableModel> extends OAuthConnectedAuthorityMapping<T, O, F, G, C, H, N, Expression> {
248
- readonly ownership: OAuthOwnershipMutation<T, O, N, Expression>;
249
- readonly flow: OAuthConnectedFlowTable<F, N>;
91
+ readonly flow: OAuthFlowTable<F>;
250
92
  readonly grant: OAuthConnectedGrantTable<G, N>;
251
- readonly client: OAuthConnectedClientRegistrationTable<C>;
252
- readonly cohort: OAuthConnectedCohortTable<H>;
253
- readonly subject: OAuthConnectedSubjectTable<S, Expression>;
254
- readonly authority: OAuthAuthorityReadTable<AC, Expression>;
255
- readonly admission: OAuthConnectedAdmissionTable<A, N>;
256
- /** Same shared sign-in tables used by OAuthSignInPersistence. Enable only
257
- * alongside a nullable connected-flow subjectId and flow.encodeSignIn. */
258
- readonly signIn?: {
259
- readonly credential: OAuthCredentialReadTable<SignIn, Expression>;
260
- readonly flow: OAuthFlowTable<SignIn>;
261
- };
262
- readonly command: OAuthConnectedCommandTable<D, N>;
263
- readonly policy: OAuthConnectedSqlPolicy<N, Expression, Descriptor>;
93
+ readonly credential?: OAuthCredentialReadTable<SignIn, Expression>;
94
+ readonly clock: OAuthClock<Expression>;
95
+ readonly policy: OAuthConnectedSqlPolicy<N, Expression>;
264
96
  readonly constraints: typeof requiredOAuthConnectedConstraints;
265
97
  readonly revocation: {
266
98
  readonly mode: "unsupported";
267
99
  } | {
268
- readonly mode: "cohort";
100
+ readonly mode: "provider";
269
101
  readonly job: OAuthConnectedRevocationJobTable<J, N>;
102
+ readonly retentionMillis: number;
270
103
  readonly constraints: typeof requiredOAuthConnectedRevocationConstraints;
271
104
  };
272
- /** Without an authoritative same-owner predicate, conservatively retain Owned.
273
- * Include login/other installed references; never filter away former-subject
274
- * work. This pure SQL constructor supports both bound values and correlated
275
- * column expressions with identical semantics; it performs no I/O.
276
- * Compare through the reference table's typed columns (for example, eq) so
277
- * native values use their encoders. Back the same-owner lookup with an index:
278
- * discovery applies this predicate before its candidate limit.
279
- * Connected references are checked separately. */
280
- readonly externalReference?: (input: {
105
+ /** Indexed same-owner predicate for installed references beyond these grants/jobs. */
106
+ readonly otherReferences: (input: {
281
107
  readonly identityKey: string;
282
108
  readonly subjectId: N;
283
- } | {
284
- readonly identityKey: Expression;
285
- readonly subjectId: Expression;
286
109
  }) => Expression;
287
110
  }
288
- export interface OAuthConnectedRevocationMapping<T extends TableModel, O extends TableModel, F extends TableModel, G extends TableModel, C extends TableModel, H extends TableModel, J extends TableModel, N, Expression extends SqlExpression = SqlExpression> extends OAuthConnectedAuthorityMapping<T, O, F, G, C, H, N, Expression> {
111
+ export interface OAuthConnectedRevocationMapping<O extends TableModel, G extends TableModel, J extends TableModel, N, Expression extends SqlExpression = SqlExpression> {
112
+ readonly ownership: OAuthOwnershipReadTable<O, N>;
113
+ readonly subjectId: SubjectIdCodec<N>;
114
+ readonly grant: Omit<OAuthConnectedGrantTable<G, N>, "encodeInsert">;
289
115
  readonly job: Omit<OAuthConnectedRevocationJobTable<J, N>, "encodeInsert">;
116
+ readonly clock: OAuthClock<Expression>;
117
+ readonly otherReferences: (input: {
118
+ readonly identityKey: string;
119
+ readonly subjectId: N;
120
+ }) => Expression;
290
121
  readonly constraints: typeof requiredOAuthConnectedRevocationConstraints;
291
122
  }
292
123
  //#endregion
@@ -1,22 +1,14 @@
1
1
  //#region src/internal/models/oauth-connected-model.ts
2
- const oauthConnectedPolicyGuard = (input) => Object.freeze({
3
- table: input.table,
4
- orderBy: input.orderBy,
5
- condition: input.condition
6
- });
7
2
  const requiredOAuthConnectedConstraints = {
8
- flow: "unique(connectedFlow.moduleId,connectedFlow.flowId)",
9
- flowCommand: "unique(connectedFlow.moduleId,connectedFlow.commandId)",
10
- stateDigest: "unique(connectedFlow.stateDigest)",
11
- client: "unique(connectedClient.clientKey)",
12
- cohort: "unique(connectedCohort.cohortKey)",
3
+ flow: "unique(flow.moduleId,flow.flowId)",
4
+ stateDigest: "unique(flow.stateDigest)",
5
+ ownership: "unique(ownership.identityKey)",
13
6
  grant: "unique(connectedGrant.moduleId,connectedGrant.grantId)",
14
- grantIdentity: "unique(connectedGrant.moduleId,connectedGrant.subjectId,connectedGrant.profileKey,connectedGrant.activeIdentityKey)",
15
- admission: "unique(connectedAdmission.admissionId)",
16
- command: "unique(connectedCommand.moduleId,connectedCommand.commandId)"
7
+ activeIdentity: "unique(connectedGrant.moduleId,connectedGrant.subjectId,connectedGrant.profileKey,connectedGrant.identityKey)",
8
+ authorityCredential: "unique(authority.subjectId,authority.credentialId)"
17
9
  };
18
10
  const requiredOAuthConnectedRevocationConstraints = { job: "unique(connectedRevocation.jobId)" };
19
11
  //#endregion
20
- export { oauthConnectedPolicyGuard, requiredOAuthConnectedConstraints, requiredOAuthConnectedRevocationConstraints };
12
+ export { requiredOAuthConnectedConstraints, requiredOAuthConnectedRevocationConstraints };
21
13
 
22
14
  //# sourceMappingURL=oauth-connected-model.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-connected-model.mjs","names":[],"sources":["../../../src/internal/models/oauth-connected-model.ts"],"sourcesContent":["import type { OAuthAccountRevision } from \"@yielded/auth/OAuth\";\nimport type * as M from \"@yielded/auth/OAuth\";\nimport type { AuthenticationRequirement } from \"@yielded/auth/Sessions\";\n\nimport type { TableModel as Table, SqlExpression } from \"../query-operations\";\nimport type { SubjectIdCodec } from \"./common\";\nimport type {\n OAuthAuthorityReadTable,\n OAuthClock,\n OAuthCredentialReadTable,\n OAuthFlowTable,\n OAuthOwnershipMutation,\n OAuthSubjectReadTable,\n requiredOAuthTupleConstraints,\n} from \"./oauth-model\";\n\ntype Column<T extends Table> = T[\"column\"];\nexport type OAuthConnectedAction = M.OAuthConnectedActionChallenge[\"action\"];\n\nexport interface OAuthConnectedSubjectTable<\n S extends Table,\n Expression extends SqlExpression = SqlExpression,\n> extends OAuthSubjectReadTable<S, Expression> {\n readonly decodeActionRequirement: (\n row: S[\"select\"],\n action: OAuthConnectedAction,\n ) => AuthenticationRequirement;\n}\n\n/** All mapped order columns use exact SQL integer comparison through 2^53-1.\n * These codecs bridge driver representations, not alternative ordering rules. */\nexport interface OAuthConnectedOrderCodec {\n readonly encode: (order: number) => unknown;\n readonly decode: (value: unknown) => number;\n}\n\nexport interface OAuthConnectedFlowTable<F extends Table, N> {\n readonly table: F[\"table\"];\n readonly moduleId: Column<F>;\n readonly flowId: Column<F>;\n readonly commandId: Column<F>;\n readonly subjectId: Column<F>;\n readonly clientKey: Column<F>;\n readonly cohortKey: Column<F>;\n readonly state: Column<F>;\n readonly version: Column<F>;\n readonly stateDigest: Column<F>;\n readonly snapshot: Column<F>;\n readonly claimId: Column<F>;\n readonly claimDigest: Column<F>;\n readonly claimOrder: Column<F>;\n readonly claimedAt: Column<F>;\n readonly claimExpiresAt: Column<F>;\n readonly expiresAt: Column<F>;\n readonly retentionUntil: Column<F>;\n /** None before claim, Unresolved after claim, Resolved only after definite\n * cancellation or atomic transfer to a grant/job. Never reset by cleanup. */\n readonly work: Column<F>;\n /** Exact sealed quarantine when no correctly sealed revocation job is available. */\n readonly custody: Column<F>;\n /** Required when retaining grants during sign-in. subjectId is NULL until\n * identity resolution; custom required columns are supplied by this encoder. */\n readonly encodeSignIn?: (reservation: M.OAuthSignInAccessClaim) => F[\"insert\"];\n readonly encodeInsert: (input: {\n readonly flow: M.OAuthConnectedPendingFlow;\n readonly subjectId: N;\n }) => F[\"insert\"];\n}\n\nexport interface OAuthConnectedGrantTable<G extends Table, N> {\n readonly table: G[\"table\"];\n readonly moduleId: Column<G>;\n readonly grantId: Column<G>;\n readonly subjectId: Column<G>;\n readonly identityKey: Column<G>;\n /** Nullable unique active slot; historical/disconnected records use null. */\n readonly activeIdentityKey: Column<G>;\n readonly clientKey: Column<G>;\n readonly cohortKey: Column<G>;\n readonly profileKey: Column<G>;\n readonly grantVersion: Column<G>;\n readonly tokenVersion: Column<G>;\n readonly cohortGeneration: Column<G>;\n readonly state: Column<G>;\n readonly version: Column<G>;\n readonly context: Column<G>;\n readonly sealed: Column<G>;\n /** Canonical OAuthConnectedSummary only: list never loads token envelopes. */\n readonly summary: Column<G>;\n readonly revocationJobId: Column<G>;\n readonly refreshWork: Column<G>;\n readonly refreshClaim: Column<G>;\n readonly refreshClaimExpiresAt: Column<G>;\n readonly retentionUntil: Column<G>;\n readonly encodeInsert: (input: {\n readonly grant: M.OAuthConnectedStoredGrant;\n readonly subjectId: N;\n }) => G[\"insert\"];\n}\n\n/** Also stores a permanent provider/issuer scope anchor. clientKey must fit 52\n * ASCII characters. Empty clientRegistrationId is reserved for that anchor;\n * actual profile registrations are nonempty. Scope counter stays zero. */\nexport interface OAuthConnectedClientRegistrationTable<C extends Table> {\n readonly table: C[\"table\"];\n readonly clientKey: Column<C>;\n readonly provider: Column<C>;\n readonly issuer: Column<C>;\n readonly clientRegistrationId: Column<C>;\n readonly counter: Column<C>;\n readonly version: Column<C>;\n readonly encodeInsert: (configuration: M.OAuthConnectedConfiguration) => C[\"insert\"];\n}\n\n/** Remote authority: no local-subject column or subject-scoped key. Retain this\n * anchor/cutoff when a legitimately released tuple gains a different local owner. */\nexport interface OAuthConnectedCohortTable<C extends Table> {\n readonly table: C[\"table\"];\n readonly cohortKey: Column<C>;\n readonly clientKey: Column<C>;\n readonly identityKey: Column<C>;\n readonly generation: Column<C>;\n readonly cutoff: Column<C>;\n readonly state: Column<C>;\n readonly version: Column<C>;\n readonly encodeInsert: (input: {\n readonly clientKey: string;\n readonly identityKey: string;\n }) => C[\"insert\"];\n}\n\nexport interface OAuthConnectedAdmissionTable<A extends Table, N> {\n readonly table: A[\"table\"];\n readonly admissionId: Column<A>;\n readonly moduleId: Column<A>;\n readonly grantId: Column<A>;\n readonly subjectId: Column<A>;\n readonly identityKey: Column<A>;\n readonly clientKey: Column<A>;\n readonly cohortKey: Column<A>;\n readonly snapshot: Column<A>;\n readonly admittedAt: Column<A>;\n readonly expiresAt: Column<A>;\n readonly version: Column<A>;\n readonly encodeInsert: (input: {\n readonly admissionId: string;\n readonly grant: M.OAuthConnectedStoredGrant;\n readonly authorization: M.OAuthConnectedUseAuthorization;\n readonly subjectId: N;\n }) => A[\"insert\"];\n}\n\nexport interface OAuthConnectedCommandTable<C extends Table, N> {\n readonly table: C[\"table\"];\n readonly moduleId: Column<C>;\n readonly commandId: Column<C>;\n readonly subjectId: Column<C>;\n readonly grantId: Column<C>;\n readonly intent: Column<C>;\n readonly decision: Column<C>;\n readonly retentionUntil: Column<C>;\n readonly version: Column<C>;\n readonly encodeInsert: (input: {\n readonly commandId: string;\n readonly grant: M.OAuthConnectedDisconnectGrant;\n readonly subjectId: N;\n }) => C[\"insert\"];\n}\n\nexport interface OAuthConnectedRevocationJobTable<J extends Table, N> {\n readonly table: J[\"table\"];\n readonly jobId: Column<J>;\n readonly moduleId: Column<J>;\n readonly subjectId: Column<J>;\n readonly identityKey: Column<J>;\n readonly clientKey: Column<J>;\n readonly cohortKey: Column<J>;\n readonly grantId: Column<J>;\n readonly snapshot: Column<J>;\n readonly state: Column<J>;\n readonly claimId: Column<J>;\n readonly claimedAt: Column<J>;\n readonly claimExpiresAt: Column<J>;\n readonly retentionUntil: Column<J>;\n readonly version: Column<J>;\n readonly encodeInsert: (input: {\n readonly job: M.OAuthConnectedRevocationJob;\n readonly subjectId: N;\n }) => J[\"insert\"];\n}\n\nexport type OAuthConnectedPolicyInput<N> = {\n readonly subjectId: N;\n readonly revision: OAuthAccountRevision;\n} & (\n | {\n readonly kind: \"action\";\n readonly operation: \"issue\" | \"claim\" | \"settle\" | \"disconnect\";\n readonly authorization: M.OAuthConnectedActionAuthorization;\n readonly configuration: M.OAuthConnectedConfiguration;\n readonly grant?: M.OAuthConnectedTokenContext;\n }\n | {\n readonly kind: \"sign-in\";\n readonly credential: M.OAuthCredentialSnapshot;\n readonly configuration: M.OAuthConnectedConfiguration;\n readonly grant?: M.OAuthConnectedTokenContext;\n }\n | {\n readonly kind: \"metadata\" | \"use\";\n readonly authorization: M.OAuthConnectedUseAuthorization;\n readonly grant?: M.OAuthConnectedTokenContext;\n }\n);\n\nexport interface OAuthConnectedPolicyGuardTable<\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly orderBy: Column<T>;\n readonly condition: (input: OAuthConnectedPolicyInput<N>) => Expression;\n}\n\nexport interface OAuthConnectedPolicyGuard<\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> {\n readonly table: Descriptor;\n readonly orderBy: string;\n readonly condition: (input: OAuthConnectedPolicyInput<N>) => Expression;\n}\n\nexport const oauthConnectedPolicyGuard = <\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n>(\n input: OAuthConnectedPolicyGuardTable<T, N, Expression>,\n): OAuthConnectedPolicyGuard<N, Expression, T[\"table\"]> =>\n Object.freeze({\n table: input.table,\n orderBy: input.orderBy,\n condition: input.condition,\n });\n\nexport interface OAuthConnectedSqlPolicy<\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> {\n /** Up to 32 scopes, each selecting 1..64 stable rows in global lock order.\n * Omit only when subject/shared authority locks already serialize every mutable\n * policy dependency or policy is immutable. All writers follow that order. */\n readonly guards?: ReadonlyArray<OAuthConnectedPolicyGuard<N, Expression, Descriptor>>;\n /** Recheck exact policy revision, purpose, optional grant/profile restrictions\n * and current profile/permissions; joins and absence assumptions are authority.\n * The engine checks this before and after every owner/application write. */\n readonly condition: (input: OAuthConnectedPolicyInput<N>) => Expression;\n}\n\nexport const requiredOAuthConnectedConstraints = {\n flow: \"unique(connectedFlow.moduleId,connectedFlow.flowId)\",\n flowCommand: \"unique(connectedFlow.moduleId,connectedFlow.commandId)\",\n stateDigest: \"unique(connectedFlow.stateDigest)\",\n client: \"unique(connectedClient.clientKey)\",\n cohort: \"unique(connectedCohort.cohortKey)\",\n grant: \"unique(connectedGrant.moduleId,connectedGrant.grantId)\",\n grantIdentity:\n \"unique(connectedGrant.moduleId,connectedGrant.subjectId,connectedGrant.profileKey,connectedGrant.activeIdentityKey)\",\n admission: \"unique(connectedAdmission.admissionId)\",\n command: \"unique(connectedCommand.moduleId,connectedCommand.commandId)\",\n} as const;\n\nexport const requiredOAuthConnectedRevocationConstraints = {\n job: \"unique(connectedRevocation.jobId)\",\n} as const;\n\n/** Existing ownership only; workers never allocate or acquire a tuple. */\nexport type OAuthConnectedOwnershipRead<\n T extends Table,\n O extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> =\n | {\n readonly mode: \"integrated\";\n readonly tuple: Omit<OAuthOwnershipMutation<T, O, N, Expression>[\"tuple\"], \"encodeInsert\">;\n }\n | {\n readonly mode: \"separate\";\n readonly tuple: Omit<OAuthOwnershipMutation<T, O, N, Expression>[\"tuple\"], \"encodeInsert\">;\n readonly external: Omit<\n Extract<\n OAuthOwnershipMutation<T, O, N, Expression>,\n { readonly mode: \"separate\" }\n >[\"external\"],\n \"encodeInsert\"\n >;\n };\n\nexport interface OAuthConnectedAuthorityMapping<\n T extends Table,\n O extends Table,\n F extends Table,\n G extends Table,\n C extends Table,\n H extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly ownership: OAuthConnectedOwnershipRead<T, O, N, Expression>;\n readonly subjectId: SubjectIdCodec<N>;\n readonly flow: Omit<OAuthConnectedFlowTable<F, N>, \"encodeInsert\">;\n readonly grant: Omit<OAuthConnectedGrantTable<G, N>, \"encodeInsert\">;\n readonly client: Omit<OAuthConnectedClientRegistrationTable<C>, \"encodeInsert\">;\n readonly cohort: Omit<OAuthConnectedCohortTable<H>, \"encodeInsert\">;\n readonly clock: OAuthClock<Expression>;\n readonly order: OAuthConnectedOrderCodec;\n readonly tupleConstraints: typeof requiredOAuthTupleConstraints;\n /** Safe metadata retention, never an expiry/quiescence proof for unresolved work. */\n readonly retentionMillis: number;\n}\n\nexport interface OAuthConnectedMapping<\n S extends Table,\n AC extends Table,\n T extends Table,\n O extends Table,\n F extends Table,\n G extends Table,\n C extends Table,\n H extends Table,\n A extends Table,\n D extends Table,\n N,\n J extends Table = never,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n SignIn extends Table = Table,\n> extends OAuthConnectedAuthorityMapping<T, O, F, G, C, H, N, Expression> {\n readonly ownership: OAuthOwnershipMutation<T, O, N, Expression>;\n readonly flow: OAuthConnectedFlowTable<F, N>;\n readonly grant: OAuthConnectedGrantTable<G, N>;\n readonly client: OAuthConnectedClientRegistrationTable<C>;\n readonly cohort: OAuthConnectedCohortTable<H>;\n readonly subject: OAuthConnectedSubjectTable<S, Expression>;\n readonly authority: OAuthAuthorityReadTable<AC, Expression>;\n readonly admission: OAuthConnectedAdmissionTable<A, N>;\n /** Same shared sign-in tables used by OAuthSignInPersistence. Enable only\n * alongside a nullable connected-flow subjectId and flow.encodeSignIn. */\n readonly signIn?: {\n readonly credential: OAuthCredentialReadTable<SignIn, Expression>;\n readonly flow: OAuthFlowTable<SignIn>;\n };\n readonly command: OAuthConnectedCommandTable<D, N>;\n readonly policy: OAuthConnectedSqlPolicy<N, Expression, Descriptor>;\n readonly constraints: typeof requiredOAuthConnectedConstraints;\n readonly revocation:\n | { readonly mode: \"unsupported\" }\n | {\n readonly mode: \"cohort\";\n readonly job: OAuthConnectedRevocationJobTable<J, N>;\n readonly constraints: typeof requiredOAuthConnectedRevocationConstraints;\n };\n /** Without an authoritative same-owner predicate, conservatively retain Owned.\n * Include login/other installed references; never filter away former-subject\n * work. This pure SQL constructor supports both bound values and correlated\n * column expressions with identical semantics; it performs no I/O.\n * Compare through the reference table's typed columns (for example, eq) so\n * native values use their encoders. Back the same-owner lookup with an index:\n * discovery applies this predicate before its candidate limit.\n * Connected references are checked separately. */\n readonly externalReference?: (\n input:\n | { readonly identityKey: string; readonly subjectId: N }\n | { readonly identityKey: Expression; readonly subjectId: Expression },\n ) => Expression;\n}\n\nexport interface OAuthConnectedRevocationMapping<\n T extends Table,\n O extends Table,\n F extends Table,\n G extends Table,\n C extends Table,\n H extends Table,\n J extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> extends OAuthConnectedAuthorityMapping<T, O, F, G, C, H, N, Expression> {\n readonly job: Omit<OAuthConnectedRevocationJobTable<J, N>, \"encodeInsert\">;\n readonly constraints: typeof requiredOAuthConnectedRevocationConstraints;\n}\n"],"mappings":";AA2OA,MAAa,6BAKX,UAEA,OAAO,OAAO;CACZ,OAAO,MAAM;CACb,SAAS,MAAM;CACf,WAAW,MAAM;AACnB,CAAC;AAiBH,MAAa,oCAAoC;CAC/C,MAAM;CACN,aAAa;CACb,aAAa;CACb,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,eACE;CACF,WAAW;CACX,SAAS;AACX;AAEA,MAAa,8CAA8C,EACzD,KAAK,oCACP"}
1
+ {"version":3,"file":"oauth-connected-model.mjs","names":[],"sources":["../../../src/internal/models/oauth-connected-model.ts"],"sourcesContent":["import type * as M from \"@yielded/auth/OAuth\";\n\nimport type { TableModel as Table, SqlExpression } from \"../table-model\";\nimport type { SubjectIdCodec } from \"./common\";\nimport type {\n OAuthAuthorityReadTable,\n OAuthClock,\n OAuthCredentialReadTable,\n OAuthFlowTable,\n OAuthOwnershipTable,\n OAuthOwnershipReadTable,\n OAuthSubjectReadTable,\n} from \"./oauth-model\";\n\ntype Column<T extends Table> = T[\"column\"];\nexport type OAuthConnectedAction = M.OAuthConnectedActionChallenge[\"action\"];\n\n/** Immutable sealed data plus the exact refresh compare-and-set fields. */\nexport interface OAuthConnectedGrantTable<G extends Table, N> {\n readonly table: G[\"table\"];\n readonly moduleId: Column<G>;\n readonly grantId: Column<G>;\n readonly subjectId: Column<G>;\n readonly identityKey: Column<G>;\n readonly profileKey: Column<G>;\n readonly grantVersion: Column<G>;\n readonly tokenVersion: Column<G>;\n readonly state: Column<G>;\n readonly snapshot: Column<G>;\n /** Listing selects this bounded projection, never encrypted token material. */\n readonly summary: Column<G>;\n readonly refreshClaimId: Column<G>;\n readonly refreshNextTokenVersion: Column<G>;\n readonly refreshClaimedAt: Column<G>;\n readonly refreshClaimExpiresAt: Column<G>;\n readonly expiresAt: Column<G>;\n readonly encodeInsert: (input: {\n readonly grant: M.OAuthConnectedStoredGrant;\n readonly subjectId: N;\n }) => G[\"insert\"];\n}\n\n/** Optional provider revocation retains the exact removed grant ciphertext. A\n * possibly spent claim is never reset to Pending or reclaimed after timeout. */\nexport interface OAuthConnectedRevocationJobTable<J extends Table, N> {\n readonly table: J[\"table\"];\n readonly jobId: Column<J>;\n readonly moduleId: Column<J>;\n readonly subjectId: Column<J>;\n readonly identityKey: Column<J>;\n readonly snapshot: Column<J>;\n readonly state: Column<J>;\n readonly claimId: Column<J>;\n readonly claimedAt: Column<J>;\n readonly claimExpiresAt: Column<J>;\n readonly retentionUntil: Column<J>;\n readonly encodeInsert: (input: {\n readonly job: M.OAuthConnectedRevocationJob;\n readonly subjectId: N;\n }) => J[\"insert\"];\n}\n\nexport type OAuthConnectedPolicyInput<N> = {\n readonly subjectId: N;\n readonly revision: M.OAuthAccountRevision;\n} & (\n | {\n readonly kind: \"action\";\n readonly operation: \"settle\" | \"disconnect\";\n readonly authorization: M.OAuthConnectedActionAuthorization;\n readonly grant?: M.OAuthConnectedTokenContext;\n }\n | {\n readonly kind: \"sign-in\";\n readonly credential: M.OAuthCredentialSnapshot;\n readonly grant: M.OAuthConnectedTokenContext;\n }\n | {\n readonly kind: \"metadata\" | \"use\";\n readonly authorization: M.OAuthConnectedUseAuthorization;\n readonly grant?: M.OAuthConnectedTokenContext;\n }\n);\n\n/** Changes to mutable policy advance the same subject security revision. This\n * predicate participates in the guarded write and final application postcondition. */\nexport interface OAuthConnectedSqlPolicy<N, Expression extends SqlExpression = SqlExpression> {\n readonly condition: (input: OAuthConnectedPolicyInput<N>) => Expression;\n}\n\nexport const requiredOAuthConnectedConstraints = {\n flow: \"unique(flow.moduleId,flow.flowId)\",\n stateDigest: \"unique(flow.stateDigest)\",\n ownership: \"unique(ownership.identityKey)\",\n grant: \"unique(connectedGrant.moduleId,connectedGrant.grantId)\",\n activeIdentity:\n \"unique(connectedGrant.moduleId,connectedGrant.subjectId,connectedGrant.profileKey,connectedGrant.identityKey)\",\n authorityCredential: \"unique(authority.subjectId,authority.credentialId)\",\n} as const;\n\nexport const requiredOAuthConnectedRevocationConstraints = {\n job: \"unique(connectedRevocation.jobId)\",\n} as const;\n\nexport interface OAuthConnectedMapping<\n S extends Table,\n AC extends Table,\n O extends Table,\n F extends Table,\n G extends Table,\n N,\n J extends Table = Table,\n Expression extends SqlExpression = SqlExpression,\n SignIn extends Table = Table,\n> {\n readonly ownership: OAuthOwnershipTable<O, N>;\n readonly subject: OAuthSubjectReadTable<S, Expression>;\n readonly authority: OAuthAuthorityReadTable<AC, Expression>;\n readonly subjectId: SubjectIdCodec<N>;\n readonly flow: OAuthFlowTable<F>;\n readonly grant: OAuthConnectedGrantTable<G, N>;\n readonly credential?: OAuthCredentialReadTable<SignIn, Expression>;\n readonly clock: OAuthClock<Expression>;\n readonly policy: OAuthConnectedSqlPolicy<N, Expression>;\n readonly constraints: typeof requiredOAuthConnectedConstraints;\n readonly revocation:\n | { readonly mode: \"unsupported\" }\n | {\n readonly mode: \"provider\";\n readonly job: OAuthConnectedRevocationJobTable<J, N>;\n readonly retentionMillis: number;\n readonly constraints: typeof requiredOAuthConnectedRevocationConstraints;\n };\n /** Indexed same-owner predicate for installed references beyond these grants/jobs. */\n readonly otherReferences: (input: {\n readonly identityKey: string;\n readonly subjectId: N;\n }) => Expression;\n}\n\nexport interface OAuthConnectedRevocationMapping<\n O extends Table,\n G extends Table,\n J extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly ownership: OAuthOwnershipReadTable<O, N>;\n readonly subjectId: SubjectIdCodec<N>;\n readonly grant: Omit<OAuthConnectedGrantTable<G, N>, \"encodeInsert\">;\n readonly job: Omit<OAuthConnectedRevocationJobTable<J, N>, \"encodeInsert\">;\n readonly clock: OAuthClock<Expression>;\n readonly otherReferences: (input: {\n readonly identityKey: string;\n readonly subjectId: N;\n }) => Expression;\n readonly constraints: typeof requiredOAuthConnectedRevocationConstraints;\n}\n"],"mappings":";AA0FA,MAAa,oCAAoC;CAC/C,MAAM;CACN,aAAa;CACb,WAAW;CACX,OAAO;CACP,gBACE;CACF,qBAAqB;AACvB;AAEA,MAAa,8CAA8C,EACzD,KAAK,oCACP"}