@_mustachio/openauth 0.9.2 → 0.11.0

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 (756) hide show
  1. package/dist/esm/adapters/d1/audit-log.js +15 -0
  2. package/dist/esm/adapters/d1/config-store.js +45 -0
  3. package/dist/esm/adapters/d1/index.js +12 -0
  4. package/dist/esm/adapters/d1/key-store.js +116 -0
  5. package/dist/esm/adapters/d1/method-store.js +52 -0
  6. package/dist/esm/adapters/d1/migrations.js +77 -0
  7. package/dist/esm/adapters/d1/session-store.js +134 -0
  8. package/dist/esm/adapters/d1/session.js +18 -0
  9. package/dist/esm/adapters/d1/token-store.js +140 -0
  10. package/dist/esm/adapters/durable-object/index.js +3 -0
  11. package/dist/esm/adapters/durable-object/session-store.js +139 -0
  12. package/dist/esm/adapters/durable-object/types.js +0 -0
  13. package/dist/esm/adapters/dynamo/audit-log.js +23 -0
  14. package/dist/esm/adapters/dynamo/client.js +0 -0
  15. package/dist/esm/adapters/dynamo/config-store.js +57 -0
  16. package/dist/esm/adapters/dynamo/index.js +10 -0
  17. package/dist/esm/adapters/dynamo/key-store.js +188 -0
  18. package/dist/esm/adapters/dynamo/method-store.js +72 -0
  19. package/dist/esm/adapters/dynamo/passkey-credential-store.js +83 -0
  20. package/dist/esm/adapters/dynamo/sdk.js +128 -0
  21. package/dist/esm/adapters/dynamo/session-store.js +173 -0
  22. package/dist/esm/adapters/dynamo/token-store.js +178 -0
  23. package/dist/esm/adapters/kms/in-memory-backing.js +28 -0
  24. package/dist/esm/adapters/kms/index.js +5 -0
  25. package/dist/esm/adapters/kms/key-store.js +129 -0
  26. package/dist/esm/adapters/kms/sdk.js +23 -0
  27. package/dist/esm/adapters/kms/types.js +0 -0
  28. package/dist/esm/adapters/kv/audit-log.js +21 -0
  29. package/dist/esm/adapters/kv/config-store.js +43 -0
  30. package/dist/esm/adapters/kv/index.js +5 -0
  31. package/dist/esm/adapters/kv/method-store.js +63 -0
  32. package/dist/esm/adapters/kv/types.js +0 -0
  33. package/dist/esm/adapters/memory/audit-log.js +16 -0
  34. package/dist/esm/adapters/memory/clock.js +5 -0
  35. package/dist/esm/adapters/memory/config-store.js +31 -0
  36. package/dist/esm/adapters/memory/index.js +10 -0
  37. package/dist/esm/adapters/memory/key-store.js +78 -0
  38. package/dist/esm/adapters/memory/method-store.js +43 -0
  39. package/dist/esm/adapters/memory/passkey-credential-store.js +53 -0
  40. package/dist/esm/adapters/memory/session-store.js +104 -0
  41. package/dist/esm/adapters/memory/token-store.js +104 -0
  42. package/dist/esm/adapters/postgres/audit-log.js +16 -0
  43. package/dist/esm/adapters/postgres/config-store.js +48 -0
  44. package/dist/esm/adapters/postgres/executor.js +21 -0
  45. package/dist/esm/adapters/postgres/index.js +13 -0
  46. package/dist/esm/adapters/postgres/key-store.js +191 -0
  47. package/dist/esm/adapters/postgres/method-store.js +61 -0
  48. package/dist/esm/adapters/postgres/migrations.js +111 -0
  49. package/dist/esm/adapters/postgres/passkey-credential-store.js +80 -0
  50. package/dist/esm/adapters/postgres/session-store.js +135 -0
  51. package/dist/esm/adapters/postgres/token-store.js +151 -0
  52. package/dist/esm/client.js +35 -12
  53. package/dist/esm/domain/audit.js +13 -0
  54. package/dist/esm/domain/authorize.js +217 -0
  55. package/dist/esm/domain/callback.js +176 -0
  56. package/dist/esm/domain/client-auth.js +61 -0
  57. package/dist/esm/domain/client-credentials.js +91 -0
  58. package/dist/esm/domain/crypto.js +97 -0
  59. package/dist/esm/domain/discovery.js +83 -0
  60. package/dist/esm/domain/dpop.js +122 -0
  61. package/dist/esm/domain/id-token.js +94 -0
  62. package/dist/esm/domain/introspect.js +55 -0
  63. package/dist/esm/domain/jwt.js +71 -0
  64. package/dist/esm/domain/logout.js +75 -0
  65. package/dist/esm/domain/method-cache.js +136 -0
  66. package/dist/esm/domain/method-dispatch.js +36 -0
  67. package/dist/esm/domain/method-route.js +111 -0
  68. package/dist/esm/domain/par.js +51 -0
  69. package/dist/esm/domain/pkce.js +16 -0
  70. package/dist/esm/domain/refresh.js +102 -0
  71. package/dist/esm/domain/register.js +74 -0
  72. package/dist/esm/domain/revoke.js +81 -0
  73. package/dist/esm/domain/state-envelope.js +80 -0
  74. package/dist/esm/domain/token-exchange.js +102 -0
  75. package/dist/esm/domain/token.js +246 -0
  76. package/dist/esm/domain/userinfo.js +62 -0
  77. package/dist/esm/http/context.js +7 -0
  78. package/dist/esm/http/cookies.js +98 -0
  79. package/dist/esm/http/errors.js +71 -0
  80. package/dist/esm/http/handlers/authorize.js +250 -0
  81. package/dist/esm/http/handlers/callback.js +53 -0
  82. package/dist/esm/http/handlers/end-session.js +64 -0
  83. package/dist/esm/http/handlers/metadata.js +37 -0
  84. package/dist/esm/http/handlers/method-route.js +87 -0
  85. package/dist/esm/http/handlers/par.js +53 -0
  86. package/dist/esm/http/handlers/register.js +46 -0
  87. package/dist/esm/http/handlers/revocation.js +98 -0
  88. package/dist/esm/http/handlers/token.js +197 -0
  89. package/dist/esm/http/handlers/userinfo.js +60 -0
  90. package/dist/esm/http/middleware/error.js +15 -0
  91. package/dist/esm/http/middleware/tenant.js +102 -0
  92. package/dist/esm/http/resolver.js +15 -0
  93. package/dist/esm/http/router.js +45 -0
  94. package/dist/esm/http/schemas/authorize.js +30 -0
  95. package/dist/esm/http/schemas/end-session.js +13 -0
  96. package/dist/esm/http/schemas/par.js +9 -0
  97. package/dist/esm/http/schemas/register.js +16 -0
  98. package/dist/esm/http/schemas/revocation.js +18 -0
  99. package/dist/esm/http/schemas/token.js +57 -0
  100. package/dist/esm/index.js +126 -9
  101. package/dist/esm/methods/code.js +221 -0
  102. package/dist/esm/methods/m2m.js +41 -0
  103. package/dist/esm/methods/oauth2-factory.js +84 -0
  104. package/dist/esm/methods/oauth2-generic.js +196 -0
  105. package/dist/esm/methods/oidc-generic.js +53 -0
  106. package/dist/esm/methods/passkey.js +275 -0
  107. package/dist/esm/methods/password-hash.js +79 -0
  108. package/dist/esm/methods/password.js +166 -0
  109. package/dist/esm/methods/providers/apple.js +29 -0
  110. package/dist/esm/methods/providers/cognito.js +37 -0
  111. package/dist/esm/methods/providers/discord.js +28 -0
  112. package/dist/esm/methods/providers/facebook.js +42 -0
  113. package/dist/esm/methods/providers/github.js +29 -0
  114. package/dist/esm/methods/providers/google.js +29 -0
  115. package/dist/esm/methods/providers/index.js +17 -0
  116. package/dist/esm/methods/providers/jumpcloud.js +27 -0
  117. package/dist/esm/methods/providers/keycloak.js +32 -0
  118. package/dist/esm/methods/providers/linkedin.js +28 -0
  119. package/dist/esm/methods/providers/microsoft.js +28 -0
  120. package/dist/esm/methods/providers/slack.js +30 -0
  121. package/dist/esm/methods/providers/spotify.js +28 -0
  122. package/dist/esm/methods/providers/twitch.js +28 -0
  123. package/dist/esm/methods/providers/x.js +28 -0
  124. package/dist/esm/methods/providers/yahoo.js +27 -0
  125. package/dist/esm/pkce.js +4 -16
  126. package/dist/esm/ports/audit-log.js +0 -0
  127. package/dist/esm/ports/config-store.js +0 -0
  128. package/dist/esm/ports/key-store.js +0 -0
  129. package/dist/esm/ports/method-store.js +0 -0
  130. package/dist/esm/ports/session-store.js +0 -0
  131. package/dist/esm/ports/token-store.js +0 -0
  132. package/dist/esm/types/authorization.js +0 -0
  133. package/dist/esm/types/error.js +70 -0
  134. package/dist/esm/types/flow.js +0 -0
  135. package/dist/esm/types/idp.js +0 -0
  136. package/dist/esm/types/method.js +0 -0
  137. package/dist/esm/types/picker.js +0 -0
  138. package/dist/esm/types/result.js +11 -0
  139. package/dist/esm/types/subject.js +0 -0
  140. package/dist/esm/types/tenant.js +5 -0
  141. package/dist/esm/types/token.js +0 -0
  142. package/dist/esm/ui/forms.js +253 -0
  143. package/dist/esm/ui/index.js +8 -0
  144. package/dist/esm/ui/picker.js +49 -0
  145. package/dist/types/adapters/d1/audit-log.d.ts +19 -0
  146. package/dist/types/adapters/d1/audit-log.d.ts.map +1 -0
  147. package/dist/types/adapters/d1/config-store.d.ts +20 -0
  148. package/dist/types/adapters/d1/config-store.d.ts.map +1 -0
  149. package/dist/types/adapters/d1/index.d.ts +35 -0
  150. package/dist/types/adapters/d1/index.d.ts.map +1 -0
  151. package/dist/types/adapters/d1/key-store.d.ts +17 -0
  152. package/dist/types/adapters/d1/key-store.d.ts.map +1 -0
  153. package/dist/types/adapters/d1/method-store.d.ts +21 -0
  154. package/dist/types/adapters/d1/method-store.d.ts.map +1 -0
  155. package/dist/types/adapters/d1/migrations.d.ts +18 -0
  156. package/dist/types/adapters/d1/migrations.d.ts.map +1 -0
  157. package/dist/types/adapters/d1/session-store.d.ts +20 -0
  158. package/dist/types/adapters/d1/session-store.d.ts.map +1 -0
  159. package/dist/types/adapters/d1/session.d.ts +18 -0
  160. package/dist/types/adapters/d1/session.d.ts.map +1 -0
  161. package/dist/types/adapters/d1/token-store.d.ts +29 -0
  162. package/dist/types/adapters/d1/token-store.d.ts.map +1 -0
  163. package/dist/types/adapters/d1/types.d.ts +43 -0
  164. package/dist/types/adapters/d1/types.d.ts.map +1 -0
  165. package/dist/types/adapters/durable-object/index.d.ts +17 -0
  166. package/dist/types/adapters/durable-object/index.d.ts.map +1 -0
  167. package/dist/types/adapters/durable-object/session-store.d.ts +21 -0
  168. package/dist/types/adapters/durable-object/session-store.d.ts.map +1 -0
  169. package/dist/types/adapters/durable-object/types.d.ts +23 -0
  170. package/dist/types/adapters/durable-object/types.d.ts.map +1 -0
  171. package/dist/types/adapters/dynamo/audit-log.d.ts +19 -0
  172. package/dist/types/adapters/dynamo/audit-log.d.ts.map +1 -0
  173. package/dist/types/adapters/dynamo/client.d.ts +111 -0
  174. package/dist/types/adapters/dynamo/client.d.ts.map +1 -0
  175. package/dist/types/adapters/dynamo/config-store.d.ts +21 -0
  176. package/dist/types/adapters/dynamo/config-store.d.ts.map +1 -0
  177. package/dist/types/adapters/dynamo/index.d.ts +60 -0
  178. package/dist/types/adapters/dynamo/index.d.ts.map +1 -0
  179. package/dist/types/adapters/dynamo/key-store.d.ts +23 -0
  180. package/dist/types/adapters/dynamo/key-store.d.ts.map +1 -0
  181. package/dist/types/adapters/dynamo/method-store.d.ts +20 -0
  182. package/dist/types/adapters/dynamo/method-store.d.ts.map +1 -0
  183. package/dist/types/adapters/dynamo/passkey-credential-store.d.ts +47 -0
  184. package/dist/types/adapters/dynamo/passkey-credential-store.d.ts.map +1 -0
  185. package/dist/types/adapters/dynamo/sdk.d.ts +23 -0
  186. package/dist/types/adapters/dynamo/sdk.d.ts.map +1 -0
  187. package/dist/types/adapters/dynamo/session-store.d.ts +20 -0
  188. package/dist/types/adapters/dynamo/session-store.d.ts.map +1 -0
  189. package/dist/types/adapters/dynamo/token-store.d.ts +29 -0
  190. package/dist/types/adapters/dynamo/token-store.d.ts.map +1 -0
  191. package/dist/types/adapters/kms/in-memory-backing.d.ts +9 -0
  192. package/dist/types/adapters/kms/in-memory-backing.d.ts.map +1 -0
  193. package/dist/types/adapters/kms/index.d.ts +35 -0
  194. package/dist/types/adapters/kms/index.d.ts.map +1 -0
  195. package/dist/types/adapters/kms/key-store.d.ts +20 -0
  196. package/dist/types/adapters/kms/key-store.d.ts.map +1 -0
  197. package/dist/types/adapters/kms/sdk.d.ts +16 -0
  198. package/dist/types/adapters/kms/sdk.d.ts.map +1 -0
  199. package/dist/types/adapters/kms/types.d.ts +58 -0
  200. package/dist/types/adapters/kms/types.d.ts.map +1 -0
  201. package/dist/types/adapters/kv/audit-log.d.ts +22 -0
  202. package/dist/types/adapters/kv/audit-log.d.ts.map +1 -0
  203. package/dist/types/adapters/kv/config-store.d.ts +25 -0
  204. package/dist/types/adapters/kv/config-store.d.ts.map +1 -0
  205. package/dist/types/adapters/kv/index.d.ts +21 -0
  206. package/dist/types/adapters/kv/index.d.ts.map +1 -0
  207. package/dist/types/adapters/kv/method-store.d.ts +23 -0
  208. package/dist/types/adapters/kv/method-store.d.ts.map +1 -0
  209. package/dist/types/adapters/kv/types.d.ts +28 -0
  210. package/dist/types/adapters/kv/types.d.ts.map +1 -0
  211. package/dist/types/adapters/memory/audit-log.d.ts +18 -0
  212. package/dist/types/adapters/memory/audit-log.d.ts.map +1 -0
  213. package/dist/types/adapters/memory/clock.d.ts +7 -0
  214. package/dist/types/adapters/memory/clock.d.ts.map +1 -0
  215. package/dist/types/adapters/memory/config-store.d.ts +19 -0
  216. package/dist/types/adapters/memory/config-store.d.ts.map +1 -0
  217. package/dist/types/adapters/memory/index.d.ts +15 -0
  218. package/dist/types/adapters/memory/index.d.ts.map +1 -0
  219. package/dist/types/adapters/memory/key-store.d.ts +17 -0
  220. package/dist/types/adapters/memory/key-store.d.ts.map +1 -0
  221. package/dist/types/adapters/memory/method-store.d.ts +26 -0
  222. package/dist/types/adapters/memory/method-store.d.ts.map +1 -0
  223. package/dist/types/adapters/memory/passkey-credential-store.d.ts +43 -0
  224. package/dist/types/adapters/memory/passkey-credential-store.d.ts.map +1 -0
  225. package/dist/types/adapters/memory/session-store.d.ts +21 -0
  226. package/dist/types/adapters/memory/session-store.d.ts.map +1 -0
  227. package/dist/types/adapters/memory/token-store.d.ts +29 -0
  228. package/dist/types/adapters/memory/token-store.d.ts.map +1 -0
  229. package/dist/types/adapters/postgres/audit-log.d.ts +18 -0
  230. package/dist/types/adapters/postgres/audit-log.d.ts.map +1 -0
  231. package/dist/types/adapters/postgres/config-store.d.ts +21 -0
  232. package/dist/types/adapters/postgres/config-store.d.ts.map +1 -0
  233. package/dist/types/adapters/postgres/executor.d.ts +48 -0
  234. package/dist/types/adapters/postgres/executor.d.ts.map +1 -0
  235. package/dist/types/adapters/postgres/index.d.ts +39 -0
  236. package/dist/types/adapters/postgres/index.d.ts.map +1 -0
  237. package/dist/types/adapters/postgres/key-store.d.ts +23 -0
  238. package/dist/types/adapters/postgres/key-store.d.ts.map +1 -0
  239. package/dist/types/adapters/postgres/method-store.d.ts +21 -0
  240. package/dist/types/adapters/postgres/method-store.d.ts.map +1 -0
  241. package/dist/types/adapters/postgres/migrations.d.ts +22 -0
  242. package/dist/types/adapters/postgres/migrations.d.ts.map +1 -0
  243. package/dist/types/adapters/postgres/passkey-credential-store.d.ts +48 -0
  244. package/dist/types/adapters/postgres/passkey-credential-store.d.ts.map +1 -0
  245. package/dist/types/adapters/postgres/session-store.d.ts +20 -0
  246. package/dist/types/adapters/postgres/session-store.d.ts.map +1 -0
  247. package/dist/types/adapters/postgres/token-store.d.ts +30 -0
  248. package/dist/types/adapters/postgres/token-store.d.ts.map +1 -0
  249. package/dist/types/client.d.ts +20 -1
  250. package/dist/types/client.d.ts.map +1 -1
  251. package/dist/types/domain/audit.d.ts +17 -0
  252. package/dist/types/domain/audit.d.ts.map +1 -0
  253. package/dist/types/domain/authorize.d.ts +125 -0
  254. package/dist/types/domain/authorize.d.ts.map +1 -0
  255. package/dist/types/domain/callback.d.ts +70 -0
  256. package/dist/types/domain/callback.d.ts.map +1 -0
  257. package/dist/types/domain/client-auth.d.ts +57 -0
  258. package/dist/types/domain/client-auth.d.ts.map +1 -0
  259. package/dist/types/domain/client-credentials.d.ts +54 -0
  260. package/dist/types/domain/client-credentials.d.ts.map +1 -0
  261. package/dist/types/domain/crypto.d.ts +53 -0
  262. package/dist/types/domain/crypto.d.ts.map +1 -0
  263. package/dist/types/domain/discovery.d.ts +81 -0
  264. package/dist/types/domain/discovery.d.ts.map +1 -0
  265. package/dist/types/domain/dpop.d.ts +61 -0
  266. package/dist/types/domain/dpop.d.ts.map +1 -0
  267. package/dist/types/domain/id-token.d.ts +83 -0
  268. package/dist/types/domain/id-token.d.ts.map +1 -0
  269. package/dist/types/domain/introspect.d.ts +79 -0
  270. package/dist/types/domain/introspect.d.ts.map +1 -0
  271. package/dist/types/domain/jwt.d.ts +74 -0
  272. package/dist/types/domain/jwt.d.ts.map +1 -0
  273. package/dist/types/domain/logout.d.ts +69 -0
  274. package/dist/types/domain/logout.d.ts.map +1 -0
  275. package/dist/types/domain/method-cache.d.ts +42 -0
  276. package/dist/types/domain/method-cache.d.ts.map +1 -0
  277. package/dist/types/domain/method-dispatch.d.ts +37 -0
  278. package/dist/types/domain/method-dispatch.d.ts.map +1 -0
  279. package/dist/types/domain/method-route.d.ts +77 -0
  280. package/dist/types/domain/method-route.d.ts.map +1 -0
  281. package/dist/types/domain/par.d.ts +62 -0
  282. package/dist/types/domain/par.d.ts.map +1 -0
  283. package/dist/types/domain/pkce.d.ts +15 -0
  284. package/dist/types/domain/pkce.d.ts.map +1 -0
  285. package/dist/types/domain/refresh.d.ts +52 -0
  286. package/dist/types/domain/refresh.d.ts.map +1 -0
  287. package/dist/types/domain/register.d.ts +33 -0
  288. package/dist/types/domain/register.d.ts.map +1 -0
  289. package/dist/types/domain/revoke.d.ts +61 -0
  290. package/dist/types/domain/revoke.d.ts.map +1 -0
  291. package/dist/types/domain/state-envelope.d.ts +30 -0
  292. package/dist/types/domain/state-envelope.d.ts.map +1 -0
  293. package/dist/types/domain/token-exchange.d.ts +69 -0
  294. package/dist/types/domain/token-exchange.d.ts.map +1 -0
  295. package/dist/types/domain/token.d.ts +140 -0
  296. package/dist/types/domain/token.d.ts.map +1 -0
  297. package/dist/types/domain/userinfo.d.ts +61 -0
  298. package/dist/types/domain/userinfo.d.ts.map +1 -0
  299. package/dist/types/http/context.d.ts +66 -0
  300. package/dist/types/http/context.d.ts.map +1 -0
  301. package/dist/types/http/cookies.d.ts +45 -0
  302. package/dist/types/http/cookies.d.ts.map +1 -0
  303. package/dist/types/http/errors.d.ts +36 -0
  304. package/dist/types/http/errors.d.ts.map +1 -0
  305. package/dist/types/http/handlers/authorize.d.ts +3 -0
  306. package/dist/types/http/handlers/authorize.d.ts.map +1 -0
  307. package/dist/types/http/handlers/callback.d.ts +3 -0
  308. package/dist/types/http/handlers/callback.d.ts.map +1 -0
  309. package/dist/types/http/handlers/end-session.d.ts +3 -0
  310. package/dist/types/http/handlers/end-session.d.ts.map +1 -0
  311. package/dist/types/http/handlers/metadata.d.ts +4 -0
  312. package/dist/types/http/handlers/metadata.d.ts.map +1 -0
  313. package/dist/types/http/handlers/method-route.d.ts +3 -0
  314. package/dist/types/http/handlers/method-route.d.ts.map +1 -0
  315. package/dist/types/http/handlers/par.d.ts +3 -0
  316. package/dist/types/http/handlers/par.d.ts.map +1 -0
  317. package/dist/types/http/handlers/register.d.ts +3 -0
  318. package/dist/types/http/handlers/register.d.ts.map +1 -0
  319. package/dist/types/http/handlers/revocation.d.ts +4 -0
  320. package/dist/types/http/handlers/revocation.d.ts.map +1 -0
  321. package/dist/types/http/handlers/token.d.ts +3 -0
  322. package/dist/types/http/handlers/token.d.ts.map +1 -0
  323. package/dist/types/http/handlers/userinfo.d.ts +3 -0
  324. package/dist/types/http/handlers/userinfo.d.ts.map +1 -0
  325. package/dist/types/http/middleware/error.d.ts +9 -0
  326. package/dist/types/http/middleware/error.d.ts.map +1 -0
  327. package/dist/types/http/middleware/tenant.d.ts +30 -0
  328. package/dist/types/http/middleware/tenant.d.ts.map +1 -0
  329. package/dist/types/http/resolver.d.ts +22 -0
  330. package/dist/types/http/resolver.d.ts.map +1 -0
  331. package/dist/types/http/router.d.ts +21 -0
  332. package/dist/types/http/router.d.ts.map +1 -0
  333. package/dist/types/http/schemas/authorize.d.ts +92 -0
  334. package/dist/types/http/schemas/authorize.d.ts.map +1 -0
  335. package/dist/types/http/schemas/end-session.d.ts +31 -0
  336. package/dist/types/http/schemas/end-session.d.ts.map +1 -0
  337. package/dist/types/http/schemas/par.d.ts +20 -0
  338. package/dist/types/http/schemas/par.d.ts.map +1 -0
  339. package/dist/types/http/schemas/register.d.ts +42 -0
  340. package/dist/types/http/schemas/register.d.ts.map +1 -0
  341. package/dist/types/http/schemas/revocation.d.ts +41 -0
  342. package/dist/types/http/schemas/revocation.d.ts.map +1 -0
  343. package/dist/types/http/schemas/token.d.ts +227 -0
  344. package/dist/types/http/schemas/token.d.ts.map +1 -0
  345. package/dist/types/index.d.ts +63 -13
  346. package/dist/types/index.d.ts.map +1 -1
  347. package/dist/types/methods/code.d.ts +96 -0
  348. package/dist/types/methods/code.d.ts.map +1 -0
  349. package/dist/types/methods/m2m.d.ts +41 -0
  350. package/dist/types/methods/m2m.d.ts.map +1 -0
  351. package/dist/types/methods/oauth2-factory.d.ts +133 -0
  352. package/dist/types/methods/oauth2-factory.d.ts.map +1 -0
  353. package/dist/types/methods/oauth2-generic.d.ts +75 -0
  354. package/dist/types/methods/oauth2-generic.d.ts.map +1 -0
  355. package/dist/types/methods/oidc-generic.d.ts +26 -0
  356. package/dist/types/methods/oidc-generic.d.ts.map +1 -0
  357. package/dist/types/methods/passkey.d.ts +106 -0
  358. package/dist/types/methods/passkey.d.ts.map +1 -0
  359. package/dist/types/methods/password-hash.d.ts +25 -0
  360. package/dist/types/methods/password-hash.d.ts.map +1 -0
  361. package/dist/types/methods/password.d.ts +70 -0
  362. package/dist/types/methods/password.d.ts.map +1 -0
  363. package/dist/types/methods/providers/apple.d.ts +29 -0
  364. package/dist/types/methods/providers/apple.d.ts.map +1 -0
  365. package/dist/types/methods/providers/cognito.d.ts +36 -0
  366. package/dist/types/methods/providers/cognito.d.ts.map +1 -0
  367. package/dist/types/methods/providers/discord.d.ts +22 -0
  368. package/dist/types/methods/providers/discord.d.ts.map +1 -0
  369. package/dist/types/methods/providers/facebook.d.ts +29 -0
  370. package/dist/types/methods/providers/facebook.d.ts.map +1 -0
  371. package/dist/types/methods/providers/github.d.ts +25 -0
  372. package/dist/types/methods/providers/github.d.ts.map +1 -0
  373. package/dist/types/methods/providers/google.d.ts +28 -0
  374. package/dist/types/methods/providers/google.d.ts.map +1 -0
  375. package/dist/types/methods/providers/index.d.ts +24 -0
  376. package/dist/types/methods/providers/index.d.ts.map +1 -0
  377. package/dist/types/methods/providers/jumpcloud.d.ts +22 -0
  378. package/dist/types/methods/providers/jumpcloud.d.ts.map +1 -0
  379. package/dist/types/methods/providers/keycloak.d.ts +30 -0
  380. package/dist/types/methods/providers/keycloak.d.ts.map +1 -0
  381. package/dist/types/methods/providers/linkedin.d.ts +22 -0
  382. package/dist/types/methods/providers/linkedin.d.ts.map +1 -0
  383. package/dist/types/methods/providers/microsoft.d.ts +30 -0
  384. package/dist/types/methods/providers/microsoft.d.ts.map +1 -0
  385. package/dist/types/methods/providers/slack.d.ts +25 -0
  386. package/dist/types/methods/providers/slack.d.ts.map +1 -0
  387. package/dist/types/methods/providers/spotify.d.ts +22 -0
  388. package/dist/types/methods/providers/spotify.d.ts.map +1 -0
  389. package/dist/types/methods/providers/twitch.d.ts +23 -0
  390. package/dist/types/methods/providers/twitch.d.ts.map +1 -0
  391. package/dist/types/methods/providers/x.d.ts +25 -0
  392. package/dist/types/methods/providers/x.d.ts.map +1 -0
  393. package/dist/types/methods/providers/yahoo.d.ts +22 -0
  394. package/dist/types/methods/providers/yahoo.d.ts.map +1 -0
  395. package/dist/types/pkce.d.ts +1 -2
  396. package/dist/types/pkce.d.ts.map +1 -1
  397. package/dist/types/ports/audit-log.d.ts +166 -0
  398. package/dist/types/ports/audit-log.d.ts.map +1 -0
  399. package/dist/types/ports/config-store.d.ts +32 -0
  400. package/dist/types/ports/config-store.d.ts.map +1 -0
  401. package/dist/types/ports/key-store.d.ts +98 -0
  402. package/dist/types/ports/key-store.d.ts.map +1 -0
  403. package/dist/types/ports/method-store.d.ts +29 -0
  404. package/dist/types/ports/method-store.d.ts.map +1 -0
  405. package/dist/types/ports/session-store.d.ts +109 -0
  406. package/dist/types/ports/session-store.d.ts.map +1 -0
  407. package/dist/types/ports/token-store.d.ts +105 -0
  408. package/dist/types/ports/token-store.d.ts.map +1 -0
  409. package/dist/types/types/authorization.d.ts +75 -0
  410. package/dist/types/types/authorization.d.ts.map +1 -0
  411. package/dist/types/types/error.d.ts +101 -0
  412. package/dist/types/types/error.d.ts.map +1 -0
  413. package/dist/types/types/flow.d.ts +97 -0
  414. package/dist/types/types/flow.d.ts.map +1 -0
  415. package/dist/types/types/idp.d.ts +324 -0
  416. package/dist/types/types/idp.d.ts.map +1 -0
  417. package/dist/types/types/method.d.ts +256 -0
  418. package/dist/types/types/method.d.ts.map +1 -0
  419. package/dist/types/types/picker.d.ts +31 -0
  420. package/dist/types/types/picker.d.ts.map +1 -0
  421. package/dist/types/types/result.d.ts +29 -0
  422. package/dist/types/types/result.d.ts.map +1 -0
  423. package/dist/types/types/subject.d.ts +47 -0
  424. package/dist/types/types/subject.d.ts.map +1 -0
  425. package/dist/types/types/tenant.d.ts +276 -0
  426. package/dist/types/types/tenant.d.ts.map +1 -0
  427. package/dist/types/types/token.d.ts +231 -0
  428. package/dist/types/types/token.d.ts.map +1 -0
  429. package/dist/types/ui/forms.d.ts +35 -0
  430. package/dist/types/ui/forms.d.ts.map +1 -0
  431. package/dist/types/ui/index.d.ts +14 -0
  432. package/dist/types/ui/index.d.ts.map +1 -0
  433. package/dist/types/ui/picker.d.ts +18 -0
  434. package/dist/types/ui/picker.d.ts.map +1 -0
  435. package/package.json +41 -6
  436. package/src/adapters/d1/audit-log.ts +32 -0
  437. package/src/adapters/d1/config-store.ts +67 -0
  438. package/src/adapters/d1/index.ts +41 -0
  439. package/src/adapters/d1/key-store.ts +218 -0
  440. package/src/adapters/d1/method-store.ts +103 -0
  441. package/src/adapters/d1/migrations.ts +89 -0
  442. package/src/adapters/d1/session-store.ts +230 -0
  443. package/src/adapters/d1/session.ts +38 -0
  444. package/src/adapters/d1/token-store.ts +251 -0
  445. package/src/adapters/d1/types.ts +53 -0
  446. package/src/adapters/durable-object/index.ts +23 -0
  447. package/src/adapters/durable-object/session-store.ts +227 -0
  448. package/src/adapters/durable-object/types.ts +25 -0
  449. package/src/adapters/dynamo/audit-log.ts +35 -0
  450. package/src/adapters/dynamo/client.ts +118 -0
  451. package/src/adapters/dynamo/config-store.ts +72 -0
  452. package/src/adapters/dynamo/index.ts +81 -0
  453. package/src/adapters/dynamo/key-store.ts +267 -0
  454. package/src/adapters/dynamo/method-store.ts +105 -0
  455. package/src/adapters/dynamo/passkey-credential-store.ts +132 -0
  456. package/src/adapters/dynamo/sdk.ts +189 -0
  457. package/src/adapters/dynamo/session-store.ts +229 -0
  458. package/src/adapters/dynamo/token-store.ts +248 -0
  459. package/src/adapters/kms/in-memory-backing.ts +36 -0
  460. package/src/adapters/kms/index.ts +39 -0
  461. package/src/adapters/kms/key-store.ts +176 -0
  462. package/src/adapters/kms/sdk.ts +39 -0
  463. package/src/adapters/kms/types.ts +61 -0
  464. package/src/adapters/kv/audit-log.ts +40 -0
  465. package/src/adapters/kv/config-store.ts +63 -0
  466. package/src/adapters/kv/index.ts +20 -0
  467. package/src/adapters/kv/method-store.ts +98 -0
  468. package/src/adapters/kv/types.ts +26 -0
  469. package/src/adapters/memory/audit-log.ts +28 -0
  470. package/src/adapters/memory/clock.ts +7 -0
  471. package/src/adapters/memory/config-store.ts +41 -0
  472. package/src/adapters/memory/index.ts +26 -0
  473. package/src/adapters/memory/key-store.ts +102 -0
  474. package/src/adapters/memory/method-store.ts +75 -0
  475. package/src/adapters/memory/passkey-credential-store.ts +97 -0
  476. package/src/adapters/memory/session-store.ts +171 -0
  477. package/src/adapters/memory/token-store.ts +181 -0
  478. package/src/adapters/postgres/audit-log.ts +34 -0
  479. package/src/adapters/postgres/config-store.ts +72 -0
  480. package/src/adapters/postgres/executor.ts +76 -0
  481. package/src/adapters/postgres/index.ts +60 -0
  482. package/src/adapters/postgres/key-store.ts +334 -0
  483. package/src/adapters/postgres/method-store.ts +104 -0
  484. package/src/adapters/postgres/migrations.ts +131 -0
  485. package/src/adapters/postgres/passkey-credential-store.ts +150 -0
  486. package/src/adapters/postgres/session-store.ts +216 -0
  487. package/src/adapters/postgres/token-store.ts +263 -0
  488. package/src/client.ts +82 -16
  489. package/src/domain/audit.ts +28 -0
  490. package/src/domain/authorize.ts +414 -0
  491. package/src/domain/callback.ts +268 -0
  492. package/src/domain/client-auth.ts +116 -0
  493. package/src/domain/client-credentials.ts +180 -0
  494. package/src/domain/crypto.ts +168 -0
  495. package/src/domain/discovery.ts +161 -0
  496. package/src/domain/dpop.ts +293 -0
  497. package/src/domain/id-token.ts +213 -0
  498. package/src/domain/introspect.ts +155 -0
  499. package/src/domain/jwt.ts +185 -0
  500. package/src/domain/logout.ts +180 -0
  501. package/src/domain/method-cache.ts +220 -0
  502. package/src/domain/method-dispatch.ts +95 -0
  503. package/src/domain/method-route.ts +213 -0
  504. package/src/domain/par.ts +141 -0
  505. package/src/domain/pkce.ts +37 -0
  506. package/src/domain/refresh.ts +210 -0
  507. package/src/domain/register.ts +168 -0
  508. package/src/domain/revoke.ts +161 -0
  509. package/src/domain/state-envelope.ts +142 -0
  510. package/src/domain/token-exchange.ts +243 -0
  511. package/src/domain/token.ts +483 -0
  512. package/src/domain/userinfo.ts +171 -0
  513. package/src/http/context.ts +90 -0
  514. package/src/http/cookies.ts +167 -0
  515. package/src/http/errors.ts +98 -0
  516. package/src/http/handlers/authorize.ts +362 -0
  517. package/src/http/handlers/callback.ts +77 -0
  518. package/src/http/handlers/end-session.ts +106 -0
  519. package/src/http/handlers/metadata.ts +49 -0
  520. package/src/http/handlers/method-route.ts +115 -0
  521. package/src/http/handlers/par.ts +84 -0
  522. package/src/http/handlers/register.ts +70 -0
  523. package/src/http/handlers/revocation.ts +151 -0
  524. package/src/http/handlers/token.ts +300 -0
  525. package/src/http/handlers/userinfo.ts +90 -0
  526. package/src/http/middleware/error.ts +26 -0
  527. package/src/http/middleware/tenant.ts +165 -0
  528. package/src/http/resolver.ts +34 -0
  529. package/src/http/router.ts +85 -0
  530. package/src/http/schemas/authorize.ts +85 -0
  531. package/src/http/schemas/end-session.ts +23 -0
  532. package/src/http/schemas/par.ts +23 -0
  533. package/src/http/schemas/register.ts +29 -0
  534. package/src/http/schemas/revocation.ts +23 -0
  535. package/src/http/schemas/token.ts +85 -0
  536. package/src/index.ts +283 -20
  537. package/src/methods/code.ts +359 -0
  538. package/src/methods/m2m.ts +82 -0
  539. package/src/methods/oauth2-factory.ts +151 -0
  540. package/src/methods/oauth2-generic.ts +360 -0
  541. package/src/methods/oidc-generic.ts +109 -0
  542. package/src/methods/passkey.ts +419 -0
  543. package/src/methods/password-hash.ts +134 -0
  544. package/src/methods/password.ts +298 -0
  545. package/src/methods/providers/apple.ts +42 -0
  546. package/src/methods/providers/cognito.ts +55 -0
  547. package/src/methods/providers/discord.ts +37 -0
  548. package/src/methods/providers/facebook.ts +54 -0
  549. package/src/methods/providers/github.ts +42 -0
  550. package/src/methods/providers/google.ts +43 -0
  551. package/src/methods/providers/index.ts +23 -0
  552. package/src/methods/providers/jumpcloud.ts +36 -0
  553. package/src/methods/providers/keycloak.ts +42 -0
  554. package/src/methods/providers/linkedin.ts +37 -0
  555. package/src/methods/providers/microsoft.ts +42 -0
  556. package/src/methods/providers/slack.ts +42 -0
  557. package/src/methods/providers/spotify.ts +37 -0
  558. package/src/methods/providers/twitch.ts +38 -0
  559. package/src/methods/providers/x.ts +40 -0
  560. package/src/methods/providers/yahoo.ts +36 -0
  561. package/src/pkce.ts +20 -21
  562. package/src/ports/CONSISTENCY.md +119 -0
  563. package/src/ports/audit-log.ts +177 -0
  564. package/src/ports/config-store.ts +34 -0
  565. package/src/ports/key-store.ts +106 -0
  566. package/src/ports/method-store.ts +41 -0
  567. package/src/ports/session-store.ts +131 -0
  568. package/src/ports/token-store.ts +116 -0
  569. package/src/types/authorization.ts +78 -0
  570. package/src/types/error.ts +146 -0
  571. package/src/types/flow.ts +99 -0
  572. package/src/types/idp.ts +365 -0
  573. package/src/types/method.ts +270 -0
  574. package/src/types/picker.ts +32 -0
  575. package/src/types/result.ts +23 -0
  576. package/src/types/subject.ts +50 -0
  577. package/src/types/tenant.ts +285 -0
  578. package/src/types/token.ts +236 -0
  579. package/src/ui/forms.ts +289 -0
  580. package/src/ui/index.ts +14 -0
  581. package/src/ui/picker.ts +63 -0
  582. package/dist/esm/issuer.js +0 -691
  583. package/dist/esm/jwt.js +0 -16
  584. package/dist/esm/keys.js +0 -113
  585. package/dist/esm/provider/apple.js +0 -28
  586. package/dist/esm/provider/arctic.js +0 -43
  587. package/dist/esm/provider/code.js +0 -58
  588. package/dist/esm/provider/cognito.js +0 -16
  589. package/dist/esm/provider/discord.js +0 -15
  590. package/dist/esm/provider/facebook.js +0 -24
  591. package/dist/esm/provider/github.js +0 -15
  592. package/dist/esm/provider/google.js +0 -25
  593. package/dist/esm/provider/index.js +0 -3
  594. package/dist/esm/provider/jumpcloud.js +0 -15
  595. package/dist/esm/provider/keycloak.js +0 -15
  596. package/dist/esm/provider/linkedin.js +0 -15
  597. package/dist/esm/provider/m2m.js +0 -16
  598. package/dist/esm/provider/microsoft.js +0 -24
  599. package/dist/esm/provider/oauth2.js +0 -119
  600. package/dist/esm/provider/oidc.js +0 -69
  601. package/dist/esm/provider/passkey.js +0 -315
  602. package/dist/esm/provider/password.js +0 -306
  603. package/dist/esm/provider/provider.js +0 -10
  604. package/dist/esm/provider/slack.js +0 -15
  605. package/dist/esm/provider/spotify.js +0 -15
  606. package/dist/esm/provider/twitch.js +0 -15
  607. package/dist/esm/provider/x.js +0 -16
  608. package/dist/esm/provider/yahoo.js +0 -15
  609. package/dist/esm/random.js +0 -27
  610. package/dist/esm/storage/aws.js +0 -39
  611. package/dist/esm/storage/cloudflare.js +0 -42
  612. package/dist/esm/storage/dynamo.js +0 -116
  613. package/dist/esm/storage/memory.js +0 -88
  614. package/dist/esm/storage/storage.js +0 -36
  615. package/dist/esm/subject.js +0 -7
  616. package/dist/esm/ui/base.js +0 -407
  617. package/dist/esm/ui/code.js +0 -151
  618. package/dist/esm/ui/form.js +0 -43
  619. package/dist/esm/ui/icon.js +0 -92
  620. package/dist/esm/ui/passkey.js +0 -329
  621. package/dist/esm/ui/password.js +0 -338
  622. package/dist/esm/ui/select.js +0 -187
  623. package/dist/esm/ui/theme.js +0 -115
  624. package/dist/esm/util.js +0 -54
  625. package/dist/types/issuer.d.ts +0 -607
  626. package/dist/types/issuer.d.ts.map +0 -1
  627. package/dist/types/jwt.d.ts +0 -6
  628. package/dist/types/jwt.d.ts.map +0 -1
  629. package/dist/types/keys.d.ts +0 -18
  630. package/dist/types/keys.d.ts.map +0 -1
  631. package/dist/types/provider/apple.d.ts +0 -108
  632. package/dist/types/provider/apple.d.ts.map +0 -1
  633. package/dist/types/provider/arctic.d.ts +0 -16
  634. package/dist/types/provider/arctic.d.ts.map +0 -1
  635. package/dist/types/provider/code.d.ts +0 -74
  636. package/dist/types/provider/code.d.ts.map +0 -1
  637. package/dist/types/provider/cognito.d.ts +0 -64
  638. package/dist/types/provider/cognito.d.ts.map +0 -1
  639. package/dist/types/provider/discord.d.ts +0 -38
  640. package/dist/types/provider/discord.d.ts.map +0 -1
  641. package/dist/types/provider/facebook.d.ts +0 -74
  642. package/dist/types/provider/facebook.d.ts.map +0 -1
  643. package/dist/types/provider/github.d.ts +0 -38
  644. package/dist/types/provider/github.d.ts.map +0 -1
  645. package/dist/types/provider/google.d.ts +0 -74
  646. package/dist/types/provider/google.d.ts.map +0 -1
  647. package/dist/types/provider/index.d.ts +0 -4
  648. package/dist/types/provider/index.d.ts.map +0 -1
  649. package/dist/types/provider/jumpcloud.d.ts +0 -38
  650. package/dist/types/provider/jumpcloud.d.ts.map +0 -1
  651. package/dist/types/provider/keycloak.d.ts +0 -67
  652. package/dist/types/provider/keycloak.d.ts.map +0 -1
  653. package/dist/types/provider/linkedin.d.ts +0 -6
  654. package/dist/types/provider/linkedin.d.ts.map +0 -1
  655. package/dist/types/provider/m2m.d.ts +0 -34
  656. package/dist/types/provider/m2m.d.ts.map +0 -1
  657. package/dist/types/provider/microsoft.d.ts +0 -89
  658. package/dist/types/provider/microsoft.d.ts.map +0 -1
  659. package/dist/types/provider/oauth2.d.ts +0 -133
  660. package/dist/types/provider/oauth2.d.ts.map +0 -1
  661. package/dist/types/provider/oidc.d.ts +0 -91
  662. package/dist/types/provider/oidc.d.ts.map +0 -1
  663. package/dist/types/provider/passkey.d.ts +0 -143
  664. package/dist/types/provider/passkey.d.ts.map +0 -1
  665. package/dist/types/provider/password.d.ts +0 -210
  666. package/dist/types/provider/password.d.ts.map +0 -1
  667. package/dist/types/provider/provider.d.ts +0 -29
  668. package/dist/types/provider/provider.d.ts.map +0 -1
  669. package/dist/types/provider/slack.d.ts +0 -59
  670. package/dist/types/provider/slack.d.ts.map +0 -1
  671. package/dist/types/provider/spotify.d.ts +0 -38
  672. package/dist/types/provider/spotify.d.ts.map +0 -1
  673. package/dist/types/provider/twitch.d.ts +0 -38
  674. package/dist/types/provider/twitch.d.ts.map +0 -1
  675. package/dist/types/provider/x.d.ts +0 -38
  676. package/dist/types/provider/x.d.ts.map +0 -1
  677. package/dist/types/provider/yahoo.d.ts +0 -38
  678. package/dist/types/provider/yahoo.d.ts.map +0 -1
  679. package/dist/types/random.d.ts +0 -3
  680. package/dist/types/random.d.ts.map +0 -1
  681. package/dist/types/storage/aws.d.ts +0 -4
  682. package/dist/types/storage/aws.d.ts.map +0 -1
  683. package/dist/types/storage/cloudflare.d.ts +0 -34
  684. package/dist/types/storage/cloudflare.d.ts.map +0 -1
  685. package/dist/types/storage/dynamo.d.ts +0 -65
  686. package/dist/types/storage/dynamo.d.ts.map +0 -1
  687. package/dist/types/storage/memory.d.ts +0 -49
  688. package/dist/types/storage/memory.d.ts.map +0 -1
  689. package/dist/types/storage/storage.d.ts +0 -15
  690. package/dist/types/storage/storage.d.ts.map +0 -1
  691. package/dist/types/subject.d.ts +0 -122
  692. package/dist/types/subject.d.ts.map +0 -1
  693. package/dist/types/ui/base.d.ts +0 -5
  694. package/dist/types/ui/base.d.ts.map +0 -1
  695. package/dist/types/ui/code.d.ts +0 -104
  696. package/dist/types/ui/code.d.ts.map +0 -1
  697. package/dist/types/ui/form.d.ts +0 -6
  698. package/dist/types/ui/form.d.ts.map +0 -1
  699. package/dist/types/ui/icon.d.ts +0 -6
  700. package/dist/types/ui/icon.d.ts.map +0 -1
  701. package/dist/types/ui/passkey.d.ts +0 -5
  702. package/dist/types/ui/passkey.d.ts.map +0 -1
  703. package/dist/types/ui/password.d.ts +0 -139
  704. package/dist/types/ui/password.d.ts.map +0 -1
  705. package/dist/types/ui/select.d.ts +0 -55
  706. package/dist/types/ui/select.d.ts.map +0 -1
  707. package/dist/types/ui/theme.d.ts +0 -207
  708. package/dist/types/ui/theme.d.ts.map +0 -1
  709. package/dist/types/util.d.ts +0 -8
  710. package/dist/types/util.d.ts.map +0 -1
  711. package/src/css.d.ts +0 -4
  712. package/src/issuer.ts +0 -1628
  713. package/src/jwt.ts +0 -17
  714. package/src/keys.ts +0 -139
  715. package/src/provider/apple.ts +0 -127
  716. package/src/provider/arctic.ts +0 -66
  717. package/src/provider/code.ts +0 -227
  718. package/src/provider/cognito.ts +0 -74
  719. package/src/provider/discord.ts +0 -45
  720. package/src/provider/facebook.ts +0 -84
  721. package/src/provider/github.ts +0 -45
  722. package/src/provider/google.ts +0 -85
  723. package/src/provider/index.ts +0 -3
  724. package/src/provider/jumpcloud.ts +0 -45
  725. package/src/provider/keycloak.ts +0 -75
  726. package/src/provider/linkedin.ts +0 -12
  727. package/src/provider/m2m.ts +0 -56
  728. package/src/provider/microsoft.ts +0 -100
  729. package/src/provider/oauth2.ts +0 -297
  730. package/src/provider/oidc.ts +0 -179
  731. package/src/provider/passkey.ts +0 -655
  732. package/src/provider/password.ts +0 -672
  733. package/src/provider/provider.ts +0 -33
  734. package/src/provider/slack.ts +0 -67
  735. package/src/provider/spotify.ts +0 -45
  736. package/src/provider/twitch.ts +0 -45
  737. package/src/provider/x.ts +0 -46
  738. package/src/provider/yahoo.ts +0 -45
  739. package/src/random.ts +0 -24
  740. package/src/storage/aws.ts +0 -59
  741. package/src/storage/cloudflare.ts +0 -77
  742. package/src/storage/dynamo.ts +0 -193
  743. package/src/storage/memory.ts +0 -135
  744. package/src/storage/storage.ts +0 -46
  745. package/src/subject.ts +0 -130
  746. package/src/ui/base.tsx +0 -118
  747. package/src/ui/code.tsx +0 -215
  748. package/src/ui/form.tsx +0 -40
  749. package/src/ui/icon.tsx +0 -95
  750. package/src/ui/passkey.tsx +0 -321
  751. package/src/ui/password.tsx +0 -405
  752. package/src/ui/select.tsx +0 -221
  753. package/src/ui/theme.ts +0 -319
  754. package/src/ui/ui.css +0 -252
  755. package/src/util.ts +0 -58
  756. /package/dist/esm/{css.d.js → adapters/d1/types.js} +0 -0
@@ -0,0 +1,414 @@
1
+ /**
2
+ * `startAuthorize` — orchestrate the `/authorize` flow.
3
+ *
4
+ * Pure domain function over typed ports. The HTTP layer (Phase 3) parses
5
+ * the incoming `Request` into an `AuthorizationRequest`, runs
6
+ * `resolveTenant`, then calls into this function. No framework imports.
7
+ *
8
+ * Responsibilities (in order):
9
+ * 1. Validate the request against the registered `ClientConfig` —
10
+ * client lookup, redirect-URI exact match, scope subset, PKCE
11
+ * required-when-required.
12
+ * 2. Pick the method to dispatch to: explicit `methodId` if present,
13
+ * else the only enabled method, else surface a method-selection
14
+ * output for the UI.
15
+ * 3. Atomically `saveFlow` the `FlowRecord` (creates the
16
+ * pre-callback state) under a freshly minted `flowId`.
17
+ * 4. Mint the MAC-signed `state` envelope under the active key.
18
+ * 5. Dispatch to the method's `GET /authorize` handler — the method
19
+ * builds the upstream redirect (or renders the credential form,
20
+ * etc.) using the `dispatch.state` / `dispatch.callbackUrl` data
21
+ * we supply.
22
+ * 6. Translate the `MethodResult` into an `AuthorizeOutput`:
23
+ * `challenge` (HTTP layer renders), `success` (HTTP layer issues a
24
+ * code immediately — e.g. single-step credential flows), `denied`
25
+ * (OAuth `access_denied`), `error` (propagated).
26
+ *
27
+ * The framework writes / consumes `FlowRecord`. Methods read via
28
+ * `MethodContext.flow` / `methodState` and request state changes via
29
+ * `MethodResult.challenge.saveMethodState`.
30
+ */
31
+ import type { AuditLog } from "../ports/audit-log"
32
+ import type { KeyStore } from "../ports/key-store"
33
+ import type { SessionStore } from "../ports/session-store"
34
+ import type { TokenStore } from "../ports/token-store"
35
+ import type { AuthError } from "../types/error"
36
+ import { authError } from "../types/error"
37
+ import type { FlowRecord } from "../types/flow"
38
+ import type { AuthorizationRequest } from "../types/authorization"
39
+ import type {
40
+ AnyAuthMethodFactory,
41
+ AuthMethod,
42
+ MethodResult,
43
+ SetCookie,
44
+ CachePolicy,
45
+ } from "../types/method"
46
+ import type { Result } from "../types/result"
47
+ import { err, isErr, ok } from "../types/result"
48
+ import type { ClientConfig, StateKeyRing, TenantContext } from "../types/tenant"
49
+
50
+ import { safeAudit } from "./audit"
51
+ import { randomId, randomToken } from "./crypto"
52
+ import { MethodCache } from "./method-cache"
53
+ import { dispatchMethod } from "./method-dispatch"
54
+ import { mintStateEnvelope } from "./state-envelope"
55
+ import { saveEncryptedCode } from "./token"
56
+
57
+ /** Default 10-minute pre-callback flow lifetime per plan §"TTLs". */
58
+ export const DEFAULT_FLOW_TTL_MS = 10 * 60 * 1000
59
+
60
+ /**
61
+ * Auth-code lifetime per OAuth 2.1 BCP (`draft-ietf-oauth-v2-1-13` §4.1.3):
62
+ * the framework issues codes with this exact TTL, and every `TokenStore`
63
+ * adapter rejects `saveCode` calls whose `ttl` exceeds it. Treated as
64
+ * both the canonical default and the hard ceiling — there is no
65
+ * separate "max" knob.
66
+ */
67
+ export const AUTH_CODE_TTL_MS = 60 * 1000
68
+
69
+ export type AuthorizeOutput =
70
+ /**
71
+ * Render the method's challenge (UI / redirect). HTTP layer applies
72
+ * cookies. `flowId` is exposed so the HTTP layer can stamp the
73
+ * framework's `idp.flow` cookie — used by credential POSTs (`/m/...`)
74
+ * to identify the in-flight flow without trusting form input, and as
75
+ * defense-in-depth for the OAuth callback path.
76
+ */
77
+ | {
78
+ kind: "challenge"
79
+ response: Response
80
+ setCookies: SetCookie[]
81
+ flowId: string
82
+ cache?: CachePolicy
83
+ }
84
+ /**
85
+ * Method returned synchronous success (e.g. single-step credential flow).
86
+ * The framework has minted an auth code; HTTP layer 302s back to the RP
87
+ * with `code` + `state` in the query.
88
+ */
89
+ | {
90
+ kind: "issue-code"
91
+ code: string
92
+ appRedirectUri: string
93
+ appState: string | null
94
+ }
95
+ /** Method denied — surface `access_denied` per OAuth 2.1. */
96
+ | { kind: "denied"; reason: string; setCookies: SetCookie[] }
97
+ /**
98
+ * No `methodId` given and >1 enabled methods configured. HTTP layer
99
+ * renders a selection page that re-requests `/authorize?methodId=…`.
100
+ */
101
+ | {
102
+ kind: "select-method"
103
+ methods: Array<{ id: string; kind: string; type: string }>
104
+ }
105
+
106
+ export type StartAuthorizeInput = {
107
+ request: AuthorizationRequest
108
+ /** The raw `Request` — handed to the method via `MethodContext.request`. */
109
+ rawRequest: Request
110
+ tenant: TenantContext
111
+ cookies: ReadonlyMap<string, string>
112
+ }
113
+
114
+ export type StartAuthorizeDeps = {
115
+ sessionStore: SessionStore
116
+ tokenStore: TokenStore
117
+ /** Needed for at-rest encryption of the code payload — see `domain/token.ts`. */
118
+ keyStore: KeyStore
119
+ auditLog?: AuditLog
120
+ methodCache: MethodCache
121
+ stateKeys: StateKeyRing
122
+ /** Issuer URL — used to build the callback URL and threaded to methods. */
123
+ issuerUrl: string
124
+ /** Tenant-partitioned callback host helper. Optional (recovery mechanism #2). */
125
+ callbackHostFor?: (tenantId: string) => string
126
+ clock: () => number
127
+ /** Override for testability. Defaults to `randomId` / `randomToken`. */
128
+ newFlowId?: () => string
129
+ newCodeId?: () => string
130
+ newNonce?: () => string
131
+ /** Override TTLs. */
132
+ flowTtlMs?: number
133
+ }
134
+
135
+ export async function startAuthorize(
136
+ input: StartAuthorizeInput,
137
+ deps: StartAuthorizeDeps,
138
+ ): Promise<Result<AuthorizeOutput, AuthError>> {
139
+ const tenant = input.tenant
140
+ const req = input.request
141
+
142
+ // 1. Validate client + request shape.
143
+ const client = tenant.config.clients.find((c) => c.id === req.clientId)
144
+ if (!client) {
145
+ return err(authError.invalidClient(`unknown client "${req.clientId}"`))
146
+ }
147
+ if (!client.redirectUris.includes(req.redirectUri)) {
148
+ return err(
149
+ authError.invalidRequest(
150
+ `redirect_uri "${req.redirectUri}" not registered for client "${client.id}"`,
151
+ "redirect_uri",
152
+ ),
153
+ )
154
+ }
155
+ if (req.responseType !== "code") {
156
+ return err(
157
+ authError.invalidRequest(
158
+ `unsupported response_type "${req.responseType}" — OAuth 2.1 is code-only`,
159
+ "response_type",
160
+ ),
161
+ )
162
+ }
163
+ const grantOk = client.grantTypes.includes("authorization_code")
164
+ if (!grantOk) {
165
+ return err(
166
+ authError.unauthorizedClient(
167
+ `client "${client.id}" is not authorized for authorization_code grant`,
168
+ ),
169
+ )
170
+ }
171
+ const scopeError = validateScopes(req.scopes, client.scopes)
172
+ if (scopeError) return err(scopeError)
173
+ const pkceError = validatePkceRequirement(req, client)
174
+ if (pkceError) return err(pkceError)
175
+
176
+ // 2. Resolve method.
177
+ const enabled = tenant.config.methods.filter((m) => m.enabled)
178
+ if (enabled.length === 0) {
179
+ return err(
180
+ authError.methodNotFound("no auth methods enabled for tenant", {}),
181
+ )
182
+ }
183
+ let methodId = req.methodId
184
+ if (!methodId) {
185
+ if (enabled.length === 1) {
186
+ methodId = enabled[0]!.id
187
+ } else {
188
+ return ok({
189
+ kind: "select-method",
190
+ methods: enabled.map((m) => ({ id: m.id, kind: m.kind, type: m.type })),
191
+ })
192
+ }
193
+ }
194
+ const methodResult = await deps.methodCache.resolve(tenant.config, methodId)
195
+ if (isErr(methodResult)) return err(methodResult.error)
196
+ const method = methodResult.value
197
+
198
+ // 3. Create + persist FlowRecord, then mint state envelope.
199
+ const flowId = (deps.newFlowId ?? randomId)()
200
+ const nonce = (deps.newNonce ?? randomToken)()
201
+ const flowTtl = deps.flowTtlMs ?? DEFAULT_FLOW_TTL_MS
202
+ const now = deps.clock()
203
+ const callbackHost =
204
+ deps.callbackHostFor?.(tenant.id) ?? new URL(deps.issuerUrl).host
205
+ const callbackPath = `/cb/${methodId}`
206
+ const callbackUrl = `${new URL(deps.issuerUrl).protocol}//${callbackHost}${callbackPath}`
207
+
208
+ const record: FlowRecord = {
209
+ flowId,
210
+ tenantId: tenant.id,
211
+ methodId,
212
+ methodKind: method.kind,
213
+ clientId: client.id,
214
+ appRedirectUri: req.redirectUri,
215
+ callbackPath,
216
+ callbackHost,
217
+ appState: req.state,
218
+ scopes: req.scopes,
219
+ responseType: "code",
220
+ audience: req.audience,
221
+ prompt: req.prompt,
222
+ uiLocales: req.uiLocales,
223
+ nonce,
224
+ ...(req.nonce !== undefined ? { appNonce: req.nonce } : {}),
225
+ ...(req.claimsRequest !== undefined
226
+ ? { claimsRequest: req.claimsRequest }
227
+ : {}),
228
+ clientPkce: req.codeChallenge
229
+ ? { challenge: req.codeChallenge, method: "S256" }
230
+ : undefined,
231
+ methodState: null,
232
+ context: tenant.request.custom,
233
+ createdAt: now,
234
+ expiresAt: now + flowTtl,
235
+ }
236
+
237
+ const saved = await deps.sessionStore.saveFlow(flowId, record, flowTtl)
238
+ if (isErr(saved)) return err(saved.error)
239
+
240
+ const stateEnvelope = await mintStateEnvelope(
241
+ { tenantId: tenant.id, flowId, nonce },
242
+ deps.stateKeys,
243
+ )
244
+
245
+ await safeAudit(deps, {
246
+ kind: "authorize_started",
247
+ tenantId: tenant.id,
248
+ clientId: client.id,
249
+ methodId,
250
+ methodKind: method.kind,
251
+ flowId,
252
+ timestamp: now,
253
+ })
254
+
255
+ // 4. Dispatch to the method's GET /authorize handler.
256
+ const dispatched = await dispatchMethod({
257
+ method,
258
+ route: "GET /authorize",
259
+ tenant,
260
+ request: input.rawRequest,
261
+ subPath: "/authorize",
262
+ flow: record,
263
+ cookies: input.cookies,
264
+ sessionStore: deps.sessionStore,
265
+ dispatch: {
266
+ state: stateEnvelope,
267
+ callbackUrl,
268
+ issuerUrl: deps.issuerUrl,
269
+ },
270
+ })
271
+ if (isErr(dispatched)) return err(dispatched.error)
272
+ return translateMethodResult(dispatched.value, record, method, deps)
273
+ }
274
+
275
+ function validateScopes(
276
+ requested: string[],
277
+ allowed: string[],
278
+ ): AuthError | null {
279
+ for (const s of requested) {
280
+ if (!allowed.includes(s)) {
281
+ return authError.invalidScope(`scope "${s}" not allowed for client`)
282
+ }
283
+ }
284
+ return null
285
+ }
286
+
287
+ function validatePkceRequirement(
288
+ req: AuthorizationRequest,
289
+ client: ClientConfig,
290
+ ): AuthError | null {
291
+ // ClientConfig is a discriminated union: public clients have pkceRequired
292
+ // pinned to the literal `true`, so this single check covers both branches.
293
+ if (!client.pkceRequired) return null
294
+ if (!req.codeChallenge) {
295
+ return authError.invalidRequest(
296
+ `client "${client.id}" requires PKCE — missing code_challenge`,
297
+ "code_challenge",
298
+ )
299
+ }
300
+ if (req.codeChallengeMethod && req.codeChallengeMethod !== "S256") {
301
+ return authError.invalidRequest(
302
+ `unsupported code_challenge_method "${req.codeChallengeMethod}" — S256 required`,
303
+ "code_challenge_method",
304
+ )
305
+ }
306
+ return null
307
+ }
308
+
309
+ async function translateMethodResult(
310
+ result: MethodResult<unknown, unknown>,
311
+ record: FlowRecord,
312
+ _method: AuthMethod,
313
+ deps: StartAuthorizeDeps,
314
+ ): Promise<Result<AuthorizeOutput, AuthError>> {
315
+ switch (result.kind) {
316
+ case "challenge":
317
+ return ok({
318
+ kind: "challenge",
319
+ response: result.response,
320
+ setCookies: result.setCookies ?? [],
321
+ flowId: record.flowId,
322
+ ...(result.cache !== undefined ? { cache: result.cache } : {}),
323
+ })
324
+
325
+ case "success": {
326
+ const issued = await issueCodeFromInlineSuccess(result, record, deps)
327
+ return issued
328
+ }
329
+
330
+ case "denied":
331
+ await safeAudit(deps, {
332
+ kind: "authorize_failed",
333
+ tenantId: record.tenantId,
334
+ clientId: record.clientId,
335
+ methodId: record.methodId,
336
+ methodKind: record.methodKind,
337
+ flowId: record.flowId,
338
+ reason: result.reason,
339
+ timestamp: deps.clock(),
340
+ })
341
+ return ok({
342
+ kind: "denied",
343
+ reason: result.reason,
344
+ setCookies: result.setCookies ?? [],
345
+ })
346
+
347
+ case "error":
348
+ await safeAudit(deps, {
349
+ kind: "authorize_failed",
350
+ tenantId: record.tenantId,
351
+ clientId: record.clientId,
352
+ methodId: record.methodId,
353
+ methodKind: record.methodKind,
354
+ flowId: record.flowId,
355
+ reason: result.error.code,
356
+ timestamp: deps.clock(),
357
+ })
358
+ return err(result.error)
359
+ }
360
+ }
361
+
362
+ /**
363
+ * When a method short-circuits `/authorize` with `success` (e.g. a
364
+ * credential-form method that submits and succeeds in one round trip),
365
+ * we consume the in-memory flow record, snapshot it into a code, and
366
+ * return `issue-code` so the HTTP layer can redirect the user agent
367
+ * back to the RP.
368
+ */
369
+ async function issueCodeFromInlineSuccess(
370
+ result: Extract<MethodResult<unknown, unknown>, { kind: "success" }>,
371
+ record: FlowRecord,
372
+ deps: StartAuthorizeDeps,
373
+ ): Promise<Result<AuthorizeOutput, AuthError>> {
374
+ const code = (deps.newCodeId ?? randomToken)()
375
+ const consumed = await deps.sessionStore.consumeFlow(record.flowId)
376
+ if (isErr(consumed)) return err(consumed.error)
377
+ const flow = consumed.value
378
+ const now = deps.clock()
379
+ const saved = await saveEncryptedCode(
380
+ code,
381
+ {
382
+ tenantId: flow.tenantId,
383
+ clientId: flow.clientId,
384
+ appRedirectUri: flow.appRedirectUri,
385
+ appState: flow.appState,
386
+ scopes: flow.scopes,
387
+ audience: flow.audience,
388
+ clientPkce: flow.clientPkce,
389
+ methodId: flow.methodId,
390
+ methodKind: flow.methodKind,
391
+ context: flow.context ?? null,
392
+ providerSubject: result.providerSubject,
393
+ properties: result.properties,
394
+ ...(flow.appNonce !== undefined ? { appNonce: flow.appNonce } : {}),
395
+ ...(flow.claimsRequest !== undefined
396
+ ? { claimsRequest: flow.claimsRequest }
397
+ : {}),
398
+ authTime: Math.floor(now / 1000),
399
+ expiresAt: now + AUTH_CODE_TTL_MS,
400
+ },
401
+ AUTH_CODE_TTL_MS,
402
+ { keyStore: deps.keyStore, tokenStore: deps.tokenStore },
403
+ )
404
+ if (isErr(saved)) return err(saved.error)
405
+ return ok({
406
+ kind: "issue-code",
407
+ code,
408
+ appRedirectUri: flow.appRedirectUri,
409
+ appState: flow.appState,
410
+ })
411
+ }
412
+
413
+ /** Factory map type — exported for HTTP-layer consumers. */
414
+ export type FactoryMap = Record<string, AnyAuthMethodFactory>
@@ -0,0 +1,268 @@
1
+ /**
2
+ * `handleCallback` — process the upstream provider's redirect back to the
3
+ * IdP. The framework:
4
+ *
5
+ * 1. Recovers `(tenantId, flowId)` from the MAC-bound `state` envelope.
6
+ * 2. Atomically `consumeFlow(flowId)` — single delete-on-read, returns
7
+ * the full `FlowRecord`.
8
+ * 3. Runs the **state-flow consistency check** (tenant, nonce, host,
9
+ * path). Any mismatch → `invalid_request` + corresponding audit.
10
+ * 4. Loads tenant config + resolves the method via `MethodCache`.
11
+ * 5. Dispatches the method's `GET /callback` handler.
12
+ * 6. On `success`, snapshots the in-memory `FlowRecord` into the
13
+ * auth-code payload via `TokenStore.saveCode` and returns
14
+ * `issue-code`. `methodState` is NOT snapshotted.
15
+ *
16
+ * Phase 2 implements the `mac-state` recovery only. Recovery mechanisms
17
+ * #2 (partitioned-host) and #3 (`flowId`-in-URI) are wired in Phase 3
18
+ * alongside the HTTP layer that knows the request's host / path /
19
+ * registered redirect URIs.
20
+ */
21
+ import type { ConfigStore } from "../ports/config-store"
22
+ import type { KeyStore } from "../ports/key-store"
23
+ import type { SessionStore } from "../ports/session-store"
24
+ import type { TokenStore } from "../ports/token-store"
25
+ import type { AuditLog } from "../ports/audit-log"
26
+ import type { AuthError } from "../types/error"
27
+ import { authError } from "../types/error"
28
+ import type { FlowRecord } from "../types/flow"
29
+ import type { MethodResult, SetCookie, CachePolicy } from "../types/method"
30
+ import type { Result } from "../types/result"
31
+ import { err, isErr, ok } from "../types/result"
32
+ import type { StateKeyRing, TenantContext } from "../types/tenant"
33
+
34
+ import { safeAudit } from "./audit"
35
+ import { randomToken } from "./crypto"
36
+ import { MethodCache } from "./method-cache"
37
+ import { dispatchMethod } from "./method-dispatch"
38
+ import { saveEncryptedCode } from "./token"
39
+ import { verifyStateEnvelope } from "./state-envelope"
40
+ import { AUTH_CODE_TTL_MS } from "./authorize"
41
+
42
+ export type CallbackOutput =
43
+ | {
44
+ kind: "issue-code"
45
+ code: string
46
+ appRedirectUri: string
47
+ appState: string | null
48
+ }
49
+ | {
50
+ kind: "challenge"
51
+ response: Response
52
+ setCookies: SetCookie[]
53
+ cache?: CachePolicy
54
+ }
55
+ | { kind: "denied"; reason: string; setCookies: SetCookie[] }
56
+
57
+ export type HandleCallbackInput = {
58
+ /** The raw `Request` for the upstream provider's redirect. */
59
+ rawRequest: Request
60
+ cookies: ReadonlyMap<string, string>
61
+ }
62
+
63
+ export type HandleCallbackDeps = {
64
+ configStore: ConfigStore
65
+ sessionStore: SessionStore
66
+ tokenStore: TokenStore
67
+ /** Needed for at-rest encryption of the code payload — see `domain/token.ts`. */
68
+ keyStore: KeyStore
69
+ auditLog?: AuditLog
70
+ methodCache: MethodCache
71
+ stateKeys: StateKeyRing
72
+ clock: () => number
73
+ newCodeId?: () => string
74
+ /**
75
+ * Build the `TenantContext.request.custom` blob. Wired through from
76
+ * `IdPOptions.buildCustomContext` by the HTTP layer; if absent the
77
+ * blob is `{}`.
78
+ */
79
+ buildCustomContext?: (
80
+ req: Request,
81
+ ) => Record<string, unknown> | Promise<Record<string, unknown>>
82
+ }
83
+
84
+ export async function handleCallback(
85
+ input: HandleCallbackInput,
86
+ deps: HandleCallbackDeps,
87
+ ): Promise<Result<CallbackOutput, AuthError>> {
88
+ const url = new URL(input.rawRequest.url)
89
+ const state = url.searchParams.get("state")
90
+ if (!state) {
91
+ return err(authError.invalidRequest("missing state parameter", "state"))
92
+ }
93
+ const envelopeRes = await verifyStateEnvelope(state, deps.stateKeys)
94
+ if (isErr(envelopeRes)) {
95
+ await safeAudit(deps, {
96
+ kind: "flow_replay_attempt",
97
+ tenantId: null,
98
+ flowId: "unknown",
99
+ timestamp: deps.clock(),
100
+ })
101
+ return err(authError.invalidRequest(envelopeRes.error.description, "state"))
102
+ }
103
+ const envelope = envelopeRes.value
104
+
105
+ const flowRes = await deps.sessionStore.consumeFlow(envelope.flowId)
106
+ if (isErr(flowRes)) {
107
+ await safeAudit(deps, {
108
+ kind: "flow_replay_attempt",
109
+ tenantId: envelope.tenantId,
110
+ flowId: envelope.flowId,
111
+ timestamp: deps.clock(),
112
+ })
113
+ return err(authError.invalidRequest(flowRes.error.description, "state"))
114
+ }
115
+ const flow = flowRes.value
116
+
117
+ // 3. State-flow consistency check.
118
+ if (envelope.tenantId !== flow.tenantId) {
119
+ await safeAudit(deps, {
120
+ kind: "flow_tenant_mismatch",
121
+ stateTenantId: envelope.tenantId,
122
+ flowTenantId: flow.tenantId,
123
+ flowId: flow.flowId,
124
+ timestamp: deps.clock(),
125
+ })
126
+ return err(authError.invalidRequest("tenant mismatch", "state"))
127
+ }
128
+ if (envelope.nonce !== flow.nonce) {
129
+ return err(authError.invalidRequest("nonce mismatch", "state"))
130
+ }
131
+ if (url.host !== flow.callbackHost) {
132
+ await safeAudit(deps, {
133
+ kind: "flow_callback_mismatch",
134
+ tenantId: flow.tenantId,
135
+ flowId: flow.flowId,
136
+ expected: { host: flow.callbackHost, path: flow.callbackPath },
137
+ actual: { host: url.host, path: url.pathname },
138
+ timestamp: deps.clock(),
139
+ })
140
+ return err(authError.invalidRequest("host mismatch", "state"))
141
+ }
142
+ if (normalizePath(url.pathname) !== normalizePath(flow.callbackPath)) {
143
+ await safeAudit(deps, {
144
+ kind: "flow_callback_mismatch",
145
+ tenantId: flow.tenantId,
146
+ flowId: flow.flowId,
147
+ expected: { host: flow.callbackHost, path: flow.callbackPath },
148
+ actual: { host: url.host, path: url.pathname },
149
+ timestamp: deps.clock(),
150
+ })
151
+ return err(authError.invalidRequest("path mismatch", "state"))
152
+ }
153
+
154
+ // 4. Load tenant + resolve method.
155
+ const cfgRes = await deps.configStore.getTenantConfig(flow.tenantId)
156
+ if (isErr(cfgRes)) return err(cfgRes.error)
157
+ const tenant: TenantContext = {
158
+ id: flow.tenantId,
159
+ config: cfgRes.value,
160
+ request: {
161
+ raw: input.rawRequest,
162
+ custom: deps.buildCustomContext
163
+ ? await deps.buildCustomContext(input.rawRequest)
164
+ : {},
165
+ },
166
+ }
167
+ const methodRes = await deps.methodCache.resolve(cfgRes.value, flow.methodId)
168
+ if (isErr(methodRes)) return err(methodRes.error)
169
+
170
+ // 5. Dispatch.
171
+ const dispatched = await dispatchMethod({
172
+ method: methodRes.value,
173
+ route: "GET /callback",
174
+ tenant,
175
+ request: input.rawRequest,
176
+ subPath: "/callback",
177
+ flow,
178
+ cookies: input.cookies,
179
+ sessionStore: deps.sessionStore,
180
+ dispatch: null,
181
+ })
182
+ if (isErr(dispatched)) return err(dispatched.error)
183
+ return translate(dispatched.value, flow, deps)
184
+ }
185
+
186
+ async function translate(
187
+ result: MethodResult<unknown, unknown>,
188
+ flow: FlowRecord,
189
+ deps: HandleCallbackDeps,
190
+ ): Promise<Result<CallbackOutput, AuthError>> {
191
+ switch (result.kind) {
192
+ case "success": {
193
+ const code = (deps.newCodeId ?? randomToken)()
194
+ const now = deps.clock()
195
+ const saved = await saveEncryptedCode(
196
+ code,
197
+ {
198
+ tenantId: flow.tenantId,
199
+ clientId: flow.clientId,
200
+ appRedirectUri: flow.appRedirectUri,
201
+ appState: flow.appState,
202
+ scopes: flow.scopes,
203
+ audience: flow.audience,
204
+ clientPkce: flow.clientPkce,
205
+ methodId: flow.methodId,
206
+ methodKind: flow.methodKind,
207
+ context: flow.context ?? null,
208
+ providerSubject: result.providerSubject,
209
+ properties: result.properties,
210
+ ...(flow.appNonce !== undefined ? { appNonce: flow.appNonce } : {}),
211
+ ...(flow.claimsRequest !== undefined
212
+ ? { claimsRequest: flow.claimsRequest }
213
+ : {}),
214
+ authTime: Math.floor(now / 1000),
215
+ expiresAt: now + AUTH_CODE_TTL_MS,
216
+ },
217
+ AUTH_CODE_TTL_MS,
218
+ { keyStore: deps.keyStore, tokenStore: deps.tokenStore },
219
+ )
220
+ if (isErr(saved)) return err(saved.error)
221
+ return ok({
222
+ kind: "issue-code",
223
+ code,
224
+ appRedirectUri: flow.appRedirectUri,
225
+ appState: flow.appState,
226
+ })
227
+ }
228
+ case "challenge":
229
+ return ok({
230
+ kind: "challenge",
231
+ response: result.response,
232
+ setCookies: result.setCookies ?? [],
233
+ ...(result.cache !== undefined ? { cache: result.cache } : {}),
234
+ })
235
+ case "denied":
236
+ await safeAudit(deps, {
237
+ kind: "authorize_failed",
238
+ tenantId: flow.tenantId,
239
+ clientId: flow.clientId,
240
+ methodId: flow.methodId,
241
+ methodKind: flow.methodKind,
242
+ flowId: flow.flowId,
243
+ reason: result.reason,
244
+ timestamp: deps.clock(),
245
+ })
246
+ return ok({
247
+ kind: "denied",
248
+ reason: result.reason,
249
+ setCookies: result.setCookies ?? [],
250
+ })
251
+ case "error":
252
+ await safeAudit(deps, {
253
+ kind: "authorize_failed",
254
+ tenantId: flow.tenantId,
255
+ clientId: flow.clientId,
256
+ methodId: flow.methodId,
257
+ methodKind: flow.methodKind,
258
+ flowId: flow.flowId,
259
+ reason: result.error.code,
260
+ timestamp: deps.clock(),
261
+ })
262
+ return err(result.error)
263
+ }
264
+ }
265
+
266
+ function normalizePath(p: string): string {
267
+ return p.replace(/\/+$/, "")
268
+ }