@udibo/oauth2 0.14.0 → 0.15.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 (411) hide show
  1. package/README.md +45 -24
  2. package/{esm → dist}/adapters/hono/_common.d.ts +5 -5
  3. package/{esm → dist}/adapters/hono/_common.js +1 -1
  4. package/{esm → dist}/adapters/hono/authorization-server.d.ts +6 -7
  5. package/{esm → dist}/adapters/hono/authorization-server.js +0 -1
  6. package/{esm → dist}/adapters/hono/bff/auth-request-store.d.ts +2 -2
  7. package/{esm → dist}/adapters/hono/bff/auth-request-store.js +2 -2
  8. package/{esm → dist}/adapters/hono/bff/bff.d.ts +22 -12
  9. package/{esm → dist}/adapters/hono/bff/bff.js +35 -29
  10. package/{esm → dist}/adapters/hono/bff/cookie-prefix.js +1 -2
  11. package/{esm → dist}/adapters/hono/bff/mod.d.ts +5 -6
  12. package/{esm → dist}/adapters/hono/bff/mod.js +1 -2
  13. package/{esm → dist}/adapters/hono/bff/proxy.js +2 -1
  14. package/{esm → dist}/adapters/hono/bff/session-store.d.ts +2 -2
  15. package/{esm → dist}/adapters/hono/bff/session-store.js +7 -6
  16. package/{esm → dist}/adapters/hono/bff/testing.d.ts +7 -8
  17. package/{esm → dist}/adapters/hono/bff/testing.js +19 -22
  18. package/{esm → dist}/adapters/hono/identity.d.ts +1 -2
  19. package/{esm → dist}/adapters/hono/identity.js +10 -10
  20. package/{esm → dist}/adapters/hono/log.d.ts +0 -1
  21. package/{esm → dist}/adapters/hono/log.js +0 -6
  22. package/{esm → dist}/adapters/hono/resource-server.d.ts +5 -6
  23. package/{esm → dist}/adapters/hono/resource-server.js +0 -1
  24. package/dist/cli/bin.d.ts +2 -0
  25. package/dist/cli/bin.js +3 -0
  26. package/dist/cli/idp/config.d.ts +110 -0
  27. package/dist/cli/idp/config.js +269 -0
  28. package/dist/cli/idp/mod.d.ts +20 -0
  29. package/dist/cli/idp/mod.js +175 -0
  30. package/dist/cli/idp/pages.d.ts +56 -0
  31. package/dist/cli/idp/pages.js +190 -0
  32. package/dist/cli/idp/server.d.ts +93 -0
  33. package/dist/cli/idp/server.js +559 -0
  34. package/dist/cli/keygen.d.ts +13 -0
  35. package/dist/cli/keygen.js +30 -0
  36. package/dist/cli/mod.d.ts +34 -0
  37. package/dist/cli/mod.js +94 -0
  38. package/{esm → dist}/client/_http.d.ts +1 -1
  39. package/{esm → dist}/client/base.d.ts +1 -1
  40. package/{esm → dist}/client/bff-client.d.ts +1 -1
  41. package/{esm → dist}/client/bff-client.js +7 -6
  42. package/{esm → dist}/client/browser-storage.d.ts +1 -1
  43. package/{esm → dist}/client/check.js +1 -1
  44. package/{esm → dist}/client/direct-client.d.ts +6 -6
  45. package/{esm → dist}/client/direct-client.js +11 -13
  46. package/{esm → dist}/client/discovery-cache.d.ts +1 -1
  47. package/{esm → dist}/client/discovery-cache.js +2 -2
  48. package/{esm → dist}/client/events.d.ts +1 -1
  49. package/{esm → dist}/client/mod.d.ts +11 -12
  50. package/{esm → dist}/client/mod.js +1 -1
  51. package/{esm → dist}/errors.d.ts +1 -1
  52. package/{esm → dist}/errors.js +1 -1
  53. package/{esm → dist}/identity/events.d.ts +1 -1
  54. package/{esm → dist}/identity/external/_shared.d.ts +1 -1
  55. package/{esm → dist}/identity/external/_shared.js +1 -2
  56. package/{esm → dist}/identity/external/apple-client-secret.d.ts +1 -1
  57. package/{esm → dist}/identity/external/apple-client-secret.js +6 -7
  58. package/{esm → dist}/identity/external/apple.d.ts +5 -5
  59. package/{esm → dist}/identity/external/apple.js +10 -11
  60. package/{esm → dist}/identity/external/discord.d.ts +3 -3
  61. package/{esm → dist}/identity/external/discord.js +2 -2
  62. package/{esm → dist}/identity/external/flow.d.ts +1 -1
  63. package/{esm → dist}/identity/external/flow.js +2 -2
  64. package/{esm → dist}/identity/external/github.d.ts +3 -3
  65. package/{esm → dist}/identity/external/github.js +12 -17
  66. package/{esm → dist}/identity/external/google.d.ts +5 -5
  67. package/{esm → dist}/identity/external/google.js +2 -2
  68. package/{esm → dist}/identity/external/mod.d.ts +12 -13
  69. package/{esm → dist}/identity/external/mod.js +0 -1
  70. package/{esm → dist}/identity/external/oauth2.d.ts +1 -1
  71. package/{esm → dist}/identity/external/oauth2.js +8 -8
  72. package/{esm → dist}/identity/external/oidc.d.ts +4 -4
  73. package/{esm → dist}/identity/external/oidc.js +9 -8
  74. package/{esm → dist}/identity/hibp.d.ts +1 -1
  75. package/{esm → dist}/identity/hibp.js +1 -1
  76. package/{esm → dist}/identity/lockout.js +1 -2
  77. package/{esm → dist}/identity/mfa/mod.d.ts +4 -5
  78. package/{esm → dist}/identity/mfa/mod.js +1 -2
  79. package/{esm → dist}/identity/mfa/service.d.ts +3 -3
  80. package/{esm → dist}/identity/mfa/service.js +4 -3
  81. package/{esm → dist}/identity/mfa/totp.d.ts +1 -1
  82. package/{esm → dist}/identity/mfa/totp.js +2 -2
  83. package/{esm → dist}/identity/migration.d.ts +2 -3
  84. package/{esm → dist}/identity/migration.js +3 -4
  85. package/{esm → dist}/identity/mod.d.ts +14 -15
  86. package/{esm → dist}/identity/mod.js +0 -1
  87. package/{esm → dist}/identity/otp.d.ts +1 -1
  88. package/{esm → dist}/identity/otp.js +4 -2
  89. package/{esm → dist}/identity/password.js +8 -5
  90. package/{esm → dist}/identity/rate-limit.d.ts +1 -1
  91. package/{esm → dist}/identity/service.d.ts +10 -10
  92. package/{esm → dist}/identity/service.js +17 -18
  93. package/{esm → dist}/identity/session.js +2 -2
  94. package/{esm → dist}/identity/token-flow.js +3 -2
  95. package/{esm → dist}/models/authorization-code.d.ts +3 -3
  96. package/{esm → dist}/models/authorization.d.ts +1 -1
  97. package/{esm → dist}/models/authorization.js +1 -2
  98. package/{esm → dist}/models/device-authorization.d.ts +2 -2
  99. package/{esm → dist}/models/token.d.ts +3 -3
  100. package/{esm → dist}/react/callback.d.ts +1 -1
  101. package/{esm → dist}/react/callback.js +0 -1
  102. package/{esm → dist}/react/components/class-names.d.ts +1 -1
  103. package/{esm → dist}/react/components/class-names.js +3 -2
  104. package/{esm → dist}/react/components/internal.d.ts +2 -2
  105. package/{esm → dist}/react/components/internal.js +5 -11
  106. package/{esm → dist}/react/components/mfa-challenge-form.d.ts +2 -2
  107. package/{esm → dist}/react/components/mfa-challenge-form.js +4 -6
  108. package/{esm → dist}/react/components/mfa-enrollment-form.d.ts +2 -2
  109. package/{esm → dist}/react/components/mfa-enrollment-form.js +2 -6
  110. package/{esm → dist}/react/components/mod.d.ts +20 -21
  111. package/{esm → dist}/react/components/mod.js +1 -2
  112. package/{esm → dist}/react/components/request-password-reset-form.d.ts +2 -2
  113. package/{esm → dist}/react/components/request-password-reset-form.js +1 -3
  114. package/{esm → dist}/react/components/reset-password-form.d.ts +2 -2
  115. package/{esm → dist}/react/components/reset-password-form.js +2 -2
  116. package/{esm → dist}/react/components/sign-in-form.d.ts +2 -2
  117. package/{esm → dist}/react/components/sign-in-form.js +1 -5
  118. package/{esm → dist}/react/components/sign-up-form.d.ts +2 -2
  119. package/{esm → dist}/react/components/sign-up-form.js +4 -10
  120. package/{esm → dist}/react/components/types.d.ts +2 -2
  121. package/{esm → dist}/react/components/use-auth-form.d.ts +3 -3
  122. package/{esm → dist}/react/components/use-auth-form.js +4 -7
  123. package/{esm → dist}/react/components/user-menu.d.ts +2 -2
  124. package/{esm → dist}/react/components/user-menu.js +9 -14
  125. package/{esm → dist}/react/context.d.ts +1 -1
  126. package/{esm → dist}/react/mod.d.ts +6 -7
  127. package/{esm → dist}/react/mod.js +0 -1
  128. package/{esm → dist}/react/provider.d.ts +2 -2
  129. package/{esm → dist}/react/require-auth.js +1 -3
  130. package/{esm → dist}/react/testing.d.ts +2 -3
  131. package/{esm → dist}/react/testing.js +1 -2
  132. package/{esm → dist}/react/use-authorization.d.ts +1 -1
  133. package/{esm → dist}/react/use-oauth2.d.ts +8 -1
  134. package/{esm → dist}/react/use-oauth2.js +0 -1
  135. package/{esm → dist}/server/_clock-skew.js +2 -1
  136. package/{esm → dist}/server/authorization-server.d.ts +40 -41
  137. package/{esm → dist}/server/authorization-server.js +32 -42
  138. package/{esm → dist}/server/client-authentication.d.ts +2 -2
  139. package/{esm → dist}/server/grants/authorization-code.d.ts +9 -9
  140. package/{esm → dist}/server/grants/authorization-code.js +5 -6
  141. package/{esm → dist}/server/grants/client-credentials.d.ts +4 -4
  142. package/{esm → dist}/server/grants/device-authorization.d.ts +6 -6
  143. package/{esm → dist}/server/grants/device-authorization.js +4 -4
  144. package/{esm → dist}/server/grants/grant.d.ts +7 -7
  145. package/{esm → dist}/server/grants/grant.js +7 -7
  146. package/{esm → dist}/server/grants/password.d.ts +5 -5
  147. package/{esm → dist}/server/grants/refresh-token.d.ts +4 -4
  148. package/{esm → dist}/server/grants/refresh-token.js +5 -6
  149. package/{esm → dist}/server/introspection-token-reader.d.ts +5 -5
  150. package/{esm → dist}/server/introspection-token-reader.js +4 -4
  151. package/{esm → dist}/server/jwks-token-reader.d.ts +5 -5
  152. package/{esm → dist}/server/jwks-token-reader.js +4 -4
  153. package/{esm → dist}/server/mod.d.ts +12 -13
  154. package/{esm → dist}/server/mod.js +0 -1
  155. package/{esm → dist}/server/public-suffix/mod.d.ts +2 -3
  156. package/{esm → dist}/server/public-suffix/mod.js +1 -2
  157. package/{esm → dist}/server/public-suffix/rules.d.ts +1 -1
  158. package/{esm → dist}/server/public-suffix/rules.js +1 -1
  159. package/{esm → dist}/server/redirect-uri.js +5 -4
  160. package/{esm → dist}/server/resource-server.d.ts +11 -12
  161. package/{esm → dist}/server/resource-server.js +12 -14
  162. package/{esm → dist}/server/services/authorization-code.d.ts +5 -5
  163. package/{esm → dist}/server/services/client.d.ts +1 -1
  164. package/{esm → dist}/server/services/device-authorization.d.ts +3 -3
  165. package/{esm → dist}/server/services/token.d.ts +6 -6
  166. package/{esm → dist}/server/services/token.js +3 -1
  167. package/{esm → dist}/server/services/user.d.ts +1 -1
  168. package/{esm → dist}/server/signing-keys.d.ts +1 -1
  169. package/{esm → dist}/server/signing-keys.js +8 -2
  170. package/{esm → dist}/server/utils/hash.js +1 -1
  171. package/{esm → dist}/testing/contract/auth-request-storage.d.ts +1 -1
  172. package/{esm → dist}/testing/contract/auth-request-storage.js +24 -29
  173. package/{esm → dist}/testing/contract/authorization-code.d.ts +6 -6
  174. package/{esm → dist}/testing/contract/authorization-code.js +16 -17
  175. package/{esm → dist}/testing/contract/client.d.ts +4 -4
  176. package/{esm → dist}/testing/contract/client.js +14 -15
  177. package/{esm → dist}/testing/contract/device-authorization.d.ts +6 -6
  178. package/{esm → dist}/testing/contract/device-authorization.js +37 -39
  179. package/{esm → dist}/testing/contract/identity-session.d.ts +6 -1
  180. package/{esm → dist}/testing/contract/identity-session.js +44 -36
  181. package/{esm → dist}/testing/contract/identity-user-store.d.ts +8 -2
  182. package/{esm → dist}/testing/contract/identity-user-store.js +48 -46
  183. package/{esm → dist}/testing/contract/lockout-store.d.ts +1 -1
  184. package/{esm → dist}/testing/contract/lockout-store.js +23 -24
  185. package/{esm → dist}/testing/contract/mfa-store.d.ts +1 -1
  186. package/{esm → dist}/testing/contract/mfa-store.js +53 -54
  187. package/{esm → dist}/testing/contract/mod.d.ts +15 -16
  188. package/{esm → dist}/testing/contract/mod.js +0 -1
  189. package/{esm → dist}/testing/contract/otp-store.d.ts +1 -1
  190. package/{esm → dist}/testing/contract/otp-store.js +33 -34
  191. package/{esm → dist}/testing/contract/rate-limit-store.d.ts +1 -1
  192. package/{esm → dist}/testing/contract/rate-limit-store.js +15 -16
  193. package/{esm → dist}/testing/contract/tenant.js +361 -330
  194. package/{esm → dist}/testing/contract/token-flow-store.d.ts +1 -1
  195. package/{esm → dist}/testing/contract/token-flow-store.js +27 -32
  196. package/{esm → dist}/testing/contract/token-reader.d.ts +3 -3
  197. package/{esm → dist}/testing/contract/token-reader.js +6 -7
  198. package/{esm → dist}/testing/contract/token.d.ts +7 -7
  199. package/{esm → dist}/testing/contract/token.js +48 -53
  200. package/{esm → dist}/testing/contract/user.d.ts +2 -2
  201. package/{esm → dist}/testing/contract/user.js +8 -9
  202. package/{esm → dist}/testing/mod.d.ts +5 -6
  203. package/{esm → dist}/testing/mod.js +2 -3
  204. package/{esm → dist}/testing/server.d.ts +7 -6
  205. package/{esm → dist}/testing/server.js +2 -1
  206. package/{esm → dist}/testing/services.d.ts +11 -11
  207. package/{esm → dist}/testing/services.js +8 -8
  208. package/{esm → dist}/testing/tenant.d.ts +11 -7
  209. package/{esm → dist}/testing/tenant.js +109 -94
  210. package/dist/utils/_constant-time.d.ts +12 -0
  211. package/dist/utils/_constant-time.js +19 -0
  212. package/{esm → dist}/utils/_default-fetch.js +4 -1
  213. package/dist/utils/_delay.d.ts +13 -0
  214. package/dist/utils/_delay.js +28 -0
  215. package/dist/utils/_encoding.d.ts +39 -0
  216. package/dist/utils/_encoding.js +126 -0
  217. package/{esm → dist}/utils/authentication-context.d.ts +1 -1
  218. package/{esm → dist}/utils/crypto.d.ts +2 -3
  219. package/{esm → dist}/utils/crypto.js +3 -4
  220. package/{esm → dist}/utils/pkce.js +1 -1
  221. package/{esm → dist}/utils/text.js +1 -1
  222. package/{esm → dist}/utils/url.d.ts +0 -1
  223. package/{esm → dist}/utils/url.js +0 -1
  224. package/package.json +156 -33
  225. package/esm/_dnt.polyfills.d.ts +0 -31
  226. package/esm/_dnt.polyfills.js +0 -26
  227. package/esm/deps/jsr.io/@std/assert/1.0.19/almost_equals.d.ts +0 -29
  228. package/esm/deps/jsr.io/@std/assert/1.0.19/almost_equals.js +0 -47
  229. package/esm/deps/jsr.io/@std/assert/1.0.19/array_includes.d.ts +0 -28
  230. package/esm/deps/jsr.io/@std/assert/1.0.19/array_includes.js +0 -65
  231. package/esm/deps/jsr.io/@std/assert/1.0.19/assert.d.ts +0 -16
  232. package/esm/deps/jsr.io/@std/assert/1.0.19/assert.js +0 -23
  233. package/esm/deps/jsr.io/@std/assert/1.0.19/assertion_error.d.ts +0 -25
  234. package/esm/deps/jsr.io/@std/assert/1.0.19/assertion_error.js +0 -30
  235. package/esm/deps/jsr.io/@std/assert/1.0.19/equal.d.ts +0 -24
  236. package/esm/deps/jsr.io/@std/assert/1.0.19/equal.js +0 -193
  237. package/esm/deps/jsr.io/@std/assert/1.0.19/equals.d.ts +0 -36
  238. package/esm/deps/jsr.io/@std/assert/1.0.19/equals.js +0 -61
  239. package/esm/deps/jsr.io/@std/assert/1.0.19/exists.d.ts +0 -17
  240. package/esm/deps/jsr.io/@std/assert/1.0.19/exists.js +0 -27
  241. package/esm/deps/jsr.io/@std/assert/1.0.19/fail.d.ts +0 -14
  242. package/esm/deps/jsr.io/@std/assert/1.0.19/fail.js +0 -20
  243. package/esm/deps/jsr.io/@std/assert/1.0.19/false.d.ts +0 -18
  244. package/esm/deps/jsr.io/@std/assert/1.0.19/false.js +0 -23
  245. package/esm/deps/jsr.io/@std/assert/1.0.19/greater.d.ts +0 -19
  246. package/esm/deps/jsr.io/@std/assert/1.0.19/greater.js +0 -29
  247. package/esm/deps/jsr.io/@std/assert/1.0.19/greater_or_equal.d.ts +0 -19
  248. package/esm/deps/jsr.io/@std/assert/1.0.19/greater_or_equal.js +0 -29
  249. package/esm/deps/jsr.io/@std/assert/1.0.19/instance_of.d.ts +0 -22
  250. package/esm/deps/jsr.io/@std/assert/1.0.19/instance_of.js +0 -52
  251. package/esm/deps/jsr.io/@std/assert/1.0.19/is_error.d.ts +0 -24
  252. package/esm/deps/jsr.io/@std/assert/1.0.19/is_error.js +0 -53
  253. package/esm/deps/jsr.io/@std/assert/1.0.19/less.d.ts +0 -18
  254. package/esm/deps/jsr.io/@std/assert/1.0.19/less.js +0 -28
  255. package/esm/deps/jsr.io/@std/assert/1.0.19/less_or_equal.d.ts +0 -19
  256. package/esm/deps/jsr.io/@std/assert/1.0.19/less_or_equal.js +0 -29
  257. package/esm/deps/jsr.io/@std/assert/1.0.19/match.d.ts +0 -17
  258. package/esm/deps/jsr.io/@std/assert/1.0.19/match.js +0 -26
  259. package/esm/deps/jsr.io/@std/assert/1.0.19/mod.d.ts +0 -43
  260. package/esm/deps/jsr.io/@std/assert/1.0.19/mod.js +0 -45
  261. package/esm/deps/jsr.io/@std/assert/1.0.19/not_equals.d.ts +0 -26
  262. package/esm/deps/jsr.io/@std/assert/1.0.19/not_equals.js +0 -39
  263. package/esm/deps/jsr.io/@std/assert/1.0.19/not_instance_of.d.ts +0 -19
  264. package/esm/deps/jsr.io/@std/assert/1.0.19/not_instance_of.js +0 -29
  265. package/esm/deps/jsr.io/@std/assert/1.0.19/not_match.d.ts +0 -17
  266. package/esm/deps/jsr.io/@std/assert/1.0.19/not_match.js +0 -26
  267. package/esm/deps/jsr.io/@std/assert/1.0.19/not_strict_equals.d.ts +0 -22
  268. package/esm/deps/jsr.io/@std/assert/1.0.19/not_strict_equals.js +0 -32
  269. package/esm/deps/jsr.io/@std/assert/1.0.19/object_match.d.ts +0 -28
  270. package/esm/deps/jsr.io/@std/assert/1.0.19/object_match.js +0 -177
  271. package/esm/deps/jsr.io/@std/assert/1.0.19/rejects.d.ts +0 -41
  272. package/esm/deps/jsr.io/@std/assert/1.0.19/rejects.js +0 -53
  273. package/esm/deps/jsr.io/@std/assert/1.0.19/strict_equals.d.ts +0 -23
  274. package/esm/deps/jsr.io/@std/assert/1.0.19/strict_equals.js +0 -58
  275. package/esm/deps/jsr.io/@std/assert/1.0.19/string_includes.d.ts +0 -17
  276. package/esm/deps/jsr.io/@std/assert/1.0.19/string_includes.js +0 -26
  277. package/esm/deps/jsr.io/@std/assert/1.0.19/throws.d.ts +0 -44
  278. package/esm/deps/jsr.io/@std/assert/1.0.19/throws.js +0 -44
  279. package/esm/deps/jsr.io/@std/assert/1.0.19/unimplemented.d.ts +0 -14
  280. package/esm/deps/jsr.io/@std/assert/1.0.19/unimplemented.js +0 -20
  281. package/esm/deps/jsr.io/@std/assert/1.0.19/unreachable.d.ts +0 -14
  282. package/esm/deps/jsr.io/@std/assert/1.0.19/unreachable.js +0 -20
  283. package/esm/deps/jsr.io/@std/async/1.5.0/delay.d.ts +0 -44
  284. package/esm/deps/jsr.io/@std/async/1.5.0/delay.js +0 -84
  285. package/esm/deps/jsr.io/@std/crypto/1.1.0/timing_safe_equal.d.ts +0 -39
  286. package/esm/deps/jsr.io/@std/crypto/1.1.0/timing_safe_equal.js +0 -61
  287. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common16.d.ts +0 -22
  288. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common16.js +0 -51
  289. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common32.d.ts +0 -34
  290. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common32.js +0 -192
  291. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common64.d.ts +0 -34
  292. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common64.js +0 -113
  293. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common_detach.d.ts +0 -3
  294. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common_detach.js +0 -13
  295. package/esm/deps/jsr.io/@std/encoding/1.0.11/_types.d.ts +0 -8
  296. package/esm/deps/jsr.io/@std/encoding/1.0.11/_types.js +0 -2
  297. package/esm/deps/jsr.io/@std/encoding/1.0.11/_validate_binary_like.d.ts +0 -1
  298. package/esm/deps/jsr.io/@std/encoding/1.0.11/_validate_binary_like.js +0 -26
  299. package/esm/deps/jsr.io/@std/encoding/1.0.11/ascii85.d.ts +0 -60
  300. package/esm/deps/jsr.io/@std/encoding/1.0.11/ascii85.js +0 -152
  301. package/esm/deps/jsr.io/@std/encoding/1.0.11/base32.d.ts +0 -39
  302. package/esm/deps/jsr.io/@std/encoding/1.0.11/base32.js +0 -87
  303. package/esm/deps/jsr.io/@std/encoding/1.0.11/base58.d.ts +0 -39
  304. package/esm/deps/jsr.io/@std/encoding/1.0.11/base58.js +0 -131
  305. package/esm/deps/jsr.io/@std/encoding/1.0.11/base64.d.ts +0 -39
  306. package/esm/deps/jsr.io/@std/encoding/1.0.11/base64.js +0 -82
  307. package/esm/deps/jsr.io/@std/encoding/1.0.11/base64url.d.ts +0 -39
  308. package/esm/deps/jsr.io/@std/encoding/1.0.11/base64url.js +0 -72
  309. package/esm/deps/jsr.io/@std/encoding/1.0.11/hex.d.ts +0 -38
  310. package/esm/deps/jsr.io/@std/encoding/1.0.11/hex.js +0 -87
  311. package/esm/deps/jsr.io/@std/encoding/1.0.11/mod.d.ts +0 -97
  312. package/esm/deps/jsr.io/@std/encoding/1.0.11/mod.js +0 -99
  313. package/esm/deps/jsr.io/@std/encoding/1.0.11/varint.d.ts +0 -119
  314. package/esm/deps/jsr.io/@std/encoding/1.0.11/varint.js +0 -209
  315. package/esm/deps/jsr.io/@std/http/1.1.3/status.d.ts +0 -343
  316. package/esm/deps/jsr.io/@std/http/1.1.3/status.js +0 -343
  317. package/esm/deps/jsr.io/@std/internal/1.0.14/assertion_state.d.ts +0 -159
  318. package/esm/deps/jsr.io/@std/internal/1.0.14/assertion_state.js +0 -223
  319. package/esm/deps/jsr.io/@std/internal/1.0.14/build_message.d.ts +0 -79
  320. package/esm/deps/jsr.io/@std/internal/1.0.14/build_message.js +0 -116
  321. package/esm/deps/jsr.io/@std/internal/1.0.14/diff.d.ts +0 -139
  322. package/esm/deps/jsr.io/@std/internal/1.0.14/diff.js +0 -277
  323. package/esm/deps/jsr.io/@std/internal/1.0.14/diff_str.d.ts +0 -98
  324. package/esm/deps/jsr.io/@std/internal/1.0.14/diff_str.js +0 -181
  325. package/esm/deps/jsr.io/@std/internal/1.0.14/format.d.ts +0 -29
  326. package/esm/deps/jsr.io/@std/internal/1.0.14/format.js +0 -68
  327. package/esm/deps/jsr.io/@std/internal/1.0.14/styles.d.ts +0 -158
  328. package/esm/deps/jsr.io/@std/internal/1.0.14/styles.js +0 -206
  329. package/esm/deps/jsr.io/@std/internal/1.0.14/types.d.ts +0 -24
  330. package/esm/deps/jsr.io/@std/internal/1.0.14/types.js +0 -3
  331. package/esm/deps/jsr.io/@std/testing/1.0.20/_test_suite.d.ts +0 -91
  332. package/esm/deps/jsr.io/@std/testing/1.0.20/_test_suite.js +0 -347
  333. package/esm/deps/jsr.io/@std/testing/1.0.20/bdd.d.ts +0 -382
  334. package/esm/deps/jsr.io/@std/testing/1.0.20/bdd.js +0 -1110
  335. package/esm/deps/jsr.io/@udibo/http-error/0.11.1/mod.d.ts +0 -363
  336. package/esm/deps/jsr.io/@udibo/http-error/0.11.1/mod.js +0 -616
  337. package/esm/package.json +0 -3
  338. /package/{esm → dist}/adapters/hono/bff/cookie-prefix.d.ts +0 -0
  339. /package/{esm → dist}/adapters/hono/bff/proxy.d.ts +0 -0
  340. /package/{esm → dist}/client/_http.js +0 -0
  341. /package/{esm → dist}/client/base.js +0 -0
  342. /package/{esm → dist}/client/browser-storage.js +0 -0
  343. /package/{esm → dist}/client/check.d.ts +0 -0
  344. /package/{esm → dist}/client/events.js +0 -0
  345. /package/{esm → dist}/client/storage.d.ts +0 -0
  346. /package/{esm → dist}/client/storage.js +0 -0
  347. /package/{esm → dist}/identity/captcha.d.ts +0 -0
  348. /package/{esm → dist}/identity/captcha.js +0 -0
  349. /package/{esm → dist}/identity/delivery.d.ts +0 -0
  350. /package/{esm → dist}/identity/delivery.js +0 -0
  351. /package/{esm → dist}/identity/errors.d.ts +0 -0
  352. /package/{esm → dist}/identity/errors.js +0 -0
  353. /package/{esm → dist}/identity/events.js +0 -0
  354. /package/{esm → dist}/identity/external/_token-exchange.d.ts +0 -0
  355. /package/{esm → dist}/identity/external/_token-exchange.js +0 -0
  356. /package/{esm → dist}/identity/external/errors.d.ts +0 -0
  357. /package/{esm → dist}/identity/external/errors.js +0 -0
  358. /package/{esm → dist}/identity/external/provider.d.ts +0 -0
  359. /package/{esm → dist}/identity/external/provider.js +0 -0
  360. /package/{esm → dist}/identity/identifier.d.ts +0 -0
  361. /package/{esm → dist}/identity/identifier.js +0 -0
  362. /package/{esm → dist}/identity/lockout.d.ts +0 -0
  363. /package/{esm → dist}/identity/mfa/recovery-codes.d.ts +0 -0
  364. /package/{esm → dist}/identity/mfa/recovery-codes.js +0 -0
  365. /package/{esm → dist}/identity/password-policy.d.ts +0 -0
  366. /package/{esm → dist}/identity/password-policy.js +0 -0
  367. /package/{esm → dist}/identity/password.d.ts +0 -0
  368. /package/{esm → dist}/identity/rate-limit.js +0 -0
  369. /package/{esm → dist}/identity/session.d.ts +0 -0
  370. /package/{esm → dist}/identity/token-flow.d.ts +0 -0
  371. /package/{esm → dist}/models/authentication.d.ts +0 -0
  372. /package/{esm → dist}/models/authentication.js +0 -0
  373. /package/{esm → dist}/models/authorization-code.js +0 -0
  374. /package/{esm → dist}/models/client.d.ts +0 -0
  375. /package/{esm → dist}/models/client.js +0 -0
  376. /package/{esm → dist}/models/device-authorization.js +0 -0
  377. /package/{esm → dist}/models/responses.d.ts +0 -0
  378. /package/{esm → dist}/models/responses.js +0 -0
  379. /package/{esm → dist}/models/scope.d.ts +0 -0
  380. /package/{esm → dist}/models/scope.js +0 -0
  381. /package/{esm → dist}/models/token.js +0 -0
  382. /package/{esm → dist}/react/components/types.js +0 -0
  383. /package/{esm → dist}/react/context.js +0 -0
  384. /package/{esm → dist}/react/provider.js +0 -0
  385. /package/{esm → dist}/react/require-auth.d.ts +0 -0
  386. /package/{esm → dist}/react/use-authorization.js +0 -0
  387. /package/{esm → dist}/server/_clock-skew.d.ts +0 -0
  388. /package/{esm → dist}/server/client-authentication.js +0 -0
  389. /package/{esm → dist}/server/grants/client-credentials.js +0 -0
  390. /package/{esm → dist}/server/grants/password.js +0 -0
  391. /package/{esm → dist}/server/redirect-uri.d.ts +0 -0
  392. /package/{esm → dist}/server/services/authorization-code.js +0 -0
  393. /package/{esm → dist}/server/services/client.js +0 -0
  394. /package/{esm → dist}/server/services/device-authorization.js +0 -0
  395. /package/{esm → dist}/server/services/user.js +0 -0
  396. /package/{esm → dist}/server/utils/hash.d.ts +0 -0
  397. /package/{esm → dist}/testing/contract/_race.d.ts +0 -0
  398. /package/{esm → dist}/testing/contract/_race.js +0 -0
  399. /package/{esm → dist}/testing/contract/tenant.d.ts +0 -0
  400. /package/{esm → dist}/utils/_body.d.ts +0 -0
  401. /package/{esm → dist}/utils/_body.js +0 -0
  402. /package/{esm → dist}/utils/_buffer.d.ts +0 -0
  403. /package/{esm → dist}/utils/_buffer.js +0 -0
  404. /package/{esm → dist}/utils/_default-fetch.d.ts +0 -0
  405. /package/{esm → dist}/utils/_timing-safe.d.ts +0 -0
  406. /package/{esm → dist}/utils/_timing-safe.js +0 -0
  407. /package/{esm → dist}/utils/authentication-context.js +0 -0
  408. /package/{esm → dist}/utils/basic-auth.d.ts +0 -0
  409. /package/{esm → dist}/utils/basic-auth.js +0 -0
  410. /package/{esm → dist}/utils/pkce.d.ts +0 -0
  411. /package/{esm → dist}/utils/text.d.ts +0 -0
package/README.md CHANGED
@@ -16,7 +16,7 @@ run locally without a hosted account.
16
16
  | Udibo to handle sign-in | [Use Udibo's identity service](docs/guides/use-udibo.md) — requires a Udibo account |
17
17
  | Its own login and authorization server | [Run the quickstart](docs/quickstart.md), then [host authorization for your app](docs/guides/become-an-oauth-provider.md) |
18
18
  | An API that accepts access tokens | [Protect an API](docs/guides/protect-an-api.md) |
19
- | A React application with server-held tokens | [Juniper starter](templates/juniper/README.md) or [React Router starter](templates/react-router/README.md) |
19
+ | A React application with server-held tokens | [React Router starter](templates/react-router/README.md) |
20
20
 
21
21
  [Documentation index](docs/index.md) ·
22
22
  [API reference](https://jsr.io/@udibo/oauth2/doc) · [Examples](#examples) ·
@@ -24,12 +24,29 @@ run locally without a hosted account.
24
24
 
25
25
  ## Install
26
26
 
27
- Requires Deno 2 for the development workflow:
27
+ The package supports Node.js 22 and later and ships ESM with type declarations.
28
+ Install it from npm:
28
29
 
29
30
  ```sh
31
+ npm install @udibo/oauth2
32
+ # or
33
+ pnpm add @udibo/oauth2
34
+ ```
35
+
36
+ It is also published to [JSR](https://jsr.io/@udibo/oauth2) as TypeScript
37
+ source:
38
+
39
+ ```sh
40
+ npx jsr add @udibo/oauth2
41
+ # or, with Deno
30
42
  deno add jsr:@udibo/oauth2
31
43
  ```
32
44
 
45
+ `hono`, `react`, and `react-dom` are optional peer dependencies. Install the
46
+ ones for the entrypoints you import: `hono` for the `/hono/*` adapters, `react`
47
+ and `react-dom` for `/react` and `/react/components`. `vitest` is an optional
48
+ peer dependency of the testing helpers.
49
+
33
50
  Import the part you use; there is no root barrel or default export:
34
51
 
35
52
  ```ts
@@ -83,11 +100,12 @@ package does not include a challenge provider; see the
83
100
 
84
101
  ## Examples
85
102
 
86
- From a checkout of this repository:
103
+ From a checkout of this repository, with Node.js 24.2 or later and pnpm:
87
104
 
88
105
  ```sh
89
- deno ci
90
- deno task serve:app-with-own-auth
106
+ pnpm install
107
+ pnpm build
108
+ pnpm --filter example-app-with-own-auth start
91
109
  ```
92
110
 
93
111
  Open <http://localhost:8001/> and sign in as `user` / `password`. The
@@ -95,13 +113,11 @@ Open <http://localhost:8001/> and sign in as `user` / `password`. The
95
113
  All demo credentials, in-memory stores, and local HTTP settings are for
96
114
  development.
97
115
 
98
- | Example | Demonstrates |
99
- | ------------------------------------------------------------------------------- | --------------------------------------------------------------- |
100
- | [Hono with own auth](examples/hono/app-with-own-auth/README.md) | App login, OAuth2 server, BFF, and protected API in one process |
101
- | [Hono with external auth](examples/hono/app-with-external-auth/README.md) | Delegated sign-in, token introspection, and a BFF proxy |
102
- | [Standalone API](examples/hono/api-service/README.md) | Bearer-token validation without a frontend |
103
- | [Juniper with own auth](examples/juniper/app-with-own-auth/README.md) | Server-rendered React with application-owned login |
104
- | [Juniper with external auth](examples/juniper/app-with-external-auth/README.md) | Server-rendered React with delegated sign-in |
116
+ | Example | Demonstrates |
117
+ | ------------------------------------------------------------------------- | --------------------------------------------------------------- |
118
+ | [Hono with own auth](examples/hono/app-with-own-auth/README.md) | App login, OAuth2 server, BFF, and protected API in one process |
119
+ | [Hono with external auth](examples/hono/app-with-external-auth/README.md) | Delegated sign-in, token introspection, and a BFF proxy |
120
+ | [Standalone API](examples/hono/api-service/README.md) | Bearer-token validation without a frontend |
105
121
 
106
122
  ## Package entrypoints
107
123
 
@@ -128,7 +144,6 @@ and examples in the [reference](https://jsr.io/@udibo/oauth2/doc).
128
144
  | `/react/components` | Optional forms for login, signup, password reset, and MFA |
129
145
  | `/crypto` | Random tokens, hashing, encoding, authenticated encryption |
130
146
  | `/url` | Safe return paths and login continuation |
131
- | `/cli` | Local test identity provider and OIDC signing-key generation |
132
147
  | `/testing` | In-memory fixtures and authorization-server test helpers |
133
148
  | `/testing/contract` | Tests for app-owned service and storage implementations |
134
149
  | `/hono/bff/testing` | BFF session fixtures and session-store contract tests |
@@ -136,17 +151,23 @@ and examples in the [reference](https://jsr.io/@udibo/oauth2/doc).
136
151
 
137
152
  ## Runtime support
138
153
 
139
- The library uses Web APIs. The complete suite runs on Deno. CI also builds an
140
- npm-format compatibility artifact and verifies 20 entrypoints with TypeScript
141
- and Node; this does not publish an npm package.
154
+ The library uses Web APIs and runs on Node.js 22 and later. CI runs the
155
+ complete suite on Node 22, 24, and 26 on Linux, and on Node 26 on Windows and
156
+ macOS. It also packs the npm tarball, installs it into an empty project, type
157
+ checks a consumer of every entrypoint, and imports each one on Node.
158
+
159
+ | Surface | Node 22+ | Browser | Deno, Bun |
160
+ | ---------------------------------------------------------------------- | --------------------- | ------------------------------------------- | ------------- |
161
+ | `/client`, `/react`, `/react/components` | Tested, including SSR | Intended for client code; no secrets | Not verified |
162
+ | `/server/*`, `/identity/*`, `/hono/*`, `/crypto`, `/url` | Tested | Server functionality belongs on the backend | Not verified |
163
+ | `/testing`, `/testing/contract`, `/hono/bff/testing`, `/react/testing` | Tested; need Vitest | Not supported | Not verified |
164
+ | `udibo-oauth2` command (`bin`) | Tested | Not supported | Not supported |
142
165
 
143
- | Surface | Deno | Node | Browser | Bun |
144
- | ------------------------------------------- | --------------------- | ------------------------ | ------------------------------------------- | ------------- |
145
- | Clients and React | Tested, including SSR | Import/type smoke-tested | Intended for client code; no secrets | Not verified |
146
- | Server, identity, Hono, crypto, URL helpers | Tested | Import/type smoke-tested | Server functionality belongs on the backend | Not verified |
147
- | `/hono/bff/testing`, `/react/testing` | Tested | Import/type smoke-tested | React test helpers only | Not verified |
148
- | `/testing`, `/testing/contract` | Tested | Not verified | Not supported | Not verified |
149
- | `/cli` | Deno only | Not supported | Not supported | Not supported |
166
+ The `udibo-oauth2` command is a development tool: `udibo-oauth2 oidc keygen`
167
+ prints an OIDC signing key, and `udibo-oauth2 idp dev` runs a local identity
168
+ provider. Run it with `npx udibo-oauth2` once the package is installed; the
169
+ [local identity provider guide](docs/guides/run-a-local-identity-provider.md)
170
+ covers its options. Nothing on the library path imports it.
150
171
 
151
172
  See [stability](docs/stability.md#runtime-support) for the support boundary.
152
173
 
@@ -173,7 +194,7 @@ implementing a custom store or callback.
173
194
 
174
195
  ## Contributing and security
175
196
 
176
- Run `deno task check` and `deno task test:all` before proposing changes. See
197
+ Run `pnpm check` and `pnpm test` before proposing changes. See
177
198
  [CONTRIBUTING.md](CONTRIBUTING.md) for development conventions,
178
199
  [SECURITY.md](SECURITY.md) for private vulnerability reports, and
179
200
  [CHANGELOG.md](CHANGELOG.md) for release history.
@@ -8,11 +8,11 @@
8
8
  * @module
9
9
  */
10
10
  import type { Context, MiddlewareHandler } from "hono";
11
- import type { ClientInterface } from "../../models/client.js";
12
- import type { RequireConditions } from "../../models/authorization.js";
13
- import type { AbstractScope, BasicScope } from "../../models/scope.js";
14
- import type { AuthenticatedContext } from "../../server/resource-server.js";
15
- import { ResourceServer } from "../../server/resource-server.js";
11
+ import type { ClientInterface } from "../../models/client.ts";
12
+ import type { RequireConditions } from "../../models/authorization.ts";
13
+ import type { AbstractScope, BasicScope } from "../../models/scope.ts";
14
+ import type { AuthenticatedContext } from "../../server/resource-server.ts";
15
+ import { ResourceServer } from "../../server/resource-server.ts";
16
16
  /**
17
17
  * Key under which the authenticated OAuth2 context is stored on the Hono
18
18
  * context. Namespaced to avoid collisions with other middleware.
@@ -79,7 +79,7 @@ export function authenticateHonoRequest(server, c, requiredScope) {
79
79
  }
80
80
  // Base method on purpose: the Hono subclasses' override would recurse.
81
81
  function baseAuthenticate(server, request, requiredScope) {
82
- // deno-lint-ignore no-explicit-any
82
+ // oxlint-disable-next-line typescript/no-explicit-any
83
83
  const base = ResourceServer.prototype;
84
84
  return base.authenticate.call(server, request, requiredScope);
85
85
  }
@@ -32,15 +32,14 @@
32
32
  *
33
33
  * @module
34
34
  */
35
- import "../../_dnt.polyfills.js";
36
35
  import { Hono } from "hono";
37
36
  import type { Context, Handler, MiddlewareHandler } from "hono";
38
- import type { RequireConditions } from "../../models/authorization.js";
39
- import type { AuthenticationContext } from "../../models/authentication.js";
40
- import type { ClientInterface } from "../../models/client.js";
41
- import type { AbstractScope, BasicScope } from "../../models/scope.js";
42
- import { AuthorizationServer, type AuthorizationServerOptions } from "../../server/authorization-server.js";
43
- import type { AuthenticatedContext } from "../../server/resource-server.js";
37
+ import type { RequireConditions } from "../../models/authorization.ts";
38
+ import type { AuthenticationContext } from "../../models/authentication.ts";
39
+ import type { ClientInterface } from "../../models/client.ts";
40
+ import type { AbstractScope, BasicScope } from "../../models/scope.ts";
41
+ import { AuthorizationServer, type AuthorizationServerOptions } from "../../server/authorization-server.ts";
42
+ import type { AuthenticatedContext } from "../../server/resource-server.ts";
44
43
  /**
45
44
  * Authenticates the resource owner during an authorization request.
46
45
  *
@@ -32,7 +32,6 @@
32
32
  *
33
33
  * @module
34
34
  */
35
- import "../../_dnt.polyfills.js";
36
35
  import { Hono } from "hono";
37
36
  import { AuthorizationServer, ENDPOINT_METHODS, ENDPOINT_PATHS, } from "../../server/authorization-server.js";
38
37
  import { authenticateHonoRequest, createProtectMiddleware, createRequireMiddleware, createRequireScopeMiddleware, readContext, } from "./_common.js";
@@ -27,7 +27,7 @@
27
27
  * @module
28
28
  */
29
29
  import type { Context } from "hono";
30
- import type { AuthRequestStorage } from "../../../client/mod.js";
30
+ import type { AuthRequestStorage } from "../../../client/mod.ts";
31
31
  /**
32
32
  * Cookie attributes for the pending-authorization cookie.
33
33
  *
@@ -161,7 +161,7 @@ export declare class EncryptedCookieAuthRequestStorage implements AuthRequestSto
161
161
  * import { encryptedCookieAuthRequestStorage } from "@udibo/oauth2/hono/bff";
162
162
  *
163
163
  * const authRequestStorage = encryptedCookieAuthRequestStorage({
164
- * secret: Deno.env.get("SESSION_SECRET")!,
164
+ * secret: process.env.SESSION_SECRET!,
165
165
  * });
166
166
  * ```
167
167
  */
@@ -96,7 +96,7 @@ export class EncryptedCookieAuthRequestStorage {
96
96
  this.#maxPending = options.maxPending ?? DEFAULT_MAX_PENDING;
97
97
  }
98
98
  #key() {
99
- return this.#keyPromise ??= deriveAesKey(this.#secret);
99
+ return (this.#keyPromise ??= deriveAesKey(this.#secret));
100
100
  }
101
101
  async #read(c) {
102
102
  const cookieValue = getCookie(c, this.#name);
@@ -149,7 +149,7 @@ export class EncryptedCookieAuthRequestStorage {
149
149
  * import { encryptedCookieAuthRequestStorage } from "@udibo/oauth2/hono/bff";
150
150
  *
151
151
  * const authRequestStorage = encryptedCookieAuthRequestStorage({
152
- * secret: Deno.env.get("SESSION_SECRET")!,
152
+ * secret: process.env.SESSION_SECRET!,
153
153
  * });
154
154
  * ```
155
155
  */
@@ -49,14 +49,14 @@
49
49
  */
50
50
  import { Hono } from "hono";
51
51
  import type { Context, Handler, MiddlewareHandler } from "hono";
52
- import type { DirectClient, SessionState, TokenBundle, UserInfoClaims } from "../../../client/mod.js";
53
- import type { ClientInterface } from "../../../models/client.js";
54
- import type { AbstractScope, BasicScope } from "../../../models/scope.js";
55
- import type { HonoAuthorizationServer } from "../authorization-server.js";
56
- import type { HonoResourceServer } from "../resource-server.js";
57
- import type { AuthRequestStorageFactory } from "./auth-request-store.js";
58
- import { type SessionStore } from "./session-store.js";
59
- import { type HonoBffProxyOptions } from "./proxy.js";
52
+ import type { DirectClient, SessionState, TokenBundle, UserInfoClaims } from "../../../client/mod.ts";
53
+ import type { ClientInterface } from "../../../models/client.ts";
54
+ import type { AbstractScope, BasicScope } from "../../../models/scope.ts";
55
+ import type { HonoAuthorizationServer } from "../authorization-server.ts";
56
+ import type { HonoResourceServer } from "../resource-server.ts";
57
+ import type { AuthRequestStorageFactory } from "./auth-request-store.ts";
58
+ import { type SessionStore } from "./session-store.ts";
59
+ import { type HonoBffProxyOptions } from "./proxy.ts";
60
60
  /**
61
61
  * A resource server the BFF can compose with `attachToken()` to expose a
62
62
  * single `bff.protect()` middleware.
@@ -374,10 +374,20 @@ export interface HonoBffOptions {
374
374
  * Who owns the BFF's session record. Defaults to `"own"`.
375
375
  *
376
376
  * - `"own"` (default): the BFF creates and owns its session at
377
- * `/auth/callback` — it always mints a fresh id (`sessionStore.create`)
378
- * and ignores any inbound cookie. Use when the app has no session here
379
- * until the OAuth flow completes: standalone BFFs, or apps whose login
380
- * lives on a separate / external IDP.
377
+ * `/auth/callback` — it always mints a fresh id (`sessionStore.create`).
378
+ * A session the inbound cookie names is replaced: once the code exchange
379
+ * and `resolveUser` succeed, the BFF destroys it (`sessionStore.destroy`)
380
+ * before creating the new one, so signing in again in the same browser —
381
+ * switching organization, a step-up — never leaves the earlier session
382
+ * readable beside the new one. Its refresh token is not revoked: an
383
+ * authorization server may extend a revocation to other tokens of the
384
+ * same grant or sign-in (RFC 7009 §2.1), the new ones included.
385
+ * A callback the authorization server refuses, or whose state check,
386
+ * code exchange or `resolveUser` fails, leaves the existing session as
387
+ * it was; a store failure while creating the replacement leaves the
388
+ * browser signed out. Use when the app has no session here until the
389
+ * OAuth flow completes: standalone BFFs, or apps whose login lives on a
390
+ * separate / external IDP.
381
391
  * - `"shared"`: the app already created the session at its own login step,
382
392
  * and the BFF **attaches** tokens to that existing session at
383
393
  * `/auth/callback` (via `sessionStore.update`) instead of creating its
@@ -84,8 +84,7 @@ function resolvePaths(paths = {}, options) {
84
84
  };
85
85
  if (basePath === "")
86
86
  return resolved;
87
- const stray = BFF_PATH_KEYS
88
- .filter((key) => key !== "backchannel" || options.backchannelMounted)
87
+ const stray = BFF_PATH_KEYS.filter((key) => key !== "backchannel" || options.backchannelMounted)
89
88
  .filter((key) => !resolved[key].startsWith(`${basePath}/`))
90
89
  .map((key) => `${key} ("${resolved[key]}")`);
91
90
  if (stray.length > 0) {
@@ -325,8 +324,8 @@ export class HonoBff {
325
324
  });
326
325
  this.#cookieName = sessionCookieName(options.cookie);
327
326
  this.#loginStateCookieName = loginStateCookieName(options.cookie);
328
- this.#loginStateTtlMs = options.loginStateTtlMs ??
329
- DEFAULT_LOGIN_STATE_TTL_MS;
327
+ this.#loginStateTtlMs =
328
+ options.loginStateTtlMs ?? DEFAULT_LOGIN_STATE_TTL_MS;
330
329
  this.#sessionMode = options.sessionMode ?? "own";
331
330
  this.#csrf = resolveCsrf(options.csrf);
332
331
  this.#extraAuthorizeParams = resolveExtraAuthorizeParams(options);
@@ -334,16 +333,17 @@ export class HonoBff {
334
333
  this.#sessionMaxAgeMs = sessionMaxAgeMs;
335
334
  if (this.#sessionMode === "shared") {
336
335
  const maxAge = options.cookie?.maxAge;
337
- this.#cookieMaxAgeSeconds = maxAge === undefined || maxAge === "session"
338
- ? undefined
339
- : positiveSeconds(maxAge, "cookie.maxAge");
336
+ this.#cookieMaxAgeSeconds =
337
+ maxAge === undefined || maxAge === "session"
338
+ ? undefined
339
+ : positiveSeconds(maxAge, "cookie.maxAge");
340
340
  }
341
341
  else {
342
- const configuredMaxAge = options.cookie?.maxAge ??
343
- Math.ceil(sessionMaxAgeMs / 1000);
344
- this.#cookieMaxAgeSeconds = configuredMaxAge === "session"
345
- ? undefined
346
- : positiveSeconds(configuredMaxAge, "cookie.maxAge");
342
+ const configuredMaxAge = options.cookie?.maxAge ?? Math.ceil(sessionMaxAgeMs / 1000);
343
+ this.#cookieMaxAgeSeconds =
344
+ configuredMaxAge === "session"
345
+ ? undefined
346
+ : positiveSeconds(configuredMaxAge, "cookie.maxAge");
347
347
  if (this.#cookieMaxAgeSeconds !== undefined) {
348
348
  const storeMaxAgeMs = sessionStoreMaxAgeMs(this.#store);
349
349
  const sessionSeconds = Math.ceil(Math.max(sessionMaxAgeMs, storeMaxAgeMs ?? 0) / 1000);
@@ -611,7 +611,10 @@ export class HonoBff {
611
611
  const params = new URL(c.req.url).searchParams;
612
612
  const fail = (error) => this.#options.onCallbackError
613
613
  ? this.#options.onCallbackError(c, error)
614
- : c.json({ error: error.error, error_description: error.error_description }, 400);
614
+ : c.json({
615
+ error: error.error,
616
+ error_description: error.error_description,
617
+ }, 400);
615
618
  if (params.get("error")) {
616
619
  return await fail({
617
620
  error: params.get("error"),
@@ -637,8 +640,7 @@ export class HonoBff {
637
640
  this.#writeLoginStateHashes(c, pendingStates.filter((_, index) => index !== matched));
638
641
  try {
639
642
  const origin = this.#options.resolveOrigin?.(c);
640
- const { tokens, refreshToken, returnTo, raw } = await this.#client
641
- .exchangeAuthorizationCode(code, state, {
643
+ const { tokens, refreshToken, returnTo, raw } = await this.#client.exchangeAuthorizationCode(code, state, {
642
644
  origin,
643
645
  redirectUri: this.#derivedRedirectUri(c, origin),
644
646
  authRequestStorage: this.#options.authRequestStorage?.forRequest(c),
@@ -670,9 +672,10 @@ export class HonoBff {
670
672
  createdAt: now,
671
673
  updatedAt: now,
672
674
  };
673
- const existing = this.#sessionMode === "shared"
674
- ? getCookie(c, this.#cookieName)
675
- : undefined;
675
+ const inbound = getCookie(c, this.#cookieName);
676
+ const existing = this.#sessionMode === "shared" ? inbound : undefined;
677
+ if (inbound && !existing)
678
+ await this.#store.destroy(inbound);
676
679
  const cookieValue = existing
677
680
  ? await this.#store.update(existing, data)
678
681
  : await this.#store.create(data);
@@ -723,8 +726,7 @@ export class HonoBff {
723
726
  if (this.#options.rpInitiatedLogout) {
724
727
  const endSession = this.#client.endSessionEndpoint;
725
728
  if (endSession) {
726
- const origin = this.#options.resolveOrigin?.(c) ??
727
- new URL(c.req.url).origin;
729
+ const origin = this.#options.resolveOrigin?.(c) ?? new URL(c.req.url).origin;
728
730
  const url = new URL(endSession, origin);
729
731
  if (idToken)
730
732
  url.searchParams.set("id_token_hint", idToken);
@@ -879,7 +881,8 @@ export class HonoBff {
879
881
  catch {
880
882
  subject = null;
881
883
  }
882
- if (!subject || (subject.sub === undefined && subject.sid === undefined)) {
884
+ if (!subject ||
885
+ (subject.sub === undefined && subject.sid === undefined)) {
883
886
  return c.json({
884
887
  error: "invalid_request",
885
888
  error_description: "invalid logout_token",
@@ -1088,7 +1091,9 @@ export class HonoBff {
1088
1091
  try {
1089
1092
  const inboundAuth = c.req.header("Authorization") ?? "";
1090
1093
  const hasBearer = /^bearer\s+\S/i.test(inboundAuth);
1091
- if (!hasBearer && this.#csrf && this.#hasSessionCookie(c) &&
1094
+ if (!hasBearer &&
1095
+ this.#csrf &&
1096
+ this.#hasSessionCookie(c) &&
1092
1097
  !this.#csrfHeaderOk(c)) {
1093
1098
  return this.#csrfReject(c);
1094
1099
  }
@@ -1202,7 +1207,7 @@ export class HonoBff {
1202
1207
  const retryOn401 = options.retryOn401 ?? true;
1203
1208
  const mountPrefix = (options.stripPrefix ?? "").endsWith("/")
1204
1209
  ? options.stripPrefix.slice(0, -1)
1205
- : options.stripPrefix ?? "";
1210
+ : (options.stripPrefix ?? "");
1206
1211
  return async (c) => {
1207
1212
  if (this.#csrf && this.#hasSessionCookie(c) && !this.#csrfHeaderOk(c)) {
1208
1213
  return this.#csrfReject(c);
@@ -1243,8 +1248,7 @@ export class HonoBff {
1243
1248
  cause,
1244
1249
  }));
1245
1250
  }
1246
- const canRetry = retryOn401 && body === null &&
1247
- entry.data.refreshToken !== undefined;
1251
+ const canRetry = retryOn401 && body === null && entry.data.refreshToken !== undefined;
1248
1252
  if (canRetry && isInvalidTokenChallenge(response)) {
1249
1253
  await response.body?.cancel();
1250
1254
  const outcome = await this.#refreshSessionEntry(c, entry);
@@ -1272,10 +1276,12 @@ export class HonoBff {
1272
1276
  mountPrefix,
1273
1277
  }),
1274
1278
  };
1275
- return downstream === null ? c.body(null, init) : c.body(downstream, {
1276
- ...init,
1277
- status: response.status,
1278
- });
1279
+ return downstream === null
1280
+ ? c.body(null, init)
1281
+ : c.body(downstream, {
1282
+ ...init,
1283
+ status: response.status,
1284
+ });
1279
1285
  };
1280
1286
  }
1281
1287
  }
@@ -79,7 +79,6 @@ export function resolveCookieName(resolution) {
79
79
  assertCookiePrefixSatisfiable(name, attributes, consequence);
80
80
  return name;
81
81
  }
82
- const hostPrefixOk = attributes.secure && attributes.path === "/" &&
83
- !attributes.domain;
82
+ const hostPrefixOk = attributes.secure && attributes.path === "/" && !attributes.domain;
84
83
  return hostPrefixOk ? `__Host-${base}` : base;
85
84
  }
@@ -6,14 +6,13 @@
6
6
  * {@link SessionStore} contract and two ready-to-use implementations
7
7
  * ({@link MemorySessionStore}, {@link EncryptedCookieSessionStore}).
8
8
  *
9
- * Need a server-side store (Postgres, Redis, Deno KV, …)? Implement the
9
+ * Need a server-side store (Postgres, Redis, …)? Implement the
10
10
  * {@link SessionStore} interface and verify it with
11
11
  * `runSessionStoreContractTests` from `@udibo/oauth2/hono/bff/testing`.
12
12
  *
13
13
  * @module
14
14
  */
15
- import "../../../_dnt.polyfills.js";
16
- export { type BackchannelLogoutSubject, type BffCallbackError, HonoBff, type HonoBffBackchannelOptions, type HonoBffCookieOptions, type HonoBffCsrfOptions, type HonoBffOptions, type HonoBffPaths, type HonoBffResourceServer, } from "./bff.js";
17
- export { type AuthRequestCookieOptions, type AuthRequestStorageFactory, EncryptedCookieAuthRequestStorage, encryptedCookieAuthRequestStorage, type EncryptedCookieAuthRequestStorageOptions, } from "./auth-request-store.js";
18
- export { DEFAULT_PROXY_FORWARD_HEADERS, type HonoBffProxyOptions, } from "./proxy.js";
19
- export { type BackchannelLogoutStore, type BoundedSessionStore, DEFAULT_SESSION_MAX_AGE_MS, EncryptedCookieSessionStore, type EncryptedCookieSessionStoreOptions, MemorySessionStore, type SessionData, type SessionStore, sessionStoreMaxAgeMs, supportsBackchannelLogout, } from "./session-store.js";
15
+ export { type BackchannelLogoutSubject, type BffCallbackError, HonoBff, type HonoBffBackchannelOptions, type HonoBffCookieOptions, type HonoBffCsrfOptions, type HonoBffOptions, type HonoBffPaths, type HonoBffResourceServer, } from "./bff.ts";
16
+ export { type AuthRequestCookieOptions, type AuthRequestStorageFactory, EncryptedCookieAuthRequestStorage, encryptedCookieAuthRequestStorage, type EncryptedCookieAuthRequestStorageOptions, } from "./auth-request-store.ts";
17
+ export { DEFAULT_PROXY_FORWARD_HEADERS, type HonoBffProxyOptions, } from "./proxy.ts";
18
+ export { type BackchannelLogoutStore, type BoundedSessionStore, DEFAULT_SESSION_MAX_AGE_MS, EncryptedCookieSessionStore, type EncryptedCookieSessionStoreOptions, MemorySessionStore, type SessionData, type SessionStore, sessionStoreMaxAgeMs, supportsBackchannelLogout, } from "./session-store.ts";
@@ -6,13 +6,12 @@
6
6
  * {@link SessionStore} contract and two ready-to-use implementations
7
7
  * ({@link MemorySessionStore}, {@link EncryptedCookieSessionStore}).
8
8
  *
9
- * Need a server-side store (Postgres, Redis, Deno KV, …)? Implement the
9
+ * Need a server-side store (Postgres, Redis, …)? Implement the
10
10
  * {@link SessionStore} interface and verify it with
11
11
  * `runSessionStoreContractTests` from `@udibo/oauth2/hono/bff/testing`.
12
12
  *
13
13
  * @module
14
14
  */
15
- import "../../../_dnt.polyfills.js";
16
15
  export { HonoBff, } from "./bff.js";
17
16
  export { EncryptedCookieAuthRequestStorage, encryptedCookieAuthRequestStorage, } from "./auth-request-store.js";
18
17
  export { DEFAULT_PROXY_FORWARD_HEADERS, } from "./proxy.js";
@@ -151,7 +151,8 @@ function forcePrivateCache(headers) {
151
151
  const directives = existing
152
152
  .split(",")
153
153
  .map((directive) => directive.trim().toLowerCase());
154
- if (directives.some((directive) => directive === "private" || directive === "no-store" ||
154
+ if (directives.some((directive) => directive === "private" ||
155
+ directive === "no-store" ||
155
156
  directive.startsWith("private="))) {
156
157
  return;
157
158
  }
@@ -23,7 +23,7 @@
23
23
  *
24
24
  * @module
25
25
  */
26
- import type { TokenBundle, UserInfoClaims } from "../../../client/mod.js";
26
+ import type { TokenBundle, UserInfoClaims } from "../../../client/mod.ts";
27
27
  /** The data a BFF persists per session. */
28
28
  export interface SessionData {
29
29
  /** The current token bundle (access token + expiry + scope + id_token). */
@@ -211,7 +211,7 @@ export interface EncryptedCookieSessionStoreOptions {
211
211
  * // Deploy with the new secret first, the old one second: new cookies seal
212
212
  * // under NEW, cookies still sealed under OLD keep unsealing until you drop it.
213
213
  * const store = new EncryptedCookieSessionStore({
214
- * secret: [Deno.env.get("SESSION_SECRET")!, Deno.env.get("SESSION_SECRET_OLD")!],
214
+ * secret: [process.env.SESSION_SECRET!, process.env.SESSION_SECRET_OLD!],
215
215
  * maxAgeMs: 7 * 24 * 60 * 60 * 1000,
216
216
  * });
217
217
  * ```
@@ -27,8 +27,8 @@ import { InvalidGrantError } from "../../../errors.js";
27
27
  import { deriveAesKey, sealJson, unsealJson } from "../../../utils/crypto.js";
28
28
  /** Whether a store implements the {@link BackchannelLogoutStore} capability. */
29
29
  export function supportsBackchannelLogout(store) {
30
- return typeof store.destroyByLogout ===
31
- "function";
30
+ return (typeof store.destroyByLogout ===
31
+ "function");
32
32
  }
33
33
  /**
34
34
  * Default session lifetime — 14 days — shared by
@@ -102,10 +102,11 @@ export class MemorySessionStore {
102
102
  }
103
103
  }
104
104
  function isSealedSession(value) {
105
- return typeof value === "object" && value !== null &&
105
+ return (typeof value === "object" &&
106
+ value !== null &&
106
107
  typeof value.issuedAt === "number" &&
107
108
  typeof value.data === "object" &&
108
- value.data !== null;
109
+ value.data !== null);
109
110
  }
110
111
  /**
111
112
  * Stateless session store. The cookie value is the AES-GCM-encrypted
@@ -131,7 +132,7 @@ function isSealedSession(value) {
131
132
  * // Deploy with the new secret first, the old one second: new cookies seal
132
133
  * // under NEW, cookies still sealed under OLD keep unsealing until you drop it.
133
134
  * const store = new EncryptedCookieSessionStore({
134
- * secret: [Deno.env.get("SESSION_SECRET")!, Deno.env.get("SESSION_SECRET_OLD")!],
135
+ * secret: [process.env.SESSION_SECRET!, process.env.SESSION_SECRET_OLD!],
135
136
  * maxAgeMs: 7 * 24 * 60 * 60 * 1000,
136
137
  * });
137
138
  * ```
@@ -175,7 +176,7 @@ export class EncryptedCookieSessionStore {
175
176
  return this.#maxAgeMs;
176
177
  }
177
178
  #key(index) {
178
- return this.#keyPromises[index] ??= deriveAesKey(this.#secrets[index]);
179
+ return (this.#keyPromises[index] ??= deriveAesKey(this.#secrets[index]));
179
180
  }
180
181
  /** Encrypts the session into the cookie value under the current secret; there is no server-side record. */
181
182
  async create(data) {
@@ -14,13 +14,12 @@
14
14
  *
15
15
  * @module
16
16
  */
17
- import "../../../_dnt.polyfills.js";
18
- import type { ClientInterface } from "../../../models/client.js";
19
- import type { AbstractScope } from "../../../models/scope.js";
20
- import type { TokenServiceInterface } from "../../../server/services/token.js";
21
- import type { TokenBundle, UserInfoClaims } from "../../../client/mod.js";
22
- import type { HonoBff } from "./bff.js";
23
- import { type SessionData, type SessionStore } from "./session-store.js";
17
+ import type { ClientInterface } from "../../../models/client.ts";
18
+ import type { AbstractScope } from "../../../models/scope.ts";
19
+ import type { TokenServiceInterface } from "../../../server/services/token.ts";
20
+ import type { TokenBundle, UserInfoClaims } from "../../../client/mod.ts";
21
+ import type { HonoBff } from "./bff.ts";
22
+ import { type SessionData, type SessionStore } from "./session-store.ts";
24
23
  /** Options for {@link createTestSession}. */
25
24
  export interface CreateTestSessionOptions {
26
25
  /**
@@ -168,7 +167,7 @@ export interface SessionStoreContractOptions {
168
167
  }
169
168
  /**
170
169
  * Contract test suite for {@link SessionStore} implementations. Registers
171
- * `describe`/`it` blocks from `@std/testing/bdd`, so call it at a test
170
+ * `describe`/`it` blocks from Vitest, so call it at a test
172
171
  * module's top level. It does not check that a stateful store's `update`
173
172
  * rejects a missing or destroyed session, which {@link SessionStore.update}
174
173
  * requires — test that yourself.