@authup/server-core 1.0.0-beta.59 → 1.0.0-beta.61

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 (434) hide show
  1. package/dist/adapters/database/domains/client/entity.d.ts.map +1 -1
  2. package/dist/adapters/database/domains/client/entity.mjs +58 -30
  3. package/dist/adapters/database/domains/client/entity.mjs.map +1 -1
  4. package/dist/adapters/database/domains/client-permission/entity.d.ts.map +1 -1
  5. package/dist/adapters/database/domains/client-permission/entity.mjs +48 -24
  6. package/dist/adapters/database/domains/client-permission/entity.mjs.map +1 -1
  7. package/dist/adapters/database/domains/client-role/entity.d.ts.map +1 -1
  8. package/dist/adapters/database/domains/client-role/entity.mjs +37 -17
  9. package/dist/adapters/database/domains/client-role/entity.mjs.map +1 -1
  10. package/dist/adapters/database/domains/client-scope/entity.d.ts.map +1 -1
  11. package/dist/adapters/database/domains/client-scope/entity.mjs +30 -14
  12. package/dist/adapters/database/domains/client-scope/entity.mjs.map +1 -1
  13. package/dist/adapters/database/domains/consent/entity.d.ts.map +1 -1
  14. package/dist/adapters/database/domains/consent/entity.mjs +34 -18
  15. package/dist/adapters/database/domains/consent/entity.mjs.map +1 -1
  16. package/dist/adapters/database/domains/event/entity.d.ts +1 -0
  17. package/dist/adapters/database/domains/event/entity.d.ts.map +1 -1
  18. package/dist/adapters/database/domains/event/entity.mjs +48 -23
  19. package/dist/adapters/database/domains/event/entity.mjs.map +1 -1
  20. package/dist/adapters/database/domains/identity-provider/entity.d.ts.map +1 -1
  21. package/dist/adapters/database/domains/identity-provider/entity.mjs +43 -23
  22. package/dist/adapters/database/domains/identity-provider/entity.mjs.map +1 -1
  23. package/dist/adapters/database/domains/identity-provider-account/entity.d.ts.map +1 -1
  24. package/dist/adapters/database/domains/identity-provider-account/entity.mjs +50 -22
  25. package/dist/adapters/database/domains/identity-provider-account/entity.mjs.map +1 -1
  26. package/dist/adapters/database/domains/identity-provider-attribute/entity.d.ts.map +1 -1
  27. package/dist/adapters/database/domains/identity-provider-attribute/entity.mjs +14 -6
  28. package/dist/adapters/database/domains/identity-provider-attribute/entity.mjs.map +1 -1
  29. package/dist/adapters/database/domains/identity-provider-attribute-mapping/entity.d.ts.map +1 -1
  30. package/dist/adapters/database/domains/identity-provider-attribute-mapping/entity.mjs +5 -1
  31. package/dist/adapters/database/domains/identity-provider-attribute-mapping/entity.mjs.map +1 -1
  32. package/dist/adapters/database/domains/identity-provider-permission-mapping/entity.d.ts.map +1 -1
  33. package/dist/adapters/database/domains/identity-provider-permission-mapping/entity.mjs +18 -6
  34. package/dist/adapters/database/domains/identity-provider-permission-mapping/entity.mjs.map +1 -1
  35. package/dist/adapters/database/domains/identity-provider-role-mapping/entity.d.ts.map +1 -1
  36. package/dist/adapters/database/domains/identity-provider-role-mapping/entity.mjs +34 -14
  37. package/dist/adapters/database/domains/identity-provider-role-mapping/entity.mjs.map +1 -1
  38. package/dist/adapters/database/domains/key/entity.d.ts.map +1 -1
  39. package/dist/adapters/database/domains/key/entity.mjs +35 -19
  40. package/dist/adapters/database/domains/key/entity.mjs.map +1 -1
  41. package/dist/adapters/database/domains/permission/entity.d.ts.map +1 -1
  42. package/dist/adapters/database/domains/permission/entity.mjs +35 -19
  43. package/dist/adapters/database/domains/permission/entity.mjs.map +1 -1
  44. package/dist/adapters/database/domains/permission-policy/entity.d.ts.map +1 -1
  45. package/dist/adapters/database/domains/permission-policy/entity.mjs +37 -17
  46. package/dist/adapters/database/domains/permission-policy/entity.mjs.map +1 -1
  47. package/dist/adapters/database/domains/policy/entity.d.ts.map +1 -1
  48. package/dist/adapters/database/domains/policy/entity.mjs +51 -27
  49. package/dist/adapters/database/domains/policy/entity.mjs.map +1 -1
  50. package/dist/adapters/database/domains/policy-attribute/entity.d.ts.map +1 -1
  51. package/dist/adapters/database/domains/policy-attribute/entity.mjs +14 -6
  52. package/dist/adapters/database/domains/policy-attribute/entity.mjs.map +1 -1
  53. package/dist/adapters/database/domains/realm/entity.d.ts.map +1 -1
  54. package/dist/adapters/database/domains/realm/entity.mjs +36 -20
  55. package/dist/adapters/database/domains/realm/entity.mjs.map +1 -1
  56. package/dist/adapters/database/domains/role/entity.d.ts.map +1 -1
  57. package/dist/adapters/database/domains/role/entity.mjs +44 -24
  58. package/dist/adapters/database/domains/role/entity.mjs.map +1 -1
  59. package/dist/adapters/database/domains/role-attribute/entity.d.ts.map +1 -1
  60. package/dist/adapters/database/domains/role-attribute/entity.mjs +30 -14
  61. package/dist/adapters/database/domains/role-attribute/entity.mjs.map +1 -1
  62. package/dist/adapters/database/domains/role-permission/entity.d.ts.map +1 -1
  63. package/dist/adapters/database/domains/role-permission/entity.mjs +45 -21
  64. package/dist/adapters/database/domains/role-permission/entity.mjs.map +1 -1
  65. package/dist/adapters/database/domains/scope/entity.d.ts.map +1 -1
  66. package/dist/adapters/database/domains/scope/entity.mjs +35 -19
  67. package/dist/adapters/database/domains/scope/entity.mjs.map +1 -1
  68. package/dist/adapters/database/domains/session/entity.d.ts.map +1 -1
  69. package/dist/adapters/database/domains/session/entity.mjs +63 -31
  70. package/dist/adapters/database/domains/session/entity.mjs.map +1 -1
  71. package/dist/adapters/database/domains/session-token/entity.d.ts +4 -1
  72. package/dist/adapters/database/domains/session-token/entity.d.ts.map +1 -1
  73. package/dist/adapters/database/domains/session-token/entity.mjs +40 -11
  74. package/dist/adapters/database/domains/session-token/entity.mjs.map +1 -1
  75. package/dist/adapters/database/domains/trust-anchor/entity.d.ts.map +1 -1
  76. package/dist/adapters/database/domains/trust-anchor/entity.mjs +25 -13
  77. package/dist/adapters/database/domains/trust-anchor/entity.mjs.map +1 -1
  78. package/dist/adapters/database/domains/user/entity.d.ts.map +1 -1
  79. package/dist/adapters/database/domains/user/entity.mjs +58 -34
  80. package/dist/adapters/database/domains/user/entity.mjs.map +1 -1
  81. package/dist/adapters/database/domains/user-attribute/entity.d.ts.map +1 -1
  82. package/dist/adapters/database/domains/user-attribute/entity.mjs +27 -11
  83. package/dist/adapters/database/domains/user-attribute/entity.mjs.map +1 -1
  84. package/dist/adapters/database/domains/user-authenticator/entity.d.ts.map +1 -1
  85. package/dist/adapters/database/domains/user-authenticator/entity.mjs +43 -23
  86. package/dist/adapters/database/domains/user-authenticator/entity.mjs.map +1 -1
  87. package/dist/adapters/database/domains/user-permission/entity.d.ts.map +1 -1
  88. package/dist/adapters/database/domains/user-permission/entity.mjs +45 -21
  89. package/dist/adapters/database/domains/user-permission/entity.mjs.map +1 -1
  90. package/dist/adapters/database/domains/user-role/entity.d.ts.map +1 -1
  91. package/dist/adapters/database/domains/user-role/entity.mjs +37 -17
  92. package/dist/adapters/database/domains/user-role/entity.mjs.map +1 -1
  93. package/dist/adapters/database/errors/driver.d.ts +9 -0
  94. package/dist/adapters/database/errors/driver.d.ts.map +1 -1
  95. package/dist/adapters/database/errors/driver.mjs +20 -1
  96. package/dist/adapters/database/errors/driver.mjs.map +1 -1
  97. package/dist/adapters/database/errors/index.mjs +2 -2
  98. package/dist/adapters/database/helpers/index.mjs +2 -2
  99. package/dist/adapters/database/helpers/is-supported.d.ts +7 -0
  100. package/dist/adapters/database/helpers/is-supported.d.ts.map +1 -1
  101. package/dist/adapters/database/helpers/is-supported.mjs +9 -1
  102. package/dist/adapters/database/helpers/is-supported.mjs.map +1 -1
  103. package/dist/adapters/database/index.mjs +3 -3
  104. package/dist/adapters/database/migrations/mysql/1785871780234-AlignSchemaWithEntityMetadata.d.ts +66 -0
  105. package/dist/adapters/database/migrations/mysql/1785871780234-AlignSchemaWithEntityMetadata.d.ts.map +1 -0
  106. package/dist/adapters/database/migrations/mysql/1785871780234-AlignSchemaWithEntityMetadata.mjs +181 -0
  107. package/dist/adapters/database/migrations/mysql/1785871780234-AlignSchemaWithEntityMetadata.mjs.map +1 -0
  108. package/dist/adapters/database/migrations/mysql/1786436332251-QueryIndexes.d.ts +44 -0
  109. package/dist/adapters/database/migrations/mysql/1786436332251-QueryIndexes.d.ts.map +1 -0
  110. package/dist/adapters/database/migrations/mysql/1786436332251-QueryIndexes.mjs +1294 -0
  111. package/dist/adapters/database/migrations/mysql/1786436332251-QueryIndexes.mjs.map +1 -0
  112. package/dist/adapters/database/migrations/postgres/1785871780234-AlignSchemaWithEntityMetadata.d.ts +43 -0
  113. package/dist/adapters/database/migrations/postgres/1785871780234-AlignSchemaWithEntityMetadata.d.ts.map +1 -0
  114. package/dist/adapters/database/migrations/postgres/1785871780234-AlignSchemaWithEntityMetadata.mjs +120 -0
  115. package/dist/adapters/database/migrations/postgres/1785871780234-AlignSchemaWithEntityMetadata.mjs.map +1 -0
  116. package/dist/adapters/database/migrations/postgres/1786436332251-QueryIndexes.d.ts +44 -0
  117. package/dist/adapters/database/migrations/postgres/1786436332251-QueryIndexes.d.ts.map +1 -0
  118. package/dist/adapters/database/migrations/postgres/1786436332251-QueryIndexes.mjs +987 -0
  119. package/dist/adapters/database/migrations/postgres/1786436332251-QueryIndexes.mjs.map +1 -0
  120. package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts +22 -4
  121. package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts.map +1 -1
  122. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +190 -47
  123. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs.map +1 -1
  124. package/dist/adapters/http/controllers/entities/identity-provider/types.d.ts +5 -2
  125. package/dist/adapters/http/controllers/entities/identity-provider/types.d.ts.map +1 -1
  126. package/dist/adapters/http/controllers/entities/identity-provider-account/index.d.ts.map +1 -0
  127. package/dist/adapters/http/controllers/entities/identity-provider-account/index.mjs +5 -0
  128. package/dist/adapters/http/controllers/entities/identity-provider-account/module.d.ts +15 -0
  129. package/dist/adapters/http/controllers/entities/identity-provider-account/module.d.ts.map +1 -0
  130. package/dist/adapters/http/controllers/entities/identity-provider-account/module.mjs +94 -0
  131. package/dist/adapters/http/controllers/entities/identity-provider-account/module.mjs.map +1 -0
  132. package/dist/adapters/http/controllers/entities/index.d.ts +2 -0
  133. package/dist/adapters/http/controllers/entities/index.d.ts.map +1 -1
  134. package/dist/adapters/http/controllers/entities/index.mjs +5 -1
  135. package/dist/adapters/http/controllers/entities/session-token/index.d.ts +2 -0
  136. package/dist/adapters/http/controllers/entities/session-token/index.d.ts.map +1 -0
  137. package/dist/adapters/http/controllers/entities/session-token/index.mjs +5 -0
  138. package/dist/adapters/http/controllers/entities/session-token/module.d.ts +23 -0
  139. package/dist/adapters/http/controllers/entities/session-token/module.d.ts.map +1 -0
  140. package/dist/adapters/http/controllers/entities/session-token/module.mjs +112 -0
  141. package/dist/adapters/http/controllers/entities/session-token/module.mjs.map +1 -0
  142. package/dist/adapters/http/controllers/index.mjs +3 -1
  143. package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.d.ts.map +1 -1
  144. package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.mjs +1 -0
  145. package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.mjs.map +1 -1
  146. package/dist/adapters/http/index.mjs +3 -1
  147. package/dist/adapters/http/middleware/built-in/error.d.ts.map +1 -1
  148. package/dist/adapters/http/middleware/built-in/error.mjs +4 -3
  149. package/dist/adapters/http/middleware/built-in/error.mjs.map +1 -1
  150. package/dist/adapters/http/request/event-context.d.ts.map +1 -1
  151. package/dist/adapters/http/request/event-context.mjs +2 -0
  152. package/dist/adapters/http/request/event-context.mjs.map +1 -1
  153. package/dist/app/index.mjs +4 -2
  154. package/dist/app/modules/database/index.mjs +2 -1
  155. package/dist/app/modules/database/repositories/identity-provider-account/index.d.ts +2 -0
  156. package/dist/app/modules/database/repositories/identity-provider-account/index.d.ts.map +1 -0
  157. package/dist/app/modules/database/repositories/identity-provider-account/index.mjs +5 -0
  158. package/dist/app/modules/database/repositories/identity-provider-account/repository.d.ts +18 -0
  159. package/dist/app/modules/database/repositories/identity-provider-account/repository.d.ts.map +1 -0
  160. package/dist/app/modules/database/repositories/identity-provider-account/repository.mjs +69 -0
  161. package/dist/app/modules/database/repositories/identity-provider-account/repository.mjs.map +1 -0
  162. package/dist/app/modules/database/repositories/index.d.ts +1 -0
  163. package/dist/app/modules/database/repositories/index.d.ts.map +1 -1
  164. package/dist/app/modules/database/repositories/index.mjs +3 -1
  165. package/dist/app/modules/database/repositories/key/repository.d.ts +23 -0
  166. package/dist/app/modules/database/repositories/key/repository.d.ts.map +1 -1
  167. package/dist/app/modules/database/repositories/key/repository.mjs +39 -3
  168. package/dist/app/modules/database/repositories/key/repository.mjs.map +1 -1
  169. package/dist/app/modules/database/repositories/schema-validation.d.ts +14 -6
  170. package/dist/app/modules/database/repositories/schema-validation.d.ts.map +1 -1
  171. package/dist/app/modules/database/repositories/schema-validation.mjs +18 -6
  172. package/dist/app/modules/database/repositories/schema-validation.mjs.map +1 -1
  173. package/dist/app/modules/http/modules/controller.d.ts +3 -1
  174. package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
  175. package/dist/app/modules/http/modules/controller.mjs +39 -2
  176. package/dist/app/modules/http/modules/controller.mjs.map +1 -1
  177. package/dist/app/modules/identity/constants.d.ts +2 -1
  178. package/dist/app/modules/identity/constants.d.ts.map +1 -1
  179. package/dist/app/modules/identity/constants.mjs +1 -0
  180. package/dist/app/modules/identity/constants.mjs.map +1 -1
  181. package/dist/app/modules/identity/index.mjs +3 -2
  182. package/dist/app/modules/identity/module.d.ts.map +1 -1
  183. package/dist/app/modules/identity/module.mjs +9 -2
  184. package/dist/app/modules/identity/module.mjs.map +1 -1
  185. package/dist/app/modules/identity/repositories/constants.d.ts +4 -0
  186. package/dist/app/modules/identity/repositories/constants.d.ts.map +1 -0
  187. package/dist/app/modules/identity/repositories/constants.mjs +12 -0
  188. package/dist/app/modules/identity/repositories/constants.mjs.map +1 -0
  189. package/dist/app/modules/identity/repositories/index.d.ts +1 -0
  190. package/dist/app/modules/identity/repositories/index.d.ts.map +1 -1
  191. package/dist/app/modules/identity/repositories/index.mjs +3 -2
  192. package/dist/app/modules/identity/repositories/provider/index.d.ts +1 -1
  193. package/dist/app/modules/identity/repositories/provider/index.d.ts.map +1 -1
  194. package/dist/app/modules/identity/repositories/provider/index.mjs +2 -3
  195. package/dist/app/modules/identity/repositories/provider/link.d.ts +9 -0
  196. package/dist/app/modules/identity/repositories/provider/link.d.ts.map +1 -0
  197. package/dist/app/modules/identity/repositories/provider/link.mjs +34 -0
  198. package/dist/app/modules/identity/repositories/provider/link.mjs.map +1 -0
  199. package/dist/app/modules/index.mjs +4 -2
  200. package/dist/app/modules/logger/module.d.ts.map +1 -1
  201. package/dist/app/modules/logger/module.mjs +1 -0
  202. package/dist/app/modules/logger/module.mjs.map +1 -1
  203. package/dist/app/modules/oauth2/repositories/session-token/repository.d.ts +25 -1
  204. package/dist/app/modules/oauth2/repositories/session-token/repository.d.ts.map +1 -1
  205. package/dist/app/modules/oauth2/repositories/session-token/repository.mjs +70 -1
  206. package/dist/app/modules/oauth2/repositories/session-token/repository.mjs.map +1 -1
  207. package/dist/app/modules/provisioning/module.d.ts.map +1 -1
  208. package/dist/app/modules/provisioning/module.mjs +3 -1
  209. package/dist/app/modules/provisioning/module.mjs.map +1 -1
  210. package/dist/app/modules/provisioning/sources/default/module.d.ts.map +1 -1
  211. package/dist/app/modules/provisioning/sources/default/module.mjs +1 -0
  212. package/dist/app/modules/provisioning/sources/default/module.mjs.map +1 -1
  213. package/dist/core/entities/client/schema.d.ts.map +1 -1
  214. package/dist/core/entities/client/schema.mjs +29 -10
  215. package/dist/core/entities/client/schema.mjs.map +1 -1
  216. package/dist/core/entities/client-permission/schema.d.ts.map +1 -1
  217. package/dist/core/entities/client-permission/schema.mjs +29 -6
  218. package/dist/core/entities/client-permission/schema.mjs.map +1 -1
  219. package/dist/core/entities/client-role/schema.d.ts.map +1 -1
  220. package/dist/core/entities/client-role/schema.mjs +27 -6
  221. package/dist/core/entities/client-role/schema.mjs.map +1 -1
  222. package/dist/core/entities/client-scope/schema.d.ts.map +1 -1
  223. package/dist/core/entities/client-scope/schema.mjs +19 -5
  224. package/dist/core/entities/client-scope/schema.mjs.map +1 -1
  225. package/dist/core/entities/consent/schema.d.ts.map +1 -1
  226. package/dist/core/entities/consent/schema.mjs +28 -6
  227. package/dist/core/entities/consent/schema.mjs.map +1 -1
  228. package/dist/core/entities/event/entity-event-handler.d.ts.map +1 -1
  229. package/dist/core/entities/event/entity-event-handler.mjs +2 -0
  230. package/dist/core/entities/event/entity-event-handler.mjs.map +1 -1
  231. package/dist/core/entities/event/sanitize.d.ts.map +1 -1
  232. package/dist/core/entities/event/sanitize.mjs +7 -4
  233. package/dist/core/entities/event/sanitize.mjs.map +1 -1
  234. package/dist/core/entities/event/schema.d.ts.map +1 -1
  235. package/dist/core/entities/event/schema.mjs +45 -16
  236. package/dist/core/entities/event/schema.mjs.map +1 -1
  237. package/dist/core/entities/event/service.d.ts.map +1 -1
  238. package/dist/core/entities/event/service.mjs +2 -0
  239. package/dist/core/entities/event/service.mjs.map +1 -1
  240. package/dist/core/entities/event/types.d.ts +2 -0
  241. package/dist/core/entities/event/types.d.ts.map +1 -1
  242. package/dist/core/entities/identity-provider/schema.d.ts.map +1 -1
  243. package/dist/core/entities/identity-provider/schema.mjs +29 -11
  244. package/dist/core/entities/identity-provider/schema.mjs.map +1 -1
  245. package/dist/core/entities/identity-provider-account/error.d.ts +7 -0
  246. package/dist/core/entities/identity-provider-account/error.d.ts.map +1 -0
  247. package/dist/core/entities/identity-provider-account/error.mjs +24 -0
  248. package/dist/core/entities/identity-provider-account/error.mjs.map +1 -0
  249. package/dist/core/entities/identity-provider-account/index.d.ts +5 -0
  250. package/dist/core/entities/identity-provider-account/index.d.ts.map +1 -0
  251. package/dist/core/entities/identity-provider-account/index.mjs +8 -0
  252. package/dist/core/entities/identity-provider-account/schema.d.ts +3 -0
  253. package/dist/core/entities/identity-provider-account/schema.d.ts.map +1 -0
  254. package/dist/core/entities/identity-provider-account/schema.mjs +52 -0
  255. package/dist/core/entities/identity-provider-account/schema.mjs.map +1 -0
  256. package/dist/core/entities/identity-provider-account/service.d.ts +24 -0
  257. package/dist/core/entities/identity-provider-account/service.d.ts.map +1 -0
  258. package/dist/core/entities/identity-provider-account/service.mjs +129 -0
  259. package/dist/core/entities/identity-provider-account/service.mjs.map +1 -0
  260. package/dist/core/entities/identity-provider-account/types.d.ts +69 -0
  261. package/dist/core/entities/identity-provider-account/types.d.ts.map +1 -0
  262. package/dist/core/entities/identity-provider-account/types.mjs +17 -0
  263. package/dist/core/entities/identity-provider-account/types.mjs.map +1 -0
  264. package/dist/core/entities/identity-provider-role-mapping/schema.d.ts.map +1 -1
  265. package/dist/core/entities/identity-provider-role-mapping/schema.mjs +27 -6
  266. package/dist/core/entities/identity-provider-role-mapping/schema.mjs.map +1 -1
  267. package/dist/core/entities/index.d.ts +2 -0
  268. package/dist/core/entities/index.d.ts.map +1 -1
  269. package/dist/core/entities/index.mjs +9 -1
  270. package/dist/core/entities/key/schema.d.ts.map +1 -1
  271. package/dist/core/entities/key/schema.mjs +39 -17
  272. package/dist/core/entities/key/schema.mjs.map +1 -1
  273. package/dist/core/entities/key/service.d.ts.map +1 -1
  274. package/dist/core/entities/key/service.mjs +1 -0
  275. package/dist/core/entities/key/service.mjs.map +1 -1
  276. package/dist/core/entities/permission/schema.d.ts.map +1 -1
  277. package/dist/core/entities/permission/schema.mjs +34 -13
  278. package/dist/core/entities/permission/schema.mjs.map +1 -1
  279. package/dist/core/entities/permission-policy/schema.d.ts.map +1 -1
  280. package/dist/core/entities/permission-policy/schema.mjs +27 -6
  281. package/dist/core/entities/permission-policy/schema.mjs.map +1 -1
  282. package/dist/core/entities/policy/schema.d.ts.map +1 -1
  283. package/dist/core/entities/policy/schema.mjs +31 -12
  284. package/dist/core/entities/policy/schema.mjs.map +1 -1
  285. package/dist/core/entities/realm/schema.d.ts.map +1 -1
  286. package/dist/core/entities/realm/schema.mjs +26 -12
  287. package/dist/core/entities/realm/schema.mjs.map +1 -1
  288. package/dist/core/entities/role/schema.d.ts.map +1 -1
  289. package/dist/core/entities/role/schema.mjs +36 -14
  290. package/dist/core/entities/role/schema.mjs.map +1 -1
  291. package/dist/core/entities/role-attribute/schema.d.ts.map +1 -1
  292. package/dist/core/entities/role-attribute/schema.mjs +28 -14
  293. package/dist/core/entities/role-attribute/schema.mjs.map +1 -1
  294. package/dist/core/entities/role-permission/schema.d.ts.map +1 -1
  295. package/dist/core/entities/role-permission/schema.mjs +29 -6
  296. package/dist/core/entities/role-permission/schema.mjs.map +1 -1
  297. package/dist/core/entities/scope/schema.d.ts.map +1 -1
  298. package/dist/core/entities/scope/schema.mjs +28 -12
  299. package/dist/core/entities/scope/schema.mjs.map +1 -1
  300. package/dist/core/entities/session/schema.d.ts.map +1 -1
  301. package/dist/core/entities/session/schema.mjs +41 -9
  302. package/dist/core/entities/session/schema.mjs.map +1 -1
  303. package/dist/core/entities/session-token/index.d.ts +4 -0
  304. package/dist/core/entities/session-token/index.d.ts.map +1 -0
  305. package/dist/core/entities/session-token/index.mjs +6 -0
  306. package/dist/core/entities/session-token/schema.d.ts +12 -0
  307. package/dist/core/entities/session-token/schema.d.ts.map +1 -0
  308. package/dist/core/entities/session-token/schema.mjs +66 -0
  309. package/dist/core/entities/session-token/schema.mjs.map +1 -0
  310. package/dist/core/entities/session-token/service.d.ts +70 -0
  311. package/dist/core/entities/session-token/service.d.ts.map +1 -0
  312. package/dist/core/entities/session-token/service.mjs +216 -0
  313. package/dist/core/entities/session-token/service.mjs.map +1 -0
  314. package/dist/core/entities/session-token/types.d.ts +37 -0
  315. package/dist/core/entities/session-token/types.d.ts.map +1 -0
  316. package/dist/core/entities/session-token/types.mjs +4 -0
  317. package/dist/core/entities/trust-anchor/schema.d.ts.map +1 -1
  318. package/dist/core/entities/trust-anchor/schema.mjs +27 -13
  319. package/dist/core/entities/trust-anchor/schema.mjs.map +1 -1
  320. package/dist/core/entities/trust-anchor/service.d.ts.map +1 -1
  321. package/dist/core/entities/trust-anchor/service.mjs +1 -0
  322. package/dist/core/entities/trust-anchor/service.mjs.map +1 -1
  323. package/dist/core/entities/user/schema.d.ts.map +1 -1
  324. package/dist/core/entities/user/schema.mjs +29 -12
  325. package/dist/core/entities/user/schema.mjs.map +1 -1
  326. package/dist/core/entities/user-attribute/schema.d.ts.map +1 -1
  327. package/dist/core/entities/user-attribute/schema.mjs +28 -14
  328. package/dist/core/entities/user-attribute/schema.mjs.map +1 -1
  329. package/dist/core/entities/user-authenticator/schema.d.ts.map +1 -1
  330. package/dist/core/entities/user-authenticator/schema.mjs +29 -12
  331. package/dist/core/entities/user-authenticator/schema.mjs.map +1 -1
  332. package/dist/core/entities/user-authenticator/service.d.ts +2 -1
  333. package/dist/core/entities/user-authenticator/service.d.ts.map +1 -1
  334. package/dist/core/entities/user-authenticator/service.mjs +5 -0
  335. package/dist/core/entities/user-authenticator/service.mjs.map +1 -1
  336. package/dist/core/entities/user-authenticator/types.d.ts +7 -1
  337. package/dist/core/entities/user-authenticator/types.d.ts.map +1 -1
  338. package/dist/core/entities/user-authenticator/types.mjs.map +1 -1
  339. package/dist/core/entities/user-permission/schema.d.ts.map +1 -1
  340. package/dist/core/entities/user-permission/schema.mjs +29 -6
  341. package/dist/core/entities/user-permission/schema.mjs.map +1 -1
  342. package/dist/core/entities/user-role/schema.d.ts.map +1 -1
  343. package/dist/core/entities/user-role/schema.mjs +27 -6
  344. package/dist/core/entities/user-role/schema.mjs.map +1 -1
  345. package/dist/core/identity/index.mjs +3 -1
  346. package/dist/core/identity/provider/account/constants.d.ts +10 -0
  347. package/dist/core/identity/provider/account/constants.d.ts.map +1 -0
  348. package/dist/core/identity/provider/account/constants.mjs +16 -0
  349. package/dist/core/identity/provider/account/constants.mjs.map +1 -0
  350. package/dist/core/identity/provider/account/error.d.ts +7 -0
  351. package/dist/core/identity/provider/account/error.d.ts.map +1 -0
  352. package/dist/core/identity/provider/account/error.mjs +24 -0
  353. package/dist/core/identity/provider/account/error.mjs.map +1 -0
  354. package/dist/core/identity/provider/account/index.d.ts +2 -0
  355. package/dist/core/identity/provider/account/index.d.ts.map +1 -1
  356. package/dist/core/identity/provider/account/index.mjs +3 -1
  357. package/dist/core/identity/provider/account/module.d.ts +2 -0
  358. package/dist/core/identity/provider/account/module.d.ts.map +1 -1
  359. package/dist/core/identity/provider/account/module.mjs +30 -0
  360. package/dist/core/identity/provider/account/module.mjs.map +1 -1
  361. package/dist/core/identity/provider/account/types.d.ts +44 -7
  362. package/dist/core/identity/provider/account/types.d.ts.map +1 -1
  363. package/dist/core/identity/provider/authentication/protocols/oauth2/module.d.ts +19 -0
  364. package/dist/core/identity/provider/authentication/protocols/oauth2/module.d.ts.map +1 -1
  365. package/dist/core/identity/provider/authentication/protocols/oauth2/module.mjs +60 -3
  366. package/dist/core/identity/provider/authentication/protocols/oauth2/module.mjs.map +1 -1
  367. package/dist/core/identity/provider/authentication/protocols/oauth2/types.d.ts +9 -0
  368. package/dist/core/identity/provider/authentication/protocols/oauth2/types.d.ts.map +1 -1
  369. package/dist/core/identity/provider/authentication/protocols/open-id/module.d.ts +0 -3
  370. package/dist/core/identity/provider/authentication/protocols/open-id/module.d.ts.map +1 -1
  371. package/dist/core/identity/provider/authentication/protocols/open-id/module.mjs +0 -17
  372. package/dist/core/identity/provider/authentication/protocols/open-id/module.mjs.map +1 -1
  373. package/dist/core/identity/provider/index.mjs +3 -1
  374. package/dist/core/index.mjs +11 -2
  375. package/dist/core/oauth2/authorization/code-request/verifier/module.d.ts.map +1 -1
  376. package/dist/core/oauth2/authorization/code-request/verifier/module.mjs +2 -1
  377. package/dist/core/oauth2/authorization/code-request/verifier/module.mjs.map +1 -1
  378. package/dist/core/oauth2/authorization/module.d.ts.map +1 -1
  379. package/dist/core/oauth2/authorization/module.mjs +2 -0
  380. package/dist/core/oauth2/authorization/module.mjs.map +1 -1
  381. package/dist/core/oauth2/authorization/state/types.d.ts +11 -0
  382. package/dist/core/oauth2/authorization/state/types.d.ts.map +1 -1
  383. package/dist/core/oauth2/end-session/service.mjs +2 -2
  384. package/dist/core/oauth2/end-session/service.mjs.map +1 -1
  385. package/dist/core/oauth2/grant-types/authorize.d.ts.map +1 -1
  386. package/dist/core/oauth2/grant-types/authorize.mjs +1 -5
  387. package/dist/core/oauth2/grant-types/authorize.mjs.map +1 -1
  388. package/dist/core/oauth2/grant-types/password.mjs +2 -5
  389. package/dist/core/oauth2/grant-types/password.mjs.map +1 -1
  390. package/dist/core/oauth2/grant-types/refresh-token.d.ts.map +1 -1
  391. package/dist/core/oauth2/grant-types/refresh-token.mjs +37 -24
  392. package/dist/core/oauth2/grant-types/refresh-token.mjs.map +1 -1
  393. package/dist/core/oauth2/index.mjs +3 -1
  394. package/dist/core/oauth2/mfa-login/module.d.ts.map +1 -1
  395. package/dist/core/oauth2/mfa-login/module.mjs +4 -7
  396. package/dist/core/oauth2/mfa-login/module.mjs.map +1 -1
  397. package/dist/core/oauth2/session-token/error.d.ts +36 -0
  398. package/dist/core/oauth2/session-token/error.d.ts.map +1 -0
  399. package/dist/core/oauth2/session-token/error.mjs +49 -0
  400. package/dist/core/oauth2/session-token/error.mjs.map +1 -0
  401. package/dist/core/oauth2/session-token/index.d.ts +1 -0
  402. package/dist/core/oauth2/session-token/index.d.ts.map +1 -1
  403. package/dist/core/oauth2/session-token/index.mjs +2 -1
  404. package/dist/core/oauth2/session-token/types.d.ts +40 -0
  405. package/dist/core/oauth2/session-token/types.d.ts.map +1 -1
  406. package/dist/core/oauth2/token/issuer/access/module.d.ts.map +1 -1
  407. package/dist/core/oauth2/token/issuer/access/module.mjs +1 -0
  408. package/dist/core/oauth2/token/issuer/access/module.mjs.map +1 -1
  409. package/dist/core/oauth2/token/issuer/base.d.ts +1 -1
  410. package/dist/core/oauth2/token/issuer/base.d.ts.map +1 -1
  411. package/dist/core/oauth2/token/issuer/base.mjs.map +1 -1
  412. package/dist/core/oauth2/token/issuer/refresh/module.d.ts.map +1 -1
  413. package/dist/core/oauth2/token/issuer/refresh/module.mjs +1 -0
  414. package/dist/core/oauth2/token/issuer/refresh/module.mjs.map +1 -1
  415. package/dist/core/query/index.mjs +2 -2
  416. package/dist/core/query/module.d.ts +19 -9
  417. package/dist/core/query/module.d.ts.map +1 -1
  418. package/dist/core/query/module.mjs +22 -10
  419. package/dist/core/query/module.mjs.map +1 -1
  420. package/dist/index.mjs +8 -4
  421. package/dist/swagger.json +961 -132
  422. package/dist/utils/error.d.ts +20 -3
  423. package/dist/utils/error.d.ts.map +1 -1
  424. package/dist/utils/error.mjs +102 -5
  425. package/dist/utils/error.mjs.map +1 -1
  426. package/dist/utils/index.mjs +2 -2
  427. package/package.json +23 -21
  428. package/dist/app/modules/identity/repositories/provider/account/index.d.ts.map +0 -1
  429. package/dist/app/modules/identity/repositories/provider/account/index.mjs +0 -5
  430. package/dist/app/modules/identity/repositories/provider/account/module.d.ts +0 -10
  431. package/dist/app/modules/identity/repositories/provider/account/module.d.ts.map +0 -1
  432. package/dist/app/modules/identity/repositories/provider/account/module.mjs +0 -28
  433. package/dist/app/modules/identity/repositories/provider/account/module.mjs.map +0 -1
  434. /package/dist/{app/modules/identity/repositories/provider/account → adapters/http/controllers/entities/identity-provider-account}/index.d.ts +0 -0
@@ -11,6 +11,7 @@ import { ClientScopeRequestValidator } from "./entities/client-scope/utils/valid
11
11
  import { ConsentController } from "./entities/consent/module.mjs";
12
12
  import { EventController } from "./entities/event/module.mjs";
13
13
  import { IdentityProviderController } from "./entities/identity-provider/module.mjs";
14
+ import { IdentityProviderAccountController } from "./entities/identity-provider-account/module.mjs";
14
15
  import { IdentityProviderRoleMappingController } from "./entities/identity-provide-role/module.mjs";
15
16
  import { KeyController } from "./entities/key/module.mjs";
16
17
  import { PermissionController } from "./entities/permission/module.mjs";
@@ -41,6 +42,7 @@ import { PolicyAttributesValidator } from "./entities/policy/utils/attributes-va
41
42
  import { PolicyValidator } from "./entities/policy/utils/validation.mjs";
42
43
  import { ScopeController } from "./entities/scope/module.mjs";
43
44
  import { SessionController } from "./entities/session/module.mjs";
45
+ import { SessionTokenController } from "./entities/session-token/module.mjs";
44
46
  import { TrustAnchorController } from "./entities/trust-anchor/module.mjs";
45
47
  import { UserController } from "./entities/user/module.mjs";
46
48
  import { UserAttributeController } from "./entities/user-attribute/module.mjs";
@@ -51,4 +53,4 @@ import { UserPermissionRequestValidator } from "./entities/user-permission/utils
51
53
  import { UserRoleController } from "./entities/user-role/module.mjs";
52
54
  import { UserRoleRequestValidator } from "./entities/user-role/utils/validation.mjs";
53
55
  import "./entities/index.mjs";
54
- export { AccountController, ActivateController, AuthenticatorChallengeController, AuthorizeController, ClientController, ClientPermissionController, ClientPermissionRequestValidator, ClientRoleController, ClientRoleRequestValidator, ClientScopeController, ClientScopeRequestValidator, ConsentController, EventController, IdentityProviderController, IdentityProviderRoleMappingController, JwkController, KeyController, LogoutController, OpenIDController, PasswordForgotController, PasswordResetController, PermissionController, PermissionPolicyController, PolicyAttributesValidator, PolicyController, PolicyValidator, RealmController, RegisterController, RoleAttributeController, RoleAttributeRequestValidator, RoleController, RolePermissionController, RolePermissionRequestValidator, ScopeController, SessionController, StatusController, TokenController, TrustAnchorController, UserAttributeController, UserAttributeRequestValidator, UserAuthenticatorController, UserController, UserInfoController, UserPermissionController, UserPermissionRequestValidator, UserRoleController, UserRoleRequestValidator, getJwkRouteHandler, getJwksRouteHandler };
56
+ export { AccountController, ActivateController, AuthenticatorChallengeController, AuthorizeController, ClientController, ClientPermissionController, ClientPermissionRequestValidator, ClientRoleController, ClientRoleRequestValidator, ClientScopeController, ClientScopeRequestValidator, ConsentController, EventController, IdentityProviderAccountController, IdentityProviderController, IdentityProviderRoleMappingController, JwkController, KeyController, LogoutController, OpenIDController, PasswordForgotController, PasswordResetController, PermissionController, PermissionPolicyController, PolicyAttributesValidator, PolicyController, PolicyValidator, RealmController, RegisterController, RoleAttributeController, RoleAttributeRequestValidator, RoleController, RolePermissionController, RolePermissionRequestValidator, ScopeController, SessionController, SessionTokenController, StatusController, TokenController, TrustAnchorController, UserAttributeController, UserAttributeRequestValidator, UserAuthenticatorController, UserController, UserInfoController, UserPermissionController, UserPermissionRequestValidator, UserRoleController, UserRoleRequestValidator, getJwkRouteHandler, getJwksRouteHandler };
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/workflows/authenticator-challenge/module.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,KAAK,EACR,kCAAkC,EAClC,qCAAqC,EACrC,uCAAuC,EACvC,wCAAwC,EAC3C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACvH,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAQxF,MAAM,MAAM,uCAAuC,GAAG;IAClD,OAAO,EAAE,yBAAyB,CAAC;IACnC,cAAc,EAAE,eAAe,CAAC;IAChC,eAAe,CAAC,EAAE,sBAAsB,CAAC;CAC5C,CAAC;AAEF,KAAK,cAAc,GAAG;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,qBAEa,gCAAgC;IACzC,SAAS,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAE7C,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC;IAE1C,SAAS,CAAC,eAAe,CAAC,EAAE,sBAAsB,CAAC;gBAEvC,GAAG,EAAE,uCAAuC;IAMxD;;;;;OAKG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,GAAI,cAAc;IAenD,MAAM,CACI,KAAK,EAAE,SAAS,GAC7B,OAAO,CAAC,kCAAkC,CAAC;IAcxC,IAAI,CACG,IAAI,EAAE,qCAAqC,EACxC,KAAK,EAAE,SAAS,GAC7B,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,CAAA;KAAE,CAAC;IAqBvB,MAAM,CACC,IAAI,EAAE,uCAAuC,EAC1C,KAAK,EAAE,SAAS,GAC7B,OAAO,CAAC,wCAAwC,CAAC;CAsEvD"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/workflows/authenticator-challenge/module.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,KAAK,EACR,kCAAkC,EAClC,qCAAqC,EACrC,uCAAuC,EACvC,wCAAwC,EAC3C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACvH,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAQxF,MAAM,MAAM,uCAAuC,GAAG;IAClD,OAAO,EAAE,yBAAyB,CAAC;IACnC,cAAc,EAAE,eAAe,CAAC;IAChC,eAAe,CAAC,EAAE,sBAAsB,CAAC;CAC5C,CAAC;AAEF,KAAK,cAAc,GAAG;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,qBAEa,gCAAgC;IACzC,SAAS,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAE7C,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC;IAE1C,SAAS,CAAC,eAAe,CAAC,EAAE,sBAAsB,CAAC;gBAEvC,GAAG,EAAE,uCAAuC;IAMxD;;;;;OAKG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,GAAI,cAAc;IAenD,MAAM,CACI,KAAK,EAAE,SAAS,GAC7B,OAAO,CAAC,kCAAkC,CAAC;IAcxC,IAAI,CACG,IAAI,EAAE,qCAAqC,EACxC,KAAK,EAAE,SAAS,GAC7B,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,CAAA;KAAE,CAAC;IAqBvB,MAAM,CACC,IAAI,EAAE,uCAAuC,EAC1C,KAAK,EAAE,SAAS,GAC7B,OAAO,CAAC,wCAAwC,CAAC;CAuEvD"}
@@ -82,6 +82,7 @@ var AuthenticatorChallengeController = class {
82
82
  ipAddress: getRequestIP(event) ?? null,
83
83
  userAgent: getRequestHeader(event, "user-agent") ?? null,
84
84
  clientId: identity.clientId,
85
+ sessionId: sessionId ?? null,
85
86
  ...session ? { onVerified: async () => {
86
87
  await this.sessionManager.markMfaVerified(session);
87
88
  } } : {}
@@ -1 +1 @@
1
- {"version":3,"file":"module.mjs","names":["DBody","DContext","DController","DGet","DPost","DTags","IdentityType","UserAuthenticatorKind","BadRequestError","EntityCredentialsInvalidError","UnauthorizedError","getRequestHeader","getRequestIP","useRequestIdentity","useRequestLocale","useRequestMfaLoginTicket","useRequestSessionId","AuthenticatorChallengeController","service","sessionManager","mfaLoginService","ctx","resolveActor","event","identity","ticket","status","type","USER","required","enrollmentRequired","kinds","challenge","id","send","data","Object","values","includes","kind","sendChallenge","locale","success","verify","response","sessionId","payload","session_id","session","findOneById","verified","ipAddress","userAgent","clientId","onVerified","markMfaVerified","token","complete","userName","name"],"sources":["../../../../../../src/adapters/http/controllers/workflows/authenticator-challenge/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody,\n DContext,\n DController,\n DGet,\n DPost,\n DTags,\n} from '@routup/decorators';\nimport { IdentityType, UserAuthenticatorKind } from '@authup/core-kit';\nimport { BadRequestError, EntityCredentialsInvalidError, UnauthorizedError } from '@authup/errors';\nimport type { IAppEvent } from 'routup';\nimport { getRequestHeader, getRequestIP } from 'routup';\nimport type {\n UserAuthenticatorChallengeResponse,\n UserAuthenticatorChallengeSendPayload,\n UserAuthenticatorChallengeVerifyPayload,\n UserAuthenticatorChallengeVerifyResponse,\n} from '@authup/core-http-kit';\nimport type { IOAuth2MfaLoginService, ISessionManager, IUserAuthenticatorService } from '../../../../../core/index.ts';\nimport type { RequestIdentity, RequestMfaLoginTicket } from '../../../request/index.ts';\nimport {\n useRequestIdentity,\n useRequestLocale,\n useRequestMfaLoginTicket,\n useRequestSessionId,\n} from '../../../request/index.ts';\n\nexport type AuthenticatorChallengeControllerContext = {\n service: IUserAuthenticatorService,\n sessionManager: ISessionManager,\n mfaLoginService?: IOAuth2MfaLoginService,\n};\n\ntype ChallengeActor = {\n identity: RequestIdentity,\n ticket: RequestMfaLoginTicket | null,\n};\n\n/**\n * Login-time challenge surface, scoped to the CURRENT bearer identity.\n * GET reports whether (and how) the caller must present a second factor;\n * POST verifies a factor and stamps mfa_at onto the backing session so\n * the /authorize backstop passes.\n *\n * Besides a regular access bearer, these routes accept the \"MFA-pending\"\n * login ticket (kind: mfa_token, issue #3242) the password grant issues\n * for factor kinds that cannot ride the single grant POST (email /\n * WebAuthn). A ticket-authenticated verify additionally completes the\n * login: the response carries the full token grant for the now-MFA'd\n * pending session.\n */\n@DTags('userAuthenticator')\n@DController('/authenticators/challenge')\nexport class AuthenticatorChallengeController {\n protected service: IUserAuthenticatorService;\n\n protected sessionManager: ISessionManager;\n\n protected mfaLoginService?: IOAuth2MfaLoginService;\n\n constructor(ctx: AuthenticatorChallengeControllerContext) {\n this.service = ctx.service;\n this.sessionManager = ctx.sessionManager;\n this.mfaLoginService = ctx.mfaLoginService;\n }\n\n /**\n * Resolve the acting subject: the regular request identity (access\n * bearer — the middleware never sets it for a ticket) or the stashed\n * MFA-pending ticket. Anything else is unauthorized — the previous\n * ForceLoggedInMiddleware contract, widened by exactly one bearer kind.\n */\n protected resolveActor(event: IAppEvent) : ChallengeActor {\n const identity = useRequestIdentity(event);\n if (identity) {\n return { identity, ticket: null };\n }\n\n const ticket = useRequestMfaLoginTicket(event);\n if (ticket) {\n return { identity: ticket.identity, ticket };\n }\n\n throw new UnauthorizedError();\n }\n\n @DGet('')\n async status(\n @DContext() event: IAppEvent,\n ): Promise<UserAuthenticatorChallengeResponse> {\n const { identity } = this.resolveActor(event);\n if (identity.type !== IdentityType.USER) {\n return {\n required: false,\n enrollmentRequired: false,\n kinds: [],\n };\n }\n\n return this.service.challenge(identity.id);\n }\n\n @DPost('/send')\n async send(\n @DBody() data: UserAuthenticatorChallengeSendPayload,\n @DContext() event: IAppEvent,\n ): Promise<{ success: true }> {\n const { identity } = this.resolveActor(event);\n if (identity.type !== IdentityType.USER) {\n throw new BadRequestError('Only user identities can request a challenge.');\n }\n\n if (\n !data ||\n !Object.values(UserAuthenticatorKind).includes(data.kind as UserAuthenticatorKind)\n ) {\n throw new BadRequestError('A kind must be provided.');\n }\n\n await this.service.sendChallenge(identity.id, data.kind, { locale: useRequestLocale(event) });\n\n // uniform 200 regardless of whether a code was actually mailed —\n // no enrollment-status oracle for the caller.\n return { success: true };\n }\n\n @DPost('')\n async verify(\n @DBody() data: UserAuthenticatorChallengeVerifyPayload,\n @DContext() event: IAppEvent,\n ): Promise<UserAuthenticatorChallengeVerifyResponse> {\n const { identity, ticket } = this.resolveActor(event);\n if (identity.type !== IdentityType.USER) {\n throw new BadRequestError('Only user identities can complete a challenge.');\n }\n\n if (\n !data ||\n typeof data.response !== 'string' ||\n !data.response ||\n !Object.values(UserAuthenticatorKind).includes(data.kind as UserAuthenticatorKind)\n ) {\n throw new BadRequestError('A kind and response must be provided.');\n }\n\n // Bind the proof to the backing session — the /authorize backstop\n // reads session.mfa_at. The session id is server-derived (stashed\n // by the authorization middleware / carried by the verified ticket),\n // never client input. The stamp runs INSIDE the verify unit of work\n // (before the code consumption persists), so a stamp failure never\n // burns a single-use code.\n const sessionId = ticket ?\n ticket.payload.session_id :\n useRequestSessionId(event);\n const session = sessionId ?\n await this.sessionManager.findOneById(sessionId) :\n null;\n\n // a ticket references exactly one pending session — without it\n // (swept / expired mid-flight) the login can not complete.\n if (ticket && !session) {\n throw new UnauthorizedError();\n }\n\n const verified = await this.service.verify(\n identity.id,\n {\n kind: data.kind,\n response: data.response,\n },\n {\n ipAddress: getRequestIP(event) ?? null,\n userAgent: getRequestHeader(event, 'user-agent') ?? null,\n clientId: identity.clientId,\n ...(session ? {\n onVerified: async () => {\n await this.sessionManager.markMfaVerified(session);\n },\n } : {}),\n },\n );\n if (!verified) {\n throw new EntityCredentialsInvalidError();\n }\n\n // Ticket flow: the factor is verified and mfa_at stamped — complete\n // the login by minting the full grant for the pending session and\n // consuming the ticket (single use).\n if (ticket && session && this.mfaLoginService) {\n const token = await this.mfaLoginService.complete({\n session,\n ticket: ticket.payload,\n userName: identity.data.name,\n });\n\n return { verified: true, token };\n }\n\n return { verified: true };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DA,IAAaiB,mCAAb,MAAaA;CACCC;CAEAC;CAEAC;CAEV,YAAYC,KAA8C;EACtD,KAAKH,UAAUG,IAAIH;EACnB,KAAKC,iBAAiBE,IAAIF;EAC1B,KAAKC,kBAAkBC,IAAID;CAC/B;;;;;;IAQA,aAAuBG,OAAmC;EACtD,MAAMC,WAAWX,mBAAmBU,KAAAA;EACpC,IAAIC,UACA,OAAO;GAAEA;GAAUC,QAAQ;EAAK;EAGpC,MAAMA,SAASV,yBAAyBQ,KAAAA;EACxC,IAAIE,QACA,OAAO;GAAED,UAAUC,OAAOD;GAAUC;EAAO;EAG/C,MAAM,IAAIf,kBAAAA;CACd;CAEA,MACMgB,OACF,OAC2C;EAC3C,MAAM,EAAEF,aAAa,KAAKF,aAAaC,KAAAA;EACvC,IAAIC,SAASG,SAASrB,aAAasB,MAC/B,OAAO;GACHC,UAAU;GACVC,oBAAoB;GACpBC,OAAO,CAAA;EACX;EAGJ,OAAO,KAAKb,QAAQc,UAAUR,SAASS,EAAE;CAC7C;CAEA,MACMC,KACF,MACA,OAC0B;EAC1B,MAAM,EAAEV,aAAa,KAAKF,aAAaC,KAAAA;EACvC,IAAIC,SAASG,SAASrB,aAAasB,MAC/B,MAAM,IAAIpB,gBAAgB,+CAAA;EAG9B,IACI,CAAC2B,QACD,CAACC,OAAOC,OAAO9B,qBAAAA,CAAAA,CAAuB+B,SAASH,KAAKI,IAAI,GAExD,MAAM,IAAI/B,gBAAgB,0BAAA;EAG9B,MAAM,KAAKU,QAAQsB,cAAchB,SAASS,IAAIE,KAAKI,MAAM,EAAEE,QAAQ3B,iBAAiBS,KAAAA,EAAO,CAAA;EAI3F,OAAO,EAAEmB,SAAS,KAAK;CAC3B;CAEA,MACMC,OACF,MACA,OACiD;EACjD,MAAM,EAAEnB,UAAUC,WAAW,KAAKH,aAAaC,KAAAA;EAC/C,IAAIC,SAASG,SAASrB,aAAasB,MAC/B,MAAM,IAAIpB,gBAAgB,gDAAA;EAG9B,IACI,CAAC2B,QACD,OAAOA,KAAKS,aAAa,YACzB,CAACT,KAAKS,YACN,CAACR,OAAOC,OAAO9B,qBAAAA,CAAAA,CAAuB+B,SAASH,KAAKI,IAAI,GAExD,MAAM,IAAI/B,gBAAgB,uCAAA;EAS9B,MAAMqC,YAAYpB,SACdA,OAAOqB,QAAQC,aACf/B,oBAAoBO,KAAAA;EACxB,MAAMyB,UAAUH,YACZ,MAAM,KAAK1B,eAAe8B,YAAYJ,SAAAA,IACtC;EAIJ,IAAIpB,UAAU,CAACuB,SACX,MAAM,IAAItC,kBAAAA;EAoBd,IAAI,CAACwC,MAjBkB,KAAKhC,QAAQyB,OAChCnB,SAASS,IACT;GACIM,MAAMJ,KAAKI;GACXK,UAAUT,KAAKS;EACnB,GACA;GACIO,WAAWvC,aAAaW,KAAAA,KAAU;GAClC6B,WAAWzC,iBAAiBY,OAAO,YAAA,KAAiB;GACpD8B,UAAU7B,SAAS6B;GACnB,GAAIL,UAAU,EACVM,YAAY,YAAA;IACR,MAAM,KAAKnC,eAAeoC,gBAAgBP,OAAAA;GAC9C,EACJ,IAAI,CAAC;EACT,CAAA,GAGA,MAAM,IAAIvC,8BAAAA;EAMd,IAAIgB,UAAUuB,WAAW,KAAK5B,iBAO1B,OAAO;GAAE8B,UAAU;GAAMM,OAAAA,MANL,KAAKpC,gBAAgBqC,SAAS;IAC9CT;IACAvB,QAAQA,OAAOqB;IACfY,UAAUlC,SAASW,KAAKwB;GAC5B,CAAA;EAE+B;EAGnC,OAAO,EAAET,UAAU,KAAK;CAC5B;AACJ"}
1
+ {"version":3,"file":"module.mjs","names":["DBody","DContext","DController","DGet","DPost","DTags","IdentityType","UserAuthenticatorKind","BadRequestError","EntityCredentialsInvalidError","UnauthorizedError","getRequestHeader","getRequestIP","useRequestIdentity","useRequestLocale","useRequestMfaLoginTicket","useRequestSessionId","AuthenticatorChallengeController","service","sessionManager","mfaLoginService","ctx","resolveActor","event","identity","ticket","status","type","USER","required","enrollmentRequired","kinds","challenge","id","send","data","Object","values","includes","kind","sendChallenge","locale","success","verify","response","sessionId","payload","session_id","session","findOneById","verified","ipAddress","userAgent","clientId","onVerified","markMfaVerified","token","complete","userName","name"],"sources":["../../../../../../src/adapters/http/controllers/workflows/authenticator-challenge/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody,\n DContext,\n DController,\n DGet,\n DPost,\n DTags,\n} from '@routup/decorators';\nimport { IdentityType, UserAuthenticatorKind } from '@authup/core-kit';\nimport { BadRequestError, EntityCredentialsInvalidError, UnauthorizedError } from '@authup/errors';\nimport type { IAppEvent } from 'routup';\nimport { getRequestHeader, getRequestIP } from 'routup';\nimport type {\n UserAuthenticatorChallengeResponse,\n UserAuthenticatorChallengeSendPayload,\n UserAuthenticatorChallengeVerifyPayload,\n UserAuthenticatorChallengeVerifyResponse,\n} from '@authup/core-http-kit';\nimport type { IOAuth2MfaLoginService, ISessionManager, IUserAuthenticatorService } from '../../../../../core/index.ts';\nimport type { RequestIdentity, RequestMfaLoginTicket } from '../../../request/index.ts';\nimport {\n useRequestIdentity,\n useRequestLocale,\n useRequestMfaLoginTicket,\n useRequestSessionId,\n} from '../../../request/index.ts';\n\nexport type AuthenticatorChallengeControllerContext = {\n service: IUserAuthenticatorService,\n sessionManager: ISessionManager,\n mfaLoginService?: IOAuth2MfaLoginService,\n};\n\ntype ChallengeActor = {\n identity: RequestIdentity,\n ticket: RequestMfaLoginTicket | null,\n};\n\n/**\n * Login-time challenge surface, scoped to the CURRENT bearer identity.\n * GET reports whether (and how) the caller must present a second factor;\n * POST verifies a factor and stamps mfa_at onto the backing session so\n * the /authorize backstop passes.\n *\n * Besides a regular access bearer, these routes accept the \"MFA-pending\"\n * login ticket (kind: mfa_token, issue #3242) the password grant issues\n * for factor kinds that cannot ride the single grant POST (email /\n * WebAuthn). A ticket-authenticated verify additionally completes the\n * login: the response carries the full token grant for the now-MFA'd\n * pending session.\n */\n@DTags('userAuthenticator')\n@DController('/authenticators/challenge')\nexport class AuthenticatorChallengeController {\n protected service: IUserAuthenticatorService;\n\n protected sessionManager: ISessionManager;\n\n protected mfaLoginService?: IOAuth2MfaLoginService;\n\n constructor(ctx: AuthenticatorChallengeControllerContext) {\n this.service = ctx.service;\n this.sessionManager = ctx.sessionManager;\n this.mfaLoginService = ctx.mfaLoginService;\n }\n\n /**\n * Resolve the acting subject: the regular request identity (access\n * bearer — the middleware never sets it for a ticket) or the stashed\n * MFA-pending ticket. Anything else is unauthorized — the previous\n * ForceLoggedInMiddleware contract, widened by exactly one bearer kind.\n */\n protected resolveActor(event: IAppEvent) : ChallengeActor {\n const identity = useRequestIdentity(event);\n if (identity) {\n return { identity, ticket: null };\n }\n\n const ticket = useRequestMfaLoginTicket(event);\n if (ticket) {\n return { identity: ticket.identity, ticket };\n }\n\n throw new UnauthorizedError();\n }\n\n @DGet('')\n async status(\n @DContext() event: IAppEvent,\n ): Promise<UserAuthenticatorChallengeResponse> {\n const { identity } = this.resolveActor(event);\n if (identity.type !== IdentityType.USER) {\n return {\n required: false,\n enrollmentRequired: false,\n kinds: [],\n };\n }\n\n return this.service.challenge(identity.id);\n }\n\n @DPost('/send')\n async send(\n @DBody() data: UserAuthenticatorChallengeSendPayload,\n @DContext() event: IAppEvent,\n ): Promise<{ success: true }> {\n const { identity } = this.resolveActor(event);\n if (identity.type !== IdentityType.USER) {\n throw new BadRequestError('Only user identities can request a challenge.');\n }\n\n if (\n !data ||\n !Object.values(UserAuthenticatorKind).includes(data.kind as UserAuthenticatorKind)\n ) {\n throw new BadRequestError('A kind must be provided.');\n }\n\n await this.service.sendChallenge(identity.id, data.kind, { locale: useRequestLocale(event) });\n\n // uniform 200 regardless of whether a code was actually mailed —\n // no enrollment-status oracle for the caller.\n return { success: true };\n }\n\n @DPost('')\n async verify(\n @DBody() data: UserAuthenticatorChallengeVerifyPayload,\n @DContext() event: IAppEvent,\n ): Promise<UserAuthenticatorChallengeVerifyResponse> {\n const { identity, ticket } = this.resolveActor(event);\n if (identity.type !== IdentityType.USER) {\n throw new BadRequestError('Only user identities can complete a challenge.');\n }\n\n if (\n !data ||\n typeof data.response !== 'string' ||\n !data.response ||\n !Object.values(UserAuthenticatorKind).includes(data.kind as UserAuthenticatorKind)\n ) {\n throw new BadRequestError('A kind and response must be provided.');\n }\n\n // Bind the proof to the backing session — the /authorize backstop\n // reads session.mfa_at. The session id is server-derived (stashed\n // by the authorization middleware / carried by the verified ticket),\n // never client input. The stamp runs INSIDE the verify unit of work\n // (before the code consumption persists), so a stamp failure never\n // burns a single-use code.\n const sessionId = ticket ?\n ticket.payload.session_id :\n useRequestSessionId(event);\n const session = sessionId ?\n await this.sessionManager.findOneById(sessionId) :\n null;\n\n // a ticket references exactly one pending session — without it\n // (swept / expired mid-flight) the login can not complete.\n if (ticket && !session) {\n throw new UnauthorizedError();\n }\n\n const verified = await this.service.verify(\n identity.id,\n {\n kind: data.kind,\n response: data.response,\n },\n {\n ipAddress: getRequestIP(event) ?? null,\n userAgent: getRequestHeader(event, 'user-agent') ?? null,\n clientId: identity.clientId,\n sessionId: sessionId ?? null,\n ...(session ? {\n onVerified: async () => {\n await this.sessionManager.markMfaVerified(session);\n },\n } : {}),\n },\n );\n if (!verified) {\n throw new EntityCredentialsInvalidError();\n }\n\n // Ticket flow: the factor is verified and mfa_at stamped — complete\n // the login by minting the full grant for the pending session and\n // consuming the ticket (single use).\n if (ticket && session && this.mfaLoginService) {\n const token = await this.mfaLoginService.complete({\n session,\n ticket: ticket.payload,\n userName: identity.data.name,\n });\n\n return { verified: true, token };\n }\n\n return { verified: true };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DA,IAAaiB,mCAAb,MAAaA;CACCC;CAEAC;CAEAC;CAEV,YAAYC,KAA8C;EACtD,KAAKH,UAAUG,IAAIH;EACnB,KAAKC,iBAAiBE,IAAIF;EAC1B,KAAKC,kBAAkBC,IAAID;CAC/B;;;;;;IAQA,aAAuBG,OAAmC;EACtD,MAAMC,WAAWX,mBAAmBU,KAAAA;EACpC,IAAIC,UACA,OAAO;GAAEA;GAAUC,QAAQ;EAAK;EAGpC,MAAMA,SAASV,yBAAyBQ,KAAAA;EACxC,IAAIE,QACA,OAAO;GAAED,UAAUC,OAAOD;GAAUC;EAAO;EAG/C,MAAM,IAAIf,kBAAAA;CACd;CAEA,MACMgB,OACF,OAC2C;EAC3C,MAAM,EAAEF,aAAa,KAAKF,aAAaC,KAAAA;EACvC,IAAIC,SAASG,SAASrB,aAAasB,MAC/B,OAAO;GACHC,UAAU;GACVC,oBAAoB;GACpBC,OAAO,CAAA;EACX;EAGJ,OAAO,KAAKb,QAAQc,UAAUR,SAASS,EAAE;CAC7C;CAEA,MACMC,KACF,MACA,OAC0B;EAC1B,MAAM,EAAEV,aAAa,KAAKF,aAAaC,KAAAA;EACvC,IAAIC,SAASG,SAASrB,aAAasB,MAC/B,MAAM,IAAIpB,gBAAgB,+CAAA;EAG9B,IACI,CAAC2B,QACD,CAACC,OAAOC,OAAO9B,qBAAAA,CAAAA,CAAuB+B,SAASH,KAAKI,IAAI,GAExD,MAAM,IAAI/B,gBAAgB,0BAAA;EAG9B,MAAM,KAAKU,QAAQsB,cAAchB,SAASS,IAAIE,KAAKI,MAAM,EAAEE,QAAQ3B,iBAAiBS,KAAAA,EAAO,CAAA;EAI3F,OAAO,EAAEmB,SAAS,KAAK;CAC3B;CAEA,MACMC,OACF,MACA,OACiD;EACjD,MAAM,EAAEnB,UAAUC,WAAW,KAAKH,aAAaC,KAAAA;EAC/C,IAAIC,SAASG,SAASrB,aAAasB,MAC/B,MAAM,IAAIpB,gBAAgB,gDAAA;EAG9B,IACI,CAAC2B,QACD,OAAOA,KAAKS,aAAa,YACzB,CAACT,KAAKS,YACN,CAACR,OAAOC,OAAO9B,qBAAAA,CAAAA,CAAuB+B,SAASH,KAAKI,IAAI,GAExD,MAAM,IAAI/B,gBAAgB,uCAAA;EAS9B,MAAMqC,YAAYpB,SACdA,OAAOqB,QAAQC,aACf/B,oBAAoBO,KAAAA;EACxB,MAAMyB,UAAUH,YACZ,MAAM,KAAK1B,eAAe8B,YAAYJ,SAAAA,IACtC;EAIJ,IAAIpB,UAAU,CAACuB,SACX,MAAM,IAAItC,kBAAAA;EAqBd,IAAI,CAACwC,MAlBkB,KAAKhC,QAAQyB,OAChCnB,SAASS,IACT;GACIM,MAAMJ,KAAKI;GACXK,UAAUT,KAAKS;EACnB,GACA;GACIO,WAAWvC,aAAaW,KAAAA,KAAU;GAClC6B,WAAWzC,iBAAiBY,OAAO,YAAA,KAAiB;GACpD8B,UAAU7B,SAAS6B;GACnBR,WAAWA,aAAa;GACxB,GAAIG,UAAU,EACVM,YAAY,YAAA;IACR,MAAM,KAAKnC,eAAeoC,gBAAgBP,OAAAA;GAC9C,EACJ,IAAI,CAAC;EACT,CAAA,GAGA,MAAM,IAAIvC,8BAAAA;EAMd,IAAIgB,UAAUuB,WAAW,KAAK5B,iBAO1B,OAAO;GAAE8B,UAAU;GAAMM,OAAAA,MANL,KAAKpC,gBAAgBqC,SAAS;IAC9CT;IACAvB,QAAQA,OAAOqB;IACfY,UAAUlC,SAASW,KAAKwB;GAC5B,CAAA;EAE+B;EAGnC,OAAO,EAAET,UAAU,KAAK;CAC5B;AACJ"}
@@ -57,6 +57,7 @@ import { ClientScopeRequestValidator } from "./controllers/entities/client-scope
57
57
  import { ConsentController } from "./controllers/entities/consent/module.mjs";
58
58
  import { EventController } from "./controllers/entities/event/module.mjs";
59
59
  import { IdentityProviderController } from "./controllers/entities/identity-provider/module.mjs";
60
+ import { IdentityProviderAccountController } from "./controllers/entities/identity-provider-account/module.mjs";
60
61
  import { IdentityProviderRoleMappingController } from "./controllers/entities/identity-provide-role/module.mjs";
61
62
  import { KeyController } from "./controllers/entities/key/module.mjs";
62
63
  import { PermissionController } from "./controllers/entities/permission/module.mjs";
@@ -86,6 +87,7 @@ import { PolicyAttributesValidator } from "./controllers/entities/policy/utils/a
86
87
  import { PolicyValidator } from "./controllers/entities/policy/utils/validation.mjs";
87
88
  import { ScopeController } from "./controllers/entities/scope/module.mjs";
88
89
  import { SessionController } from "./controllers/entities/session/module.mjs";
90
+ import { SessionTokenController } from "./controllers/entities/session-token/module.mjs";
89
91
  import { TrustAnchorController } from "./controllers/entities/trust-anchor/module.mjs";
90
92
  import { UserController } from "./controllers/entities/user/module.mjs";
91
93
  import { UserAttributeController } from "./controllers/entities/user-attribute/module.mjs";
@@ -96,4 +98,4 @@ import { UserPermissionRequestValidator } from "./controllers/entities/user-perm
96
98
  import { UserRoleController } from "./controllers/entities/user-role/module.mjs";
97
99
  import { UserRoleRequestValidator } from "./controllers/entities/user-role/utils/validation.mjs";
98
100
  import "./controllers/index.mjs";
99
- export { AccountController, ActivateController, AuthenticatorChallengeController, AuthorizationMiddleware, AuthorizeController, CERTIFICATE_SOURCES, ClientController, ClientPermissionController, ClientPermissionRequestValidator, ClientRoleController, ClientRoleRequestValidator, ClientScopeController, ClientScopeRequestValidator, ConsentController, EventController, ForceLoggedInMiddleware, ForceUserLoggedInMiddleware, HTTPClientCredentialsGrant, HTTPOAuth2AuthorizeGrant, HTTPOAuth2Authorizer, HTTPOAuth2IdentityGrantType, HTTPOAuth2RefreshTokenGrant, HTTPPasswordGrant, IdentityProviderController, IdentityProviderRoleMappingController, JwkController, KeyController, LOCALE_COOKIE, LogoutController, OpenIDController, PasswordForgotController, PasswordResetController, PermissionController, PermissionPolicyController, PolicyAttributesValidator, PolicyController, PolicyValidator, RealmController, RealmResolverMiddleware, RegisterController, RequestHandlerOperation, RequestIdentity, RequestPermissionEvaluator, RoleAttributeController, RoleAttributeRequestValidator, RoleController, RolePermissionController, RolePermissionRequestValidator, ScopeController, SessionController, StatusController, THEME_STORE_KEY, TokenController, TrustAnchorController, UI_HTTP_CLIENT_FACTORY_STORE_KEY, UserAttributeController, UserAttributeRequestValidator, UserAuthenticatorController, UserController, UserInfoController, UserPermissionController, UserPermissionRequestValidator, UserRoleController, UserRoleRequestValidator, VITE_SERVER_STORE_KEY, applyRouteRealmIDToBody, buildActorContext, createAuthorizationMiddleware, createLoggerMiddleware, createRealmResolverMiddleware, createRequestEventContextMiddleware, createRouteTemplateNormalizePath, createSwaggerMiddleware, extractClientCertificateEvidence, extractClientCredentialsFromRequest, extractOAuth2ClientCertificateEvidence, getBodyRealmID, getJwkRouteHandler, getJwksRouteHandler, getRequestParamID, getRequestRealmID, getRequestStringParam, getRequestStringParamOrFail, guessOauth2GrantTypeByRequest, readFromLocations, readRealmHint, readStringField, redactSensitiveURLParams, registerAssetsMiddleware, registerBasicMiddleware, registerCorsMiddleware, registerErrorMiddleware, registerPrometheusMiddleware, registerRateLimitMiddleware, registerThemeMiddleware, registerUIHttpClientMiddleware, runWithRequestEventContext, sanitizeRelativeRedirect, setRequestIdentity, setRequestMfaLoginTicket, setRequestPermissionEvaluator, setRequestRealmID, setRequestScopes, setRequestSessionId, setRequestToken, useRequestEventContext, useRequestIdentity, useRequestIdentityOrFail, useRequestLocale, useRequestMfaLoginTicket, useRequestParamID, useRequestPermissionEvaluator, useRequestScopes, useRequestSessionId, useRequestTheme, useRequestToken };
101
+ export { AccountController, ActivateController, AuthenticatorChallengeController, AuthorizationMiddleware, AuthorizeController, CERTIFICATE_SOURCES, ClientController, ClientPermissionController, ClientPermissionRequestValidator, ClientRoleController, ClientRoleRequestValidator, ClientScopeController, ClientScopeRequestValidator, ConsentController, EventController, ForceLoggedInMiddleware, ForceUserLoggedInMiddleware, HTTPClientCredentialsGrant, HTTPOAuth2AuthorizeGrant, HTTPOAuth2Authorizer, HTTPOAuth2IdentityGrantType, HTTPOAuth2RefreshTokenGrant, HTTPPasswordGrant, IdentityProviderAccountController, IdentityProviderController, IdentityProviderRoleMappingController, JwkController, KeyController, LOCALE_COOKIE, LogoutController, OpenIDController, PasswordForgotController, PasswordResetController, PermissionController, PermissionPolicyController, PolicyAttributesValidator, PolicyController, PolicyValidator, RealmController, RealmResolverMiddleware, RegisterController, RequestHandlerOperation, RequestIdentity, RequestPermissionEvaluator, RoleAttributeController, RoleAttributeRequestValidator, RoleController, RolePermissionController, RolePermissionRequestValidator, ScopeController, SessionController, SessionTokenController, StatusController, THEME_STORE_KEY, TokenController, TrustAnchorController, UI_HTTP_CLIENT_FACTORY_STORE_KEY, UserAttributeController, UserAttributeRequestValidator, UserAuthenticatorController, UserController, UserInfoController, UserPermissionController, UserPermissionRequestValidator, UserRoleController, UserRoleRequestValidator, VITE_SERVER_STORE_KEY, applyRouteRealmIDToBody, buildActorContext, createAuthorizationMiddleware, createLoggerMiddleware, createRealmResolverMiddleware, createRequestEventContextMiddleware, createRouteTemplateNormalizePath, createSwaggerMiddleware, extractClientCertificateEvidence, extractClientCredentialsFromRequest, extractOAuth2ClientCertificateEvidence, getBodyRealmID, getJwkRouteHandler, getJwksRouteHandler, getRequestParamID, getRequestRealmID, getRequestStringParam, getRequestStringParamOrFail, guessOauth2GrantTypeByRequest, readFromLocations, readRealmHint, readStringField, redactSensitiveURLParams, registerAssetsMiddleware, registerBasicMiddleware, registerCorsMiddleware, registerErrorMiddleware, registerPrometheusMiddleware, registerRateLimitMiddleware, registerThemeMiddleware, registerUIHttpClientMiddleware, runWithRequestEventContext, sanitizeRelativeRedirect, setRequestIdentity, setRequestMfaLoginTicket, setRequestPermissionEvaluator, setRequestRealmID, setRequestScopes, setRequestSessionId, setRequestToken, useRequestEventContext, useRequestIdentity, useRequestIdentityOrFail, useRequestLocale, useRequestMfaLoginTicket, useRequestParamID, useRequestPermissionEvaluator, useRequestScopes, useRequestSessionId, useRequestTheme, useRequestToken };
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/http/middleware/built-in/error.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAIjD,KAAK,sBAAsB,GAAG;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,GAAE,sBAA2B,QAiBxF"}
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/http/middleware/built-in/error.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAIjD,KAAK,sBAAsB,GAAG;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,GAAE,sBAA2B,QAyBxF"}
@@ -1,18 +1,19 @@
1
1
  import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
- import { sanitizeError } from "../../../../utils/error.mjs";
4
+ import { describeError, sanitizeError } from "../../../../utils/error.mjs";
5
5
  import "../../../../utils/index.mjs";
6
6
  import { httpStatusFromCode, serializeError } from "@authup/errors";
7
7
  import { defineErrorHandler } from "routup";
8
8
  //#region src/adapters/http/middleware/built-in/error.ts
9
9
  function registerErrorMiddleware(router, options = {}) {
10
10
  router.use(defineErrorHandler((error, event) => {
11
- const next = sanitizeError(error.cause ?? error);
11
+ const original = error.cause ?? error;
12
+ const next = sanitizeError(original);
12
13
  const status = httpStatusFromCode(next.code);
13
14
  const payload = serializeError(next);
14
15
  if (status >= 500) {
15
- if (options.logger) options.logger.error(next);
16
+ if (options.logger) options.logger.error(describeError(original));
16
17
  payload.message = "An internal server error occurred.";
17
18
  }
18
19
  event.response.status = status;
@@ -1 +1 @@
1
- {"version":3,"file":"error.mjs","names":["defineErrorHandler","httpStatusFromCode","serializeError","sanitizeError","registerErrorMiddleware","router","options","use","error","event","next","cause","status","code","payload","logger","message","response"],"sources":["../../../../../src/adapters/http/middleware/built-in/error.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { App } from 'routup';\nimport { defineErrorHandler } from 'routup';\nimport type { Logger } from '@authup/server-kit';\nimport { httpStatusFromCode, serializeError } from '@authup/errors';\nimport { sanitizeError } from '../../../../utils/index.ts';\n\ntype ErrorMiddlewareOptions = {\n logger?: Logger\n};\n\nexport function registerErrorMiddleware(router: App, options: ErrorMiddlewareOptions = {}) {\n router.use(defineErrorHandler((error, event) => {\n const next = sanitizeError(error.cause ?? error);\n const status = httpStatusFromCode(next.code);\n\n const payload = serializeError(next);\n\n if (status >= 500) {\n if (options.logger) {\n options.logger.error(next);\n }\n payload.message = 'An internal server error occurred.';\n }\n\n event.response.status = status;\n return payload;\n }));\n}\n"],"mappings":";;;;;;;;AAiBA,SAAgBI,wBAAwBC,QAAaC,UAAkC,CAAC,GAAC;CACrFD,OAAOE,IAAIP,oBAAoBQ,OAAOC,UAAAA;EAClC,MAAMC,OAAOP,cAAcK,MAAMG,SAASH,KAAAA;EAC1C,MAAMI,SAASX,mBAAmBS,KAAKG,IAAI;EAE3C,MAAMC,UAAUZ,eAAeQ,IAAAA;EAE/B,IAAIE,UAAU,KAAK;GACf,IAAIN,QAAQS,QACRT,QAAQS,OAAOP,MAAME,IAAAA;GAEzBI,QAAQE,UAAU;EACtB;EAEAP,MAAMQ,SAASL,SAASA;EACxB,OAAOE;CACX,CAAA,CAAA;AACJ"}
1
+ {"version":3,"file":"error.mjs","names":["defineErrorHandler","httpStatusFromCode","serializeError","describeError","sanitizeError","registerErrorMiddleware","router","options","use","error","event","original","cause","next","status","code","payload","logger","message","response"],"sources":["../../../../../src/adapters/http/middleware/built-in/error.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { App } from 'routup';\nimport { defineErrorHandler } from 'routup';\nimport type { Logger } from '@authup/server-kit';\nimport { httpStatusFromCode, serializeError } from '@authup/errors';\nimport { describeError, sanitizeError } from '../../../../utils/index.ts';\n\ntype ErrorMiddlewareOptions = {\n logger?: Logger\n};\n\nexport function registerErrorMiddleware(router: App, options: ErrorMiddlewareOptions = {}) {\n router.use(defineErrorHandler((error, event) => {\n // routup wraps whatever a handler threw into an AppError carrying it\n // as `cause`, so this is the error as it was actually raised.\n const original = error.cause ?? error;\n\n const next = sanitizeError(original);\n const status = httpStatusFromCode(next.code);\n\n const payload = serializeError(next);\n\n if (status >= 500) {\n if (options.logger) {\n // The ORIGINAL error, never the sanitized copy. Sanitizing\n // discards the transport reason and the upstream response\n // body on purpose, and those are the only things that make\n // an outbound failure diagnosable.\n options.logger.error(describeError(original));\n }\n payload.message = 'An internal server error occurred.';\n }\n\n event.response.status = status;\n return payload;\n }));\n}\n"],"mappings":";;;;;;;;AAiBA,SAAgBK,wBAAwBC,QAAaC,UAAkC,CAAC,GAAC;CACrFD,OAAOE,IAAIR,oBAAoBS,OAAOC,UAAAA;EAGlC,MAAMC,WAAWF,MAAMG,SAASH;EAEhC,MAAMI,OAAOT,cAAcO,QAAAA;EAC3B,MAAMG,SAASb,mBAAmBY,KAAKE,IAAI;EAE3C,MAAMC,UAAUd,eAAeW,IAAAA;EAE/B,IAAIC,UAAU,KAAK;GACf,IAAIP,QAAQU,QAKRV,QAAQU,OAAOR,MAAMN,cAAcQ,QAAAA,CAAAA;GAEvCK,QAAQE,UAAU;EACtB;EAEAR,MAAMS,SAASL,SAASA;EACxB,OAAOE;CACX,CAAA,CAAA;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"event-context.d.ts","sourceRoot":"","sources":["../../../../src/adapters/http/request/event-context.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAGlE;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAItD,wBAAgB,0BAA0B,CAAC,CAAC,EACxC,GAAG,EAAE,mBAAmB,EACxB,EAAE,EAAE,MAAM,CAAC,GACZ,CAAC,CAEH;AAED,wBAAgB,sBAAsB,IAAI,mBAAmB,GAAG,SAAS,CAExE;AAED;;;;GAIG;AACH,wBAAgB,mCAAmC,IAAK,OAAO,CAgB9D"}
1
+ {"version":3,"file":"event-context.d.ts","sourceRoot":"","sources":["../../../../src/adapters/http/request/event-context.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAGlE;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAItD,wBAAgB,0BAA0B,CAAC,CAAC,EACxC,GAAG,EAAE,mBAAmB,EACxB,EAAE,EAAE,MAAM,CAAC,GACZ,CAAC,CAEH;AAED,wBAAgB,sBAAsB,IAAI,mBAAmB,GAAG,SAAS,CAExE;AAED;;;;GAIG;AACH,wBAAgB,mCAAmC,IAAK,OAAO,CAiB9D"}
@@ -2,6 +2,7 @@ import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
4
  import { useRequestIdentity } from "./helpers/identity.mjs";
5
+ import { useRequestSessionId } from "./helpers/session-id.mjs";
5
6
  import "./helpers/index.mjs";
6
7
  import { AsyncLocalStorage } from "node:async_hooks";
7
8
  import { defineCoreHandler, getRequestHeader, getRequestIP } from "routup";
@@ -24,6 +25,7 @@ function useRequestEventContext() {
24
25
  actorType: identity ? identity.type : null,
25
26
  actorId: identity ? identity.id : null,
26
27
  actorName: identity ? identity.data.name ?? null : null,
28
+ sessionId: useRequestSessionId(event) ?? null,
27
29
  requestPath: event.path,
28
30
  requestMethod: event.method,
29
31
  requestIpAddress: getRequestIP(event) ?? null,
@@ -1 +1 @@
1
- {"version":3,"file":"event-context.mjs","names":["AsyncLocalStorage","defineCoreHandler","getRequestHeader","getRequestIP","useRequestIdentity","storage","runWithRequestEventContext","ctx","fn","run","useRequestEventContext","getStore","createRequestEventContextMiddleware","event","identity","actorType","type","actorId","id","actorName","data","name","requestPath","path","requestMethod","method","requestIpAddress","requestUserAgent","next"],"sources":["../../../../src/adapters/http/request/event-context.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { defineCoreHandler, getRequestHeader, getRequestIP } from 'routup';\nimport type { Handler } from 'routup';\nimport type { EventRequestContext } from '../../../core/index.ts';\nimport { useRequestIdentity } from './helpers/index.ts';\n\n/**\n * Actor + request attribution snapshot for entity-CRUD audit rows, carried\n * across the request's async continuation via AsyncLocalStorage so the\n * database subscribers (which have no request handle) can attribute their\n * writes. Writes outside HTTP (provisioning, CLI, cron) have no store —\n * the getter returns undefined, the correct \"system\" semantics.\n */\nexport type RequestEventContext = EventRequestContext;\n\nconst storage = new AsyncLocalStorage<RequestEventContext>();\n\nexport function runWithRequestEventContext<R>(\n ctx: RequestEventContext,\n fn: () => R,\n): R {\n return storage.run(ctx, fn);\n}\n\nexport function useRequestEventContext(): RequestEventContext | undefined {\n return storage.getStore();\n}\n\n/**\n * Builds the {@link RequestEventContext} from the routup event and wraps the\n * downstream pipeline in it. Must be mounted AFTER the authorization\n * middleware — the identity has to be resolved for actor attribution.\n */\nexport function createRequestEventContextMiddleware() : Handler {\n return defineCoreHandler(async (event) => {\n const identity = useRequestIdentity(event);\n\n const ctx : RequestEventContext = {\n actorType: identity ? identity.type : null,\n actorId: identity ? identity.id : null,\n actorName: identity ? identity.data.name ?? null : null,\n requestPath: event.path,\n requestMethod: event.method,\n requestIpAddress: getRequestIP(event) ?? null,\n requestUserAgent: getRequestHeader(event, 'user-agent') ?? null,\n };\n\n return runWithRequestEventContext(ctx, () => event.next());\n });\n}\n"],"mappings":";;;;;;;;AAsBA,MAAMK,UAAU,IAAIL,kBAAAA;AAEpB,SAAgBM,2BACZC,KACAC,IAAW;CAEX,OAAOH,QAAQI,IAAIF,KAAKC,EAAAA;AAC5B;AAEA,SAAgBE,yBAAAA;CACZ,OAAOL,QAAQM,SAAQ;AAC3B;;;;;GAOA,SAAgBC,sCAAAA;CACZ,OAAOX,kBAAkB,OAAOY,UAAAA;EAC5B,MAAMC,WAAWV,mBAAmBS,KAAAA;EAYpC,OAAOP,2BAA2BC;GAT9BQ,WAAWD,WAAWA,SAASE,OAAO;GACtCC,SAASH,WAAWA,SAASI,KAAK;GAClCC,WAAWL,WAAWA,SAASM,KAAKC,QAAQ,OAAO;GACnDC,aAAaT,MAAMU;GACnBC,eAAeX,MAAMY;GACrBC,kBAAkBvB,aAAaU,KAAAA,KAAU;GACzCc,kBAAkBzB,iBAAiBW,OAAO,YAAA,KAAiB;EAG7BN,SAAWM,MAAMe,KAAI,CAAA;CAC3D,CAAA;AACJ"}
1
+ {"version":3,"file":"event-context.mjs","names":["AsyncLocalStorage","defineCoreHandler","getRequestHeader","getRequestIP","useRequestIdentity","useRequestSessionId","storage","runWithRequestEventContext","ctx","fn","run","useRequestEventContext","getStore","createRequestEventContextMiddleware","event","identity","actorType","type","actorId","id","actorName","data","name","sessionId","requestPath","path","requestMethod","method","requestIpAddress","requestUserAgent","next"],"sources":["../../../../src/adapters/http/request/event-context.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { defineCoreHandler, getRequestHeader, getRequestIP } from 'routup';\nimport type { Handler } from 'routup';\nimport type { EventRequestContext } from '../../../core/index.ts';\nimport { useRequestIdentity, useRequestSessionId } from './helpers/index.ts';\n\n/**\n * Actor + request attribution snapshot for entity-CRUD audit rows, carried\n * across the request's async continuation via AsyncLocalStorage so the\n * database subscribers (which have no request handle) can attribute their\n * writes. Writes outside HTTP (provisioning, CLI, cron) have no store —\n * the getter returns undefined, the correct \"system\" semantics.\n */\nexport type RequestEventContext = EventRequestContext;\n\nconst storage = new AsyncLocalStorage<RequestEventContext>();\n\nexport function runWithRequestEventContext<R>(\n ctx: RequestEventContext,\n fn: () => R,\n): R {\n return storage.run(ctx, fn);\n}\n\nexport function useRequestEventContext(): RequestEventContext | undefined {\n return storage.getStore();\n}\n\n/**\n * Builds the {@link RequestEventContext} from the routup event and wraps the\n * downstream pipeline in it. Must be mounted AFTER the authorization\n * middleware — the identity has to be resolved for actor attribution.\n */\nexport function createRequestEventContextMiddleware() : Handler {\n return defineCoreHandler(async (event) => {\n const identity = useRequestIdentity(event);\n\n const ctx : RequestEventContext = {\n actorType: identity ? identity.type : null,\n actorId: identity ? identity.id : null,\n actorName: identity ? identity.data.name ?? null : null,\n sessionId: useRequestSessionId(event) ?? null,\n requestPath: event.path,\n requestMethod: event.method,\n requestIpAddress: getRequestIP(event) ?? null,\n requestUserAgent: getRequestHeader(event, 'user-agent') ?? null,\n };\n\n return runWithRequestEventContext(ctx, () => event.next());\n });\n}\n"],"mappings":";;;;;;;;;AAsBA,MAAMM,UAAU,IAAIN,kBAAAA;AAEpB,SAAgBO,2BACZC,KACAC,IAAW;CAEX,OAAOH,QAAQI,IAAIF,KAAKC,EAAAA;AAC5B;AAEA,SAAgBE,yBAAAA;CACZ,OAAOL,QAAQM,SAAQ;AAC3B;;;;;GAOA,SAAgBC,sCAAAA;CACZ,OAAOZ,kBAAkB,OAAOa,UAAAA;EAC5B,MAAMC,WAAWX,mBAAmBU,KAAAA;EAapC,OAAOP,2BAA2BC;GAV9BQ,WAAWD,WAAWA,SAASE,OAAO;GACtCC,SAASH,WAAWA,SAASI,KAAK;GAClCC,WAAWL,WAAWA,SAASM,KAAKC,QAAQ,OAAO;GACnDC,WAAWlB,oBAAoBS,KAAAA,KAAU;GACzCU,aAAaV,MAAMW;GACnBC,eAAeZ,MAAMa;GACrBC,kBAAkBzB,aAAaW,KAAAA,KAAU;GACzCe,kBAAkB3B,iBAAiBY,OAAO,YAAA,KAAiB;EAG7BN,SAAWM,MAAMgB,KAAI,CAAA;CAC3D,CAAA;AACJ"}
@@ -21,6 +21,7 @@ import { ClientRoleRepositoryAdapter } from "./modules/database/repositories/cli
21
21
  import { ClientScopeRepositoryAdapter } from "./modules/database/repositories/client-scope/repository.mjs";
22
22
  import { EventRepositoryAdapter } from "./modules/database/repositories/event/repository.mjs";
23
23
  import { IdentityProviderRepositoryAdapter } from "./modules/database/repositories/identity-provider/repository.mjs";
24
+ import { IdentityProviderAccountRepositoryAdapter } from "./modules/database/repositories/identity-provider-account/repository.mjs";
24
25
  import { KeyRepositoryAdapter } from "./modules/database/repositories/key/repository.mjs";
25
26
  import { PermissionRepositoryAdapter } from "./modules/database/repositories/permission/repository.mjs";
26
27
  import { PermissionPolicyRepositoryAdapter } from "./modules/database/repositories/permission-policy/repository.mjs";
@@ -47,10 +48,11 @@ import { MetricsInjectionKey } from "./modules/metrics/constants.mjs";
47
48
  import { PromAuthFlowMetrics } from "./modules/metrics/prom.mjs";
48
49
  import { OAuth2InjectionToken } from "./modules/oauth2/constants.mjs";
49
50
  import { IdentityInjectionKey } from "./modules/identity/constants.mjs";
50
- import { IdentityProviderAccountRepository } from "./modules/identity/repositories/provider/account/module.mjs";
51
51
  import { IdentityProviderAttributeMappingRepository } from "./modules/identity/repositories/provider/mapper/attribute.mjs";
52
52
  import { IdentityProviderPermissionMappingRepository } from "./modules/identity/repositories/provider/mapper/permission.mjs";
53
53
  import { IdentityProviderRoleMappingRepository } from "./modules/identity/repositories/provider/mapper/role.mjs";
54
+ import { CacheIdentityPrefix } from "./modules/identity/repositories/constants.mjs";
55
+ import { IdentityProviderAccountLinkStore } from "./modules/identity/repositories/provider/link.mjs";
54
56
  import { ClientIdentityRepository } from "./modules/identity/repositories/client.mjs";
55
57
  import { UserIdentityRepository } from "./modules/identity/repositories/user.mjs";
56
58
  import { LDAPInjectionKey } from "./modules/ldap/constants.mjs";
@@ -70,4 +72,4 @@ import { RuntimeModule } from "./modules/runtime/module.mjs";
70
72
  import "./modules/index.mjs";
71
73
  import { ApplicationBuilder } from "./builder.mjs";
72
74
  import { createApplication } from "./factory.mjs";
73
- export { ApplicationBuilder, AuthenticationInjectionKey, AuthenticationModule, CacheInjectionKey, CacheModule, ClientIdentityRepository, ClientPermissionRepositoryAdapter, ClientRepositoryAdapter, ClientRoleRepositoryAdapter, ClientScopeRepositoryAdapter, ComponentsModule, CompositeProvisioningSource, ConfigEnvironmentVariableName, ConfigInjectionKey, ConfigModule, DatabaseInjectionKey, DatabaseModule, DefaultProvisioningSource, EventRepositoryAdapter, FileProvisioningSource, HTTPInjectionKey, HTTPModule, IdentityInjectionKey, IdentityModule, IdentityProviderAccountRepository, IdentityProviderAttributeMappingRepository, IdentityProviderPermissionMappingRepository, IdentityProviderRepositoryAdapter, IdentityProviderRoleMappingRepository, IdentityProviderRoleMappingRepositoryAdapter, KeyRepositoryAdapter, LDAPInjectionKey, LazyWildcardRealmProvisioner, LdapModule, LoggerInjectionKey, LoggerModule, MailInjectionKey, MailModule, MailTemplateRendererInjectionKey, MetricsInjectionKey, ModuleName, OAuth2InjectionToken, OAuth2Module, PermissionDatabaseProvider, PermissionPolicyRepositoryAdapter, PermissionRepositoryAdapter, PolicyRepositoryAdapter, PromAuthFlowMetrics, ProvisionerModule, ProvisioningInjectionKey, RealmRepositoryAdapter, RoleAttributeRepositoryAdapter, RolePermissionRepositoryAdapter, RoleRepositoryAdapter, RuntimeModule, ScopeRepositoryAdapter, SessionRepository, TrustAnchorRepositoryAdapter, UserAttributeRepositoryAdapter, UserAuthenticatorRepositoryAdapter, UserIdentityRepository, UserPermissionRepositoryAdapter, UserRepositoryAdapter, UserRoleRepositoryAdapter, createApplication, expandToOrigins, getAppOrigins, readConfig, readConfigRaw, readConfigRawFromEnv, readConfigRawFromFS };
75
+ export { ApplicationBuilder, AuthenticationInjectionKey, AuthenticationModule, CacheIdentityPrefix, CacheInjectionKey, CacheModule, ClientIdentityRepository, ClientPermissionRepositoryAdapter, ClientRepositoryAdapter, ClientRoleRepositoryAdapter, ClientScopeRepositoryAdapter, ComponentsModule, CompositeProvisioningSource, ConfigEnvironmentVariableName, ConfigInjectionKey, ConfigModule, DatabaseInjectionKey, DatabaseModule, DefaultProvisioningSource, EventRepositoryAdapter, FileProvisioningSource, HTTPInjectionKey, HTTPModule, IdentityInjectionKey, IdentityModule, IdentityProviderAccountLinkStore, IdentityProviderAccountRepositoryAdapter, IdentityProviderAttributeMappingRepository, IdentityProviderPermissionMappingRepository, IdentityProviderRepositoryAdapter, IdentityProviderRoleMappingRepository, IdentityProviderRoleMappingRepositoryAdapter, KeyRepositoryAdapter, LDAPInjectionKey, LazyWildcardRealmProvisioner, LdapModule, LoggerInjectionKey, LoggerModule, MailInjectionKey, MailModule, MailTemplateRendererInjectionKey, MetricsInjectionKey, ModuleName, OAuth2InjectionToken, OAuth2Module, PermissionDatabaseProvider, PermissionPolicyRepositoryAdapter, PermissionRepositoryAdapter, PolicyRepositoryAdapter, PromAuthFlowMetrics, ProvisionerModule, ProvisioningInjectionKey, RealmRepositoryAdapter, RoleAttributeRepositoryAdapter, RolePermissionRepositoryAdapter, RoleRepositoryAdapter, RuntimeModule, ScopeRepositoryAdapter, SessionRepository, TrustAnchorRepositoryAdapter, UserAttributeRepositoryAdapter, UserAuthenticatorRepositoryAdapter, UserIdentityRepository, UserPermissionRepositoryAdapter, UserRepositoryAdapter, UserRoleRepositoryAdapter, createApplication, expandToOrigins, getAppOrigins, readConfig, readConfigRaw, readConfigRawFromEnv, readConfigRawFromFS };
@@ -8,6 +8,7 @@ import { ClientRoleRepositoryAdapter } from "./repositories/client-role/reposito
8
8
  import { ClientScopeRepositoryAdapter } from "./repositories/client-scope/repository.mjs";
9
9
  import { EventRepositoryAdapter } from "./repositories/event/repository.mjs";
10
10
  import { IdentityProviderRepositoryAdapter } from "./repositories/identity-provider/repository.mjs";
11
+ import { IdentityProviderAccountRepositoryAdapter } from "./repositories/identity-provider-account/repository.mjs";
11
12
  import { KeyRepositoryAdapter } from "./repositories/key/repository.mjs";
12
13
  import { PermissionRepositoryAdapter } from "./repositories/permission/repository.mjs";
13
14
  import { PermissionPolicyRepositoryAdapter } from "./repositories/permission-policy/repository.mjs";
@@ -27,4 +28,4 @@ import { IdentityProviderRoleMappingRepositoryAdapter } from "./repositories/ide
27
28
  import "./repositories/index.mjs";
28
29
  import { DatabaseInjectionKey } from "./constants.mjs";
29
30
  import { DatabaseModule } from "./module.mjs";
30
- export { ClientPermissionRepositoryAdapter, ClientRepositoryAdapter, ClientRoleRepositoryAdapter, ClientScopeRepositoryAdapter, DatabaseInjectionKey, DatabaseModule, EventRepositoryAdapter, IdentityProviderRepositoryAdapter, IdentityProviderRoleMappingRepositoryAdapter, KeyRepositoryAdapter, PermissionDatabaseProvider, PermissionPolicyRepositoryAdapter, PermissionRepositoryAdapter, PolicyRepositoryAdapter, RealmRepositoryAdapter, RoleAttributeRepositoryAdapter, RolePermissionRepositoryAdapter, RoleRepositoryAdapter, ScopeRepositoryAdapter, TrustAnchorRepositoryAdapter, UserAttributeRepositoryAdapter, UserAuthenticatorRepositoryAdapter, UserPermissionRepositoryAdapter, UserRepositoryAdapter, UserRoleRepositoryAdapter };
31
+ export { ClientPermissionRepositoryAdapter, ClientRepositoryAdapter, ClientRoleRepositoryAdapter, ClientScopeRepositoryAdapter, DatabaseInjectionKey, DatabaseModule, EventRepositoryAdapter, IdentityProviderAccountRepositoryAdapter, IdentityProviderRepositoryAdapter, IdentityProviderRoleMappingRepositoryAdapter, KeyRepositoryAdapter, PermissionDatabaseProvider, PermissionPolicyRepositoryAdapter, PermissionRepositoryAdapter, PolicyRepositoryAdapter, RealmRepositoryAdapter, RoleAttributeRepositoryAdapter, RolePermissionRepositoryAdapter, RoleRepositoryAdapter, ScopeRepositoryAdapter, TrustAnchorRepositoryAdapter, UserAttributeRepositoryAdapter, UserAuthenticatorRepositoryAdapter, UserPermissionRepositoryAdapter, UserRepositoryAdapter, UserRoleRepositoryAdapter };
@@ -0,0 +1,2 @@
1
+ export * from './repository.ts';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/app/modules/database/repositories/identity-provider-account/index.ts"],"names":[],"mappings":"AAOA,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import "node:path";
2
+ import "node:url";
3
+ import.meta.url;
4
+ import { IdentityProviderAccountRepositoryAdapter } from "./repository.mjs";
5
+ export { IdentityProviderAccountRepositoryAdapter };
@@ -0,0 +1,18 @@
1
+ import type { IdentityProviderAccount } from '@authup/core-kit';
2
+ import type { IQuery } from '@rapiq/core';
3
+ import type { EntityRepositoryFindManyResult } from '@authup/server-kit';
4
+ import type { DataSource, DeepPartial, Repository } from 'typeorm';
5
+ import { IdentityProviderAccountEntity } from '../../../../../adapters/database/domains/index.ts';
6
+ import type { IIdentityProviderAccountRepository, IdentityProviderAccountFindManyOptions, IdentityProviderIdentity } from '../../../../../core/index.ts';
7
+ export declare class IdentityProviderAccountRepositoryAdapter implements IIdentityProviderAccountRepository {
8
+ protected dataSource: DataSource;
9
+ protected repository: Repository<IdentityProviderAccountEntity>;
10
+ constructor(dataSource: DataSource);
11
+ findMany(query: IQuery, options?: IdentityProviderAccountFindManyOptions): Promise<EntityRepositoryFindManyResult<IdentityProviderAccount>>;
12
+ findOneById(id: string): Promise<IdentityProviderAccount | null>;
13
+ removeGuarded(entity: IdentityProviderAccount, userHasOtherLogin: boolean): Promise<boolean>;
14
+ findOneByProviderIdentity(identity: IdentityProviderIdentity): Promise<IdentityProviderAccount | null>;
15
+ save(entity: DeepPartial<IdentityProviderAccount>): Promise<IdentityProviderAccount>;
16
+ remove(entity: IdentityProviderAccount): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../../src/app/modules/database/repositories/identity-provider-account/repository.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,KAAK,EACR,UAAU,EACV,WAAW,EACX,UAAU,EACb,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,6BAA6B,EAAE,MAAM,mDAAmD,CAAC;AAElG,OAAO,KAAK,EACR,kCAAkC,EAClC,sCAAsC,EACtC,wBAAwB,EAC3B,MAAM,8BAA8B,CAAC;AAEtC,qBAAa,wCAAyC,YAAW,kCAAkC;IAC/F,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC;IAEjC,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,6BAA6B,CAAC,CAAC;gBAEpD,UAAU,EAAE,UAAU;IAK5B,QAAQ,CACV,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,sCAA2C,GACrD,OAAO,CAAC,8BAA8B,CAAC,uBAAuB,CAAC,CAAC;IAuC7D,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAIhE,aAAa,CAAC,MAAM,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAsC5F,yBAAyB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAUtG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,uBAAuB,CAAC,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAIpF,MAAM,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;CAG/D"}
@@ -0,0 +1,69 @@
1
+ import "node:path";
2
+ import "node:url";
3
+ import.meta.url;
4
+ import { isDatabaseTypeRowLockable } from "../../../../../adapters/database/helpers/is-supported.mjs";
5
+ import "../../../../../adapters/database/helpers/index.mjs";
6
+ import { IdentityProviderAccountEntity } from "../../../../../adapters/database/domains/identity-provider-account/entity.mjs";
7
+ import "../../../../../adapters/database/domains/index.mjs";
8
+ import { applyQuery, redactFieldConditions } from "../query.mjs";
9
+ //#region src/app/modules/database/repositories/identity-provider-account/repository.ts
10
+ var IdentityProviderAccountRepositoryAdapter = class {
11
+ dataSource;
12
+ repository;
13
+ constructor(dataSource) {
14
+ this.dataSource = dataSource;
15
+ this.repository = dataSource.getRepository(IdentityProviderAccountEntity);
16
+ }
17
+ async findMany(query, options = {}) {
18
+ const qb = this.repository.createQueryBuilder("identityProviderAccount");
19
+ const { pagination } = applyQuery(qb, query);
20
+ const existing = new Set(qb.expressionMap.selects.map((select) => select.selection));
21
+ const selections = ["userId", "userRealmId"].map((column) => `identityProviderAccount.${column}`).filter((selection) => !existing.has(selection));
22
+ if (selections.length > 0) qb.addSelect(selections);
23
+ if (options.userId) qb.andWhere("identityProviderAccount.userId = :ownerUserId", { ownerUserId: options.userId });
24
+ if (options.realmId) qb.andWhere("identityProviderAccount.userRealmId = :ownerRealmId", { ownerRealmId: options.realmId });
25
+ const [entities, total] = await qb.getManyAndCount();
26
+ return {
27
+ data: redactFieldConditions(query, entities),
28
+ meta: {
29
+ total,
30
+ ...pagination
31
+ }
32
+ };
33
+ }
34
+ async findOneById(id) {
35
+ return this.repository.findOneBy({ id });
36
+ }
37
+ async removeGuarded(entity, userHasOtherLogin) {
38
+ if (!isDatabaseTypeRowLockable(this.dataSource.options.type)) {
39
+ if (await this.repository.countBy({ userId: entity.userId }) <= 1 && !userHasOtherLogin) return false;
40
+ await this.repository.remove(entity);
41
+ return true;
42
+ }
43
+ return this.dataSource.transaction(async (manager) => {
44
+ const repository = manager.getRepository(IdentityProviderAccountEntity);
45
+ if ((await repository.createQueryBuilder("identityProviderAccount").select(["identityProviderAccount.id"]).where("identityProviderAccount.userId = :userId", { userId: entity.userId }).setLock("pessimistic_write").getMany()).length <= 1 && !userHasOtherLogin) return false;
46
+ await repository.remove(entity);
47
+ return true;
48
+ });
49
+ }
50
+ async findOneByProviderIdentity(identity) {
51
+ return this.repository.findOne({
52
+ where: {
53
+ providerUserId: identity.id,
54
+ providerId: identity.provider.id
55
+ },
56
+ relations: { user: true }
57
+ });
58
+ }
59
+ async save(entity) {
60
+ return this.repository.save(entity);
61
+ }
62
+ async remove(entity) {
63
+ await this.repository.remove(entity);
64
+ }
65
+ };
66
+ //#endregion
67
+ export { IdentityProviderAccountRepositoryAdapter };
68
+
69
+ //# sourceMappingURL=repository.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.mjs","names":["applyQuery","redactFieldConditions","IdentityProviderAccountEntity","isDatabaseTypeRowLockable","IdentityProviderAccountRepositoryAdapter","dataSource","repository","getRepository","findMany","query","options","qb","createQueryBuilder","pagination","existing","Set","expressionMap","selects","map","select","selection","selections","column","filter","has","length","addSelect","userId","andWhere","ownerUserId","realmId","ownerRealmId","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","removeGuarded","entity","userHasOtherLogin","type","count","countBy","remove","transaction","manager","rows","where","setLock","getMany","findOneByProviderIdentity","identity","findOne","providerUserId","providerId","provider","relations","user","save"],"sources":["../../../../../../src/app/modules/database/repositories/identity-provider-account/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderAccount } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type {\n DataSource, \n DeepPartial, \n Repository,\n} from 'typeorm';\nimport { applyQuery, redactFieldConditions } from '../query.ts';\nimport { IdentityProviderAccountEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { isDatabaseTypeRowLockable } from '../../../../../adapters/database/helpers/index.ts';\nimport type {\n IIdentityProviderAccountRepository,\n IdentityProviderAccountFindManyOptions,\n IdentityProviderIdentity,\n} from '../../../../../core/index.ts';\n\nexport class IdentityProviderAccountRepositoryAdapter implements IIdentityProviderAccountRepository {\n protected dataSource: DataSource;\n\n protected repository: Repository<IdentityProviderAccountEntity>;\n\n constructor(dataSource: DataSource) {\n this.dataSource = dataSource;\n this.repository = dataSource.getRepository(IdentityProviderAccountEntity);\n }\n\n async findMany(\n query: IQuery,\n options: IdentityProviderAccountFindManyOptions = {},\n ): Promise<EntityRepositoryFindManyResult<IdentityProviderAccount>> {\n const qb = this.repository.createQueryBuilder('identityProviderAccount');\n\n const { pagination } = applyQuery(qb, query);\n\n // plan-039 force-select: the per-row gate reads userId (ownership)\n // and userRealmId (realm reach). The shared applyRealmScopeSelect\n // pins a `realmId` column this entity does not have, so dedupe and\n // add the two columns the same way it would.\n const existing = new Set(qb.expressionMap.selects.map((select) => select.selection));\n const selections = ['userId', 'userRealmId']\n .map((column) => `identityProviderAccount.${column}`)\n .filter((selection) => !existing.has(selection));\n if (selections.length > 0) {\n qb.addSelect(selections);\n }\n\n if (options.userId) {\n // mandatory constraint — not overridable by a rapiq filter\n qb.andWhere('identityProviderAccount.userId = :ownerUserId', { ownerUserId: options.userId });\n }\n\n if (options.realmId) {\n // nested `/realms/:realmId/identity-provider-accounts` mount —\n // mandatory constraint, not overridable by a rapiq filter\n qb.andWhere('identityProviderAccount.userRealmId = :ownerRealmId', { ownerRealmId: options.realmId });\n }\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: redactFieldConditions(query, entities),\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneById(id: string): Promise<IdentityProviderAccount | null> {\n return this.repository.findOneBy({ id });\n }\n\n async removeGuarded(entity: IdentityProviderAccount, userHasOtherLogin: boolean): Promise<boolean> {\n if (!isDatabaseTypeRowLockable(this.dataSource.options.type)) {\n // better-sqlite3: a single synchronous writer, so the\n // count/delete race cannot manifest and no transaction is\n // needed. Deliberately NOT wrapped in one — a held write\n // transaction would contend the database lock (single-file\n // driver) without buying any atomicity here. Plain\n // count-then-remove, exactly as the un-guarded path did.\n const count = await this.repository.countBy({ userId: entity.userId });\n if (count <= 1 && !userHasOtherLogin) {\n return false;\n }\n\n await this.repository.remove(entity as IdentityProviderAccountEntity);\n return true;\n }\n\n // mysql / postgres: real concurrency. Lock the user's account rows,\n // count, and delete in one transaction so two concurrent unlinks for\n // the same user cannot both read > 1 and both delete.\n return this.dataSource.transaction(async (manager) => {\n const repository = manager.getRepository(IdentityProviderAccountEntity);\n\n const rows = await repository.createQueryBuilder('identityProviderAccount')\n .select(['identityProviderAccount.id'])\n .where('identityProviderAccount.userId = :userId', { userId: entity.userId })\n .setLock('pessimistic_write')\n .getMany();\n\n if (rows.length <= 1 && !userHasOtherLogin) {\n return false;\n }\n\n await repository.remove(entity as IdentityProviderAccountEntity);\n return true;\n });\n }\n\n async findOneByProviderIdentity(identity: IdentityProviderIdentity): Promise<IdentityProviderAccount | null> {\n return this.repository.findOne({\n where: {\n providerUserId: identity.id,\n providerId: identity.provider.id,\n },\n relations: { user: true },\n });\n }\n\n async save(entity: DeepPartial<IdentityProviderAccount>): Promise<IdentityProviderAccount> {\n return this.repository.save(entity);\n }\n\n async remove(entity: IdentityProviderAccount): Promise<void> {\n await this.repository.remove(entity as IdentityProviderAccountEntity);\n }\n}\n"],"mappings":";;;;;;;;;AAwBA,IAAaI,2CAAb,MAAaA;CACCC;CAEAC;CAEV,YAAYD,YAAwB;EAChC,KAAKA,aAAaA;EAClB,KAAKC,aAAaD,WAAWE,cAAcL,6BAAAA;CAC/C;CAEA,MAAMM,SACFC,OACAC,UAAkD,CAAC,GACa;EAChE,MAAMC,KAAK,KAAKL,WAAWM,mBAAmB,yBAAA;EAE9C,MAAM,EAAEC,eAAeb,WAAWW,IAAIF,KAAAA;EAMtC,MAAMK,WAAW,IAAIC,IAAIJ,GAAGK,cAAcC,QAAQC,KAAKC,WAAWA,OAAOC,SAAS,CAAA;EAClF,MAAMC,aAAa,CAAC,UAAU,aAAc,CAAA,CACvCH,KAAKI,WAAW,2BAA2BA,QAAQ,CAAA,CACnDC,QAAQH,cAAc,CAACN,SAASU,IAAIJ,SAAAA,CAAAA;EACzC,IAAIC,WAAWI,SAAS,GACpBd,GAAGe,UAAUL,UAAAA;EAGjB,IAAIX,QAAQiB,QAERhB,GAAGiB,SAAS,iDAAiD,EAAEC,aAAanB,QAAQiB,OAAO,CAAA;EAG/F,IAAIjB,QAAQoB,SAGRnB,GAAGiB,SAAS,uDAAuD,EAAEG,cAAcrB,QAAQoB,QAAQ,CAAA;EAGvG,MAAM,CAACE,UAAUC,SAAS,MAAMtB,GAAGuB,gBAAe;EAElD,OAAO;GACHC,MAAMlC,sBAAsBQ,OAAOuB,QAAAA;GACnCI,MAAM;IACFH;IACA,GAAGpB;GACP;EACJ;CACJ;CAEA,MAAMwB,YAAYC,IAAqD;EACnE,OAAO,KAAKhC,WAAWiC,UAAU,EAAED,GAAG,CAAA;CAC1C;CAEA,MAAME,cAAcC,QAAiCC,mBAA8C;EAC/F,IAAI,CAACvC,0BAA0B,KAAKE,WAAWK,QAAQiC,IAAI,GAAG;GAQ1D,IAAIC,MADgB,KAAKtC,WAAWuC,QAAQ,EAAElB,QAAQc,OAAOd,OAAO,CAAA,KACvD,KAAK,CAACe,mBACf,OAAO;GAGX,MAAM,KAAKpC,WAAWwC,OAAOL,MAAAA;GAC7B,OAAO;EACX;EAKA,OAAO,KAAKpC,WAAW0C,YAAY,OAAOC,YAAAA;GACtC,MAAM1C,aAAa0C,QAAQzC,cAAcL,6BAAAA;GAQzC,KAAI+C,MANe3C,WAAWM,mBAAmB,yBAAA,CAAA,CAC5CO,OAAO,CAAC,4BAA6B,CAAA,CAAA,CACrC+B,MAAM,4CAA4C,EAAEvB,QAAQc,OAAOd,OAAO,CAAA,CAAA,CAC1EwB,QAAQ,mBAAA,CAAA,CACRC,QAAO,EAAA,CAEH3B,UAAU,KAAK,CAACiB,mBACrB,OAAO;GAGX,MAAMpC,WAAWwC,OAAOL,MAAAA;GACxB,OAAO;EACX,CAAA;CACJ;CAEA,MAAMY,0BAA0BC,UAA6E;EACzG,OAAO,KAAKhD,WAAWiD,QAAQ;GAC3BL,OAAO;IACHM,gBAAgBF,SAAShB;IACzBmB,YAAYH,SAASI,SAASpB;GAClC;GACAqB,WAAW,EAAEC,MAAM,KAAK;EAC5B,CAAA;CACJ;CAEA,MAAMC,KAAKpB,QAAgF;EACvF,OAAO,KAAKnC,WAAWuD,KAAKpB,MAAAA;CAChC;CAEA,MAAMK,OAAOL,QAAgD;EACzD,MAAM,KAAKnC,WAAWwC,OAAOL,MAAAA;CACjC;AACJ"}
@@ -4,6 +4,7 @@ export * from './client-role/index.ts';
4
4
  export * from './client-scope/index.ts';
5
5
  export * from './event/index.ts';
6
6
  export * from './identity-provider/index.ts';
7
+ export * from './identity-provider-account/index.ts';
7
8
  export * from './key/index.ts';
8
9
  export * from './permission/index.ts';
9
10
  export * from './permission-policy/index.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/app/modules/database/repositories/index.ts"],"names":[],"mappings":"AAOA,cAAc,mBAAmB,CAAC;AAClC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,2CAA2C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/app/modules/database/repositories/index.ts"],"names":[],"mappings":"AAOA,cAAc,mBAAmB,CAAC;AAClC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sCAAsC,CAAC;AACrD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,2CAA2C,CAAC"}
@@ -14,6 +14,8 @@ import { EventRepositoryAdapter } from "./event/repository.mjs";
14
14
  import "./event/index.mjs";
15
15
  import { IdentityProviderRepositoryAdapter } from "./identity-provider/repository.mjs";
16
16
  import "./identity-provider/index.mjs";
17
+ import { IdentityProviderAccountRepositoryAdapter } from "./identity-provider-account/repository.mjs";
18
+ import "./identity-provider-account/index.mjs";
17
19
  import { KeyRepositoryAdapter } from "./key/repository.mjs";
18
20
  import "./key/index.mjs";
19
21
  import { PermissionRepositoryAdapter } from "./permission/repository.mjs";
@@ -47,4 +49,4 @@ import { UserRoleRepositoryAdapter } from "./user-role/repository.mjs";
47
49
  import "./user-role/index.mjs";
48
50
  import { IdentityProviderRoleMappingRepositoryAdapter } from "./identity-provider-role-mapping/repository.mjs";
49
51
  import "./identity-provider-role-mapping/index.mjs";
50
- export { ClientPermissionRepositoryAdapter, ClientRepositoryAdapter, ClientRoleRepositoryAdapter, ClientScopeRepositoryAdapter, EventRepositoryAdapter, IdentityProviderRepositoryAdapter, IdentityProviderRoleMappingRepositoryAdapter, KeyRepositoryAdapter, PermissionDatabaseProvider, PermissionPolicyRepositoryAdapter, PermissionRepositoryAdapter, PolicyRepositoryAdapter, RealmRepositoryAdapter, RoleAttributeRepositoryAdapter, RolePermissionRepositoryAdapter, RoleRepositoryAdapter, ScopeRepositoryAdapter, TrustAnchorRepositoryAdapter, UserAttributeRepositoryAdapter, UserAuthenticatorRepositoryAdapter, UserPermissionRepositoryAdapter, UserRepositoryAdapter, UserRoleRepositoryAdapter };
52
+ export { ClientPermissionRepositoryAdapter, ClientRepositoryAdapter, ClientRoleRepositoryAdapter, ClientScopeRepositoryAdapter, EventRepositoryAdapter, IdentityProviderAccountRepositoryAdapter, IdentityProviderRepositoryAdapter, IdentityProviderRoleMappingRepositoryAdapter, KeyRepositoryAdapter, PermissionDatabaseProvider, PermissionPolicyRepositoryAdapter, PermissionRepositoryAdapter, PolicyRepositoryAdapter, RealmRepositoryAdapter, RoleAttributeRepositoryAdapter, RolePermissionRepositoryAdapter, RoleRepositoryAdapter, ScopeRepositoryAdapter, TrustAnchorRepositoryAdapter, UserAttributeRepositoryAdapter, UserAuthenticatorRepositoryAdapter, UserPermissionRepositoryAdapter, UserRepositoryAdapter, UserRoleRepositoryAdapter };
@@ -24,9 +24,32 @@ export declare class KeyRepositoryAdapter implements IKeyRepository, IKeyStore {
24
24
  protected secretsCipher: ISymmetricCipher | null;
25
25
  protected realmRepository: IRealmRepository;
26
26
  protected logger?: Logger;
27
+ /**
28
+ * In-flight mints keyed `<realmId>:<use>` — see {@link mintExclusive}.
29
+ */
30
+ protected mints: Map<string, Promise<Key>>;
27
31
  constructor(dataSource: DataSource, options?: KeyRepositoryAdapterOptions);
28
32
  protected get repository(): Repository<KeyEntity>;
33
+ protected findActiveKey(realmId: string, use: `${JWKUse}`): Promise<KeyEntity | null>;
29
34
  resolveOrCreate(realmId: string, use: `${JWKUse}`): Promise<Key>;
35
+ /**
36
+ * Minting is check-then-act (read, count, insert), and the callers are
37
+ * hot paths — the token signer resolves a signature key for EVERY
38
+ * issuance, the realm cipher an encryption key for every MFA seed — so
39
+ * a freshly created realm routinely takes several simultaneous calls
40
+ * and each one would insert its own key. Concurrent mints for one
41
+ * (realm, use) therefore share a single in-flight promise.
42
+ *
43
+ * The map is per adapter instance, and the store is a DI singleton, so
44
+ * it is scoped to one application: two applications in one process
45
+ * (the test suite) never share mint state. Separate PROCESSES can still
46
+ * race, which is why the duplicate stays tolerable rather than fatal —
47
+ * both keys are published in JWKS and verify, and `findActiveKey`
48
+ * orders deterministically, so a duplicate costs a redundant row, not
49
+ * a broken token.
50
+ */
51
+ protected mintExclusive(realmId: string, use: `${JWKUse}`): Promise<Key>;
52
+ protected mint(realmId: string, use: `${JWKUse}`): Promise<Key>;
30
53
  resolveById(id: string): Promise<Key | null>;
31
54
  protected createSignatureKey(repository: Repository<KeyEntity>, realmId: string): Promise<Key>;
32
55
  protected createEncryptionKey(repository: Repository<KeyEntity>, realmId: string): Promise<Key>;
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../../src/app/modules/database/repositories/key/repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../../src/app/modules/database/repositories/key/repository.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,9 @@ import { validateEntityJoinColumns } from "typeorm-extension";
31
31
  secretsCipher;
32
32
  realmRepository;
33
33
  logger;
34
+ /**
35
+ * In-flight mints keyed `<realmId>:<use>` — see {@link mintExclusive}.
36
+ */ mints = /* @__PURE__ */ new Map();
34
37
  constructor(dataSource, options = {}) {
35
38
  this.dataSource = dataSource;
36
39
  this.secretsCipher = options.secretsCipher ?? null;
@@ -40,9 +43,8 @@ import { validateEntityJoinColumns } from "typeorm-extension";
40
43
  get repository() {
41
44
  return this.dataSource.getRepository(KeyEntity);
42
45
  }
43
- async resolveOrCreate(realmId, use) {
44
- const { repository } = this;
45
- const entity = await repository.findOne({
46
+ findActiveKey(realmId, use) {
47
+ return this.repository.findOne({
46
48
  select: {
47
49
  id: true,
48
50
  name: true,
@@ -65,6 +67,40 @@ import { validateEntityJoinColumns } from "typeorm-extension";
65
67
  id: "ASC"
66
68
  }
67
69
  });
70
+ }
71
+ async resolveOrCreate(realmId, use) {
72
+ const entity = await this.findActiveKey(realmId, use);
73
+ if (entity) return this.afterLoad(this.repository, entity);
74
+ return this.mintExclusive(realmId, use);
75
+ }
76
+ /**
77
+ * Minting is check-then-act (read, count, insert), and the callers are
78
+ * hot paths — the token signer resolves a signature key for EVERY
79
+ * issuance, the realm cipher an encryption key for every MFA seed — so
80
+ * a freshly created realm routinely takes several simultaneous calls
81
+ * and each one would insert its own key. Concurrent mints for one
82
+ * (realm, use) therefore share a single in-flight promise.
83
+ *
84
+ * The map is per adapter instance, and the store is a DI singleton, so
85
+ * it is scoped to one application: two applications in one process
86
+ * (the test suite) never share mint state. Separate PROCESSES can still
87
+ * race, which is why the duplicate stays tolerable rather than fatal —
88
+ * both keys are published in JWKS and verify, and `findActiveKey`
89
+ * orders deterministically, so a duplicate costs a redundant row, not
90
+ * a broken token.
91
+ */ mintExclusive(realmId, use) {
92
+ const cacheKey = `${realmId}:${use}`;
93
+ const inFlight = this.mints.get(cacheKey);
94
+ if (inFlight) return inFlight;
95
+ const promise = this.mint(realmId, use);
96
+ this.mints.set(cacheKey, promise);
97
+ return promise.finally(() => {
98
+ this.mints.delete(cacheKey);
99
+ });
100
+ }
101
+ async mint(realmId, use) {
102
+ const { repository } = this;
103
+ const entity = await this.findActiveKey(realmId, use);
68
104
  if (entity) return this.afterLoad(repository, entity);
69
105
  const total = await repository.countBy({
70
106
  realmId,