@udibo/oauth2 0.14.1 → 0.15.1

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 (413) 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 +8 -8
  9. package/{esm → dist}/adapters/hono/bff/bff.js +33 -27
  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/dist/utils/_inbound-request.d.ts +15 -0
  218. package/dist/utils/_inbound-request.js +25 -0
  219. package/{esm → dist}/utils/authentication-context.d.ts +1 -1
  220. package/{esm → dist}/utils/crypto.d.ts +2 -3
  221. package/{esm → dist}/utils/crypto.js +3 -4
  222. package/{esm → dist}/utils/pkce.js +1 -1
  223. package/{esm → dist}/utils/text.js +1 -1
  224. package/{esm → dist}/utils/url.d.ts +0 -1
  225. package/{esm → dist}/utils/url.js +0 -1
  226. package/package.json +156 -33
  227. package/esm/_dnt.polyfills.d.ts +0 -31
  228. package/esm/_dnt.polyfills.js +0 -26
  229. package/esm/deps/jsr.io/@std/assert/1.0.19/almost_equals.d.ts +0 -29
  230. package/esm/deps/jsr.io/@std/assert/1.0.19/almost_equals.js +0 -47
  231. package/esm/deps/jsr.io/@std/assert/1.0.19/array_includes.d.ts +0 -28
  232. package/esm/deps/jsr.io/@std/assert/1.0.19/array_includes.js +0 -65
  233. package/esm/deps/jsr.io/@std/assert/1.0.19/assert.d.ts +0 -16
  234. package/esm/deps/jsr.io/@std/assert/1.0.19/assert.js +0 -23
  235. package/esm/deps/jsr.io/@std/assert/1.0.19/assertion_error.d.ts +0 -25
  236. package/esm/deps/jsr.io/@std/assert/1.0.19/assertion_error.js +0 -30
  237. package/esm/deps/jsr.io/@std/assert/1.0.19/equal.d.ts +0 -24
  238. package/esm/deps/jsr.io/@std/assert/1.0.19/equal.js +0 -193
  239. package/esm/deps/jsr.io/@std/assert/1.0.19/equals.d.ts +0 -36
  240. package/esm/deps/jsr.io/@std/assert/1.0.19/equals.js +0 -61
  241. package/esm/deps/jsr.io/@std/assert/1.0.19/exists.d.ts +0 -17
  242. package/esm/deps/jsr.io/@std/assert/1.0.19/exists.js +0 -27
  243. package/esm/deps/jsr.io/@std/assert/1.0.19/fail.d.ts +0 -14
  244. package/esm/deps/jsr.io/@std/assert/1.0.19/fail.js +0 -20
  245. package/esm/deps/jsr.io/@std/assert/1.0.19/false.d.ts +0 -18
  246. package/esm/deps/jsr.io/@std/assert/1.0.19/false.js +0 -23
  247. package/esm/deps/jsr.io/@std/assert/1.0.19/greater.d.ts +0 -19
  248. package/esm/deps/jsr.io/@std/assert/1.0.19/greater.js +0 -29
  249. package/esm/deps/jsr.io/@std/assert/1.0.19/greater_or_equal.d.ts +0 -19
  250. package/esm/deps/jsr.io/@std/assert/1.0.19/greater_or_equal.js +0 -29
  251. package/esm/deps/jsr.io/@std/assert/1.0.19/instance_of.d.ts +0 -22
  252. package/esm/deps/jsr.io/@std/assert/1.0.19/instance_of.js +0 -52
  253. package/esm/deps/jsr.io/@std/assert/1.0.19/is_error.d.ts +0 -24
  254. package/esm/deps/jsr.io/@std/assert/1.0.19/is_error.js +0 -53
  255. package/esm/deps/jsr.io/@std/assert/1.0.19/less.d.ts +0 -18
  256. package/esm/deps/jsr.io/@std/assert/1.0.19/less.js +0 -28
  257. package/esm/deps/jsr.io/@std/assert/1.0.19/less_or_equal.d.ts +0 -19
  258. package/esm/deps/jsr.io/@std/assert/1.0.19/less_or_equal.js +0 -29
  259. package/esm/deps/jsr.io/@std/assert/1.0.19/match.d.ts +0 -17
  260. package/esm/deps/jsr.io/@std/assert/1.0.19/match.js +0 -26
  261. package/esm/deps/jsr.io/@std/assert/1.0.19/mod.d.ts +0 -43
  262. package/esm/deps/jsr.io/@std/assert/1.0.19/mod.js +0 -45
  263. package/esm/deps/jsr.io/@std/assert/1.0.19/not_equals.d.ts +0 -26
  264. package/esm/deps/jsr.io/@std/assert/1.0.19/not_equals.js +0 -39
  265. package/esm/deps/jsr.io/@std/assert/1.0.19/not_instance_of.d.ts +0 -19
  266. package/esm/deps/jsr.io/@std/assert/1.0.19/not_instance_of.js +0 -29
  267. package/esm/deps/jsr.io/@std/assert/1.0.19/not_match.d.ts +0 -17
  268. package/esm/deps/jsr.io/@std/assert/1.0.19/not_match.js +0 -26
  269. package/esm/deps/jsr.io/@std/assert/1.0.19/not_strict_equals.d.ts +0 -22
  270. package/esm/deps/jsr.io/@std/assert/1.0.19/not_strict_equals.js +0 -32
  271. package/esm/deps/jsr.io/@std/assert/1.0.19/object_match.d.ts +0 -28
  272. package/esm/deps/jsr.io/@std/assert/1.0.19/object_match.js +0 -177
  273. package/esm/deps/jsr.io/@std/assert/1.0.19/rejects.d.ts +0 -41
  274. package/esm/deps/jsr.io/@std/assert/1.0.19/rejects.js +0 -53
  275. package/esm/deps/jsr.io/@std/assert/1.0.19/strict_equals.d.ts +0 -23
  276. package/esm/deps/jsr.io/@std/assert/1.0.19/strict_equals.js +0 -58
  277. package/esm/deps/jsr.io/@std/assert/1.0.19/string_includes.d.ts +0 -17
  278. package/esm/deps/jsr.io/@std/assert/1.0.19/string_includes.js +0 -26
  279. package/esm/deps/jsr.io/@std/assert/1.0.19/throws.d.ts +0 -44
  280. package/esm/deps/jsr.io/@std/assert/1.0.19/throws.js +0 -44
  281. package/esm/deps/jsr.io/@std/assert/1.0.19/unimplemented.d.ts +0 -14
  282. package/esm/deps/jsr.io/@std/assert/1.0.19/unimplemented.js +0 -20
  283. package/esm/deps/jsr.io/@std/assert/1.0.19/unreachable.d.ts +0 -14
  284. package/esm/deps/jsr.io/@std/assert/1.0.19/unreachable.js +0 -20
  285. package/esm/deps/jsr.io/@std/async/1.5.0/delay.d.ts +0 -44
  286. package/esm/deps/jsr.io/@std/async/1.5.0/delay.js +0 -84
  287. package/esm/deps/jsr.io/@std/crypto/1.1.0/timing_safe_equal.d.ts +0 -39
  288. package/esm/deps/jsr.io/@std/crypto/1.1.0/timing_safe_equal.js +0 -61
  289. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common16.d.ts +0 -22
  290. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common16.js +0 -51
  291. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common32.d.ts +0 -34
  292. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common32.js +0 -192
  293. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common64.d.ts +0 -34
  294. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common64.js +0 -113
  295. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common_detach.d.ts +0 -3
  296. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common_detach.js +0 -13
  297. package/esm/deps/jsr.io/@std/encoding/1.0.11/_types.d.ts +0 -8
  298. package/esm/deps/jsr.io/@std/encoding/1.0.11/_types.js +0 -2
  299. package/esm/deps/jsr.io/@std/encoding/1.0.11/_validate_binary_like.d.ts +0 -1
  300. package/esm/deps/jsr.io/@std/encoding/1.0.11/_validate_binary_like.js +0 -26
  301. package/esm/deps/jsr.io/@std/encoding/1.0.11/ascii85.d.ts +0 -60
  302. package/esm/deps/jsr.io/@std/encoding/1.0.11/ascii85.js +0 -152
  303. package/esm/deps/jsr.io/@std/encoding/1.0.11/base32.d.ts +0 -39
  304. package/esm/deps/jsr.io/@std/encoding/1.0.11/base32.js +0 -87
  305. package/esm/deps/jsr.io/@std/encoding/1.0.11/base58.d.ts +0 -39
  306. package/esm/deps/jsr.io/@std/encoding/1.0.11/base58.js +0 -131
  307. package/esm/deps/jsr.io/@std/encoding/1.0.11/base64.d.ts +0 -39
  308. package/esm/deps/jsr.io/@std/encoding/1.0.11/base64.js +0 -82
  309. package/esm/deps/jsr.io/@std/encoding/1.0.11/base64url.d.ts +0 -39
  310. package/esm/deps/jsr.io/@std/encoding/1.0.11/base64url.js +0 -72
  311. package/esm/deps/jsr.io/@std/encoding/1.0.11/hex.d.ts +0 -38
  312. package/esm/deps/jsr.io/@std/encoding/1.0.11/hex.js +0 -87
  313. package/esm/deps/jsr.io/@std/encoding/1.0.11/mod.d.ts +0 -97
  314. package/esm/deps/jsr.io/@std/encoding/1.0.11/mod.js +0 -99
  315. package/esm/deps/jsr.io/@std/encoding/1.0.11/varint.d.ts +0 -119
  316. package/esm/deps/jsr.io/@std/encoding/1.0.11/varint.js +0 -209
  317. package/esm/deps/jsr.io/@std/http/1.1.3/status.d.ts +0 -343
  318. package/esm/deps/jsr.io/@std/http/1.1.3/status.js +0 -343
  319. package/esm/deps/jsr.io/@std/internal/1.0.14/assertion_state.d.ts +0 -159
  320. package/esm/deps/jsr.io/@std/internal/1.0.14/assertion_state.js +0 -223
  321. package/esm/deps/jsr.io/@std/internal/1.0.14/build_message.d.ts +0 -79
  322. package/esm/deps/jsr.io/@std/internal/1.0.14/build_message.js +0 -116
  323. package/esm/deps/jsr.io/@std/internal/1.0.14/diff.d.ts +0 -139
  324. package/esm/deps/jsr.io/@std/internal/1.0.14/diff.js +0 -277
  325. package/esm/deps/jsr.io/@std/internal/1.0.14/diff_str.d.ts +0 -98
  326. package/esm/deps/jsr.io/@std/internal/1.0.14/diff_str.js +0 -181
  327. package/esm/deps/jsr.io/@std/internal/1.0.14/format.d.ts +0 -29
  328. package/esm/deps/jsr.io/@std/internal/1.0.14/format.js +0 -68
  329. package/esm/deps/jsr.io/@std/internal/1.0.14/styles.d.ts +0 -158
  330. package/esm/deps/jsr.io/@std/internal/1.0.14/styles.js +0 -206
  331. package/esm/deps/jsr.io/@std/internal/1.0.14/types.d.ts +0 -24
  332. package/esm/deps/jsr.io/@std/internal/1.0.14/types.js +0 -3
  333. package/esm/deps/jsr.io/@std/testing/1.0.20/_test_suite.d.ts +0 -91
  334. package/esm/deps/jsr.io/@std/testing/1.0.20/_test_suite.js +0 -347
  335. package/esm/deps/jsr.io/@std/testing/1.0.20/bdd.d.ts +0 -382
  336. package/esm/deps/jsr.io/@std/testing/1.0.20/bdd.js +0 -1110
  337. package/esm/deps/jsr.io/@udibo/http-error/0.11.1/mod.d.ts +0 -363
  338. package/esm/deps/jsr.io/@udibo/http-error/0.11.1/mod.js +0 -616
  339. package/esm/package.json +0 -3
  340. /package/{esm → dist}/adapters/hono/bff/cookie-prefix.d.ts +0 -0
  341. /package/{esm → dist}/adapters/hono/bff/proxy.d.ts +0 -0
  342. /package/{esm → dist}/client/_http.js +0 -0
  343. /package/{esm → dist}/client/base.js +0 -0
  344. /package/{esm → dist}/client/browser-storage.js +0 -0
  345. /package/{esm → dist}/client/check.d.ts +0 -0
  346. /package/{esm → dist}/client/events.js +0 -0
  347. /package/{esm → dist}/client/storage.d.ts +0 -0
  348. /package/{esm → dist}/client/storage.js +0 -0
  349. /package/{esm → dist}/identity/captcha.d.ts +0 -0
  350. /package/{esm → dist}/identity/captcha.js +0 -0
  351. /package/{esm → dist}/identity/delivery.d.ts +0 -0
  352. /package/{esm → dist}/identity/delivery.js +0 -0
  353. /package/{esm → dist}/identity/errors.d.ts +0 -0
  354. /package/{esm → dist}/identity/errors.js +0 -0
  355. /package/{esm → dist}/identity/events.js +0 -0
  356. /package/{esm → dist}/identity/external/_token-exchange.d.ts +0 -0
  357. /package/{esm → dist}/identity/external/_token-exchange.js +0 -0
  358. /package/{esm → dist}/identity/external/errors.d.ts +0 -0
  359. /package/{esm → dist}/identity/external/errors.js +0 -0
  360. /package/{esm → dist}/identity/external/provider.d.ts +0 -0
  361. /package/{esm → dist}/identity/external/provider.js +0 -0
  362. /package/{esm → dist}/identity/identifier.d.ts +0 -0
  363. /package/{esm → dist}/identity/identifier.js +0 -0
  364. /package/{esm → dist}/identity/lockout.d.ts +0 -0
  365. /package/{esm → dist}/identity/mfa/recovery-codes.d.ts +0 -0
  366. /package/{esm → dist}/identity/mfa/recovery-codes.js +0 -0
  367. /package/{esm → dist}/identity/password-policy.d.ts +0 -0
  368. /package/{esm → dist}/identity/password-policy.js +0 -0
  369. /package/{esm → dist}/identity/password.d.ts +0 -0
  370. /package/{esm → dist}/identity/rate-limit.js +0 -0
  371. /package/{esm → dist}/identity/session.d.ts +0 -0
  372. /package/{esm → dist}/identity/token-flow.d.ts +0 -0
  373. /package/{esm → dist}/models/authentication.d.ts +0 -0
  374. /package/{esm → dist}/models/authentication.js +0 -0
  375. /package/{esm → dist}/models/authorization-code.js +0 -0
  376. /package/{esm → dist}/models/client.d.ts +0 -0
  377. /package/{esm → dist}/models/client.js +0 -0
  378. /package/{esm → dist}/models/device-authorization.js +0 -0
  379. /package/{esm → dist}/models/responses.d.ts +0 -0
  380. /package/{esm → dist}/models/responses.js +0 -0
  381. /package/{esm → dist}/models/scope.d.ts +0 -0
  382. /package/{esm → dist}/models/scope.js +0 -0
  383. /package/{esm → dist}/models/token.js +0 -0
  384. /package/{esm → dist}/react/components/types.js +0 -0
  385. /package/{esm → dist}/react/context.js +0 -0
  386. /package/{esm → dist}/react/provider.js +0 -0
  387. /package/{esm → dist}/react/require-auth.d.ts +0 -0
  388. /package/{esm → dist}/react/use-authorization.js +0 -0
  389. /package/{esm → dist}/server/_clock-skew.d.ts +0 -0
  390. /package/{esm → dist}/server/client-authentication.js +0 -0
  391. /package/{esm → dist}/server/grants/client-credentials.js +0 -0
  392. /package/{esm → dist}/server/grants/password.js +0 -0
  393. /package/{esm → dist}/server/redirect-uri.d.ts +0 -0
  394. /package/{esm → dist}/server/services/authorization-code.js +0 -0
  395. /package/{esm → dist}/server/services/client.js +0 -0
  396. /package/{esm → dist}/server/services/device-authorization.js +0 -0
  397. /package/{esm → dist}/server/services/user.js +0 -0
  398. /package/{esm → dist}/server/utils/hash.d.ts +0 -0
  399. /package/{esm → dist}/testing/contract/_race.d.ts +0 -0
  400. /package/{esm → dist}/testing/contract/_race.js +0 -0
  401. /package/{esm → dist}/testing/contract/tenant.d.ts +0 -0
  402. /package/{esm → dist}/utils/_body.d.ts +0 -0
  403. /package/{esm → dist}/utils/_body.js +0 -0
  404. /package/{esm → dist}/utils/_buffer.d.ts +0 -0
  405. /package/{esm → dist}/utils/_buffer.js +0 -0
  406. /package/{esm → dist}/utils/_default-fetch.d.ts +0 -0
  407. /package/{esm → dist}/utils/_timing-safe.d.ts +0 -0
  408. /package/{esm → dist}/utils/_timing-safe.js +0 -0
  409. /package/{esm → dist}/utils/authentication-context.js +0 -0
  410. /package/{esm → dist}/utils/basic-auth.d.ts +0 -0
  411. /package/{esm → dist}/utils/basic-auth.js +0 -0
  412. /package/{esm → dist}/utils/pkce.d.ts +0 -0
  413. /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.
@@ -52,6 +52,7 @@ import { deleteCookie, getCookie, setCookie } from "hono/cookie";
52
52
  import { assertMaxBodyBytes, DEFAULT_MAX_BODY_BYTES, readBoundedBody, } from "../../../utils/_body.js";
53
53
  import { InvalidRequestError, InvalidTokenError, isOAuth2Error, TemporarilyUnavailableError, } from "../../../errors.js";
54
54
  import { defaultFetch } from "../../../utils/_default-fetch.js";
55
+ import { inboundRequestWithHeaders } from "../../../utils/_inbound-request.js";
55
56
  import { timingSafeMatchIndex } from "../../../utils/_timing-safe.js";
56
57
  import { sha256Hash } from "../../../server/utils/hash.js";
57
58
  import { OAUTH2_CONTEXT_KEY } from "../_common.js";
@@ -84,8 +85,7 @@ function resolvePaths(paths = {}, options) {
84
85
  };
85
86
  if (basePath === "")
86
87
  return resolved;
87
- const stray = BFF_PATH_KEYS
88
- .filter((key) => key !== "backchannel" || options.backchannelMounted)
88
+ const stray = BFF_PATH_KEYS.filter((key) => key !== "backchannel" || options.backchannelMounted)
89
89
  .filter((key) => !resolved[key].startsWith(`${basePath}/`))
90
90
  .map((key) => `${key} ("${resolved[key]}")`);
91
91
  if (stray.length > 0) {
@@ -325,8 +325,8 @@ export class HonoBff {
325
325
  });
326
326
  this.#cookieName = sessionCookieName(options.cookie);
327
327
  this.#loginStateCookieName = loginStateCookieName(options.cookie);
328
- this.#loginStateTtlMs = options.loginStateTtlMs ??
329
- DEFAULT_LOGIN_STATE_TTL_MS;
328
+ this.#loginStateTtlMs =
329
+ options.loginStateTtlMs ?? DEFAULT_LOGIN_STATE_TTL_MS;
330
330
  this.#sessionMode = options.sessionMode ?? "own";
331
331
  this.#csrf = resolveCsrf(options.csrf);
332
332
  this.#extraAuthorizeParams = resolveExtraAuthorizeParams(options);
@@ -334,16 +334,17 @@ export class HonoBff {
334
334
  this.#sessionMaxAgeMs = sessionMaxAgeMs;
335
335
  if (this.#sessionMode === "shared") {
336
336
  const maxAge = options.cookie?.maxAge;
337
- this.#cookieMaxAgeSeconds = maxAge === undefined || maxAge === "session"
338
- ? undefined
339
- : positiveSeconds(maxAge, "cookie.maxAge");
337
+ this.#cookieMaxAgeSeconds =
338
+ maxAge === undefined || maxAge === "session"
339
+ ? undefined
340
+ : positiveSeconds(maxAge, "cookie.maxAge");
340
341
  }
341
342
  else {
342
- const configuredMaxAge = options.cookie?.maxAge ??
343
- Math.ceil(sessionMaxAgeMs / 1000);
344
- this.#cookieMaxAgeSeconds = configuredMaxAge === "session"
345
- ? undefined
346
- : positiveSeconds(configuredMaxAge, "cookie.maxAge");
343
+ const configuredMaxAge = options.cookie?.maxAge ?? Math.ceil(sessionMaxAgeMs / 1000);
344
+ this.#cookieMaxAgeSeconds =
345
+ configuredMaxAge === "session"
346
+ ? undefined
347
+ : positiveSeconds(configuredMaxAge, "cookie.maxAge");
347
348
  if (this.#cookieMaxAgeSeconds !== undefined) {
348
349
  const storeMaxAgeMs = sessionStoreMaxAgeMs(this.#store);
349
350
  const sessionSeconds = Math.ceil(Math.max(sessionMaxAgeMs, storeMaxAgeMs ?? 0) / 1000);
@@ -611,7 +612,10 @@ export class HonoBff {
611
612
  const params = new URL(c.req.url).searchParams;
612
613
  const fail = (error) => this.#options.onCallbackError
613
614
  ? this.#options.onCallbackError(c, error)
614
- : c.json({ error: error.error, error_description: error.error_description }, 400);
615
+ : c.json({
616
+ error: error.error,
617
+ error_description: error.error_description,
618
+ }, 400);
615
619
  if (params.get("error")) {
616
620
  return await fail({
617
621
  error: params.get("error"),
@@ -637,8 +641,7 @@ export class HonoBff {
637
641
  this.#writeLoginStateHashes(c, pendingStates.filter((_, index) => index !== matched));
638
642
  try {
639
643
  const origin = this.#options.resolveOrigin?.(c);
640
- const { tokens, refreshToken, returnTo, raw } = await this.#client
641
- .exchangeAuthorizationCode(code, state, {
644
+ const { tokens, refreshToken, returnTo, raw } = await this.#client.exchangeAuthorizationCode(code, state, {
642
645
  origin,
643
646
  redirectUri: this.#derivedRedirectUri(c, origin),
644
647
  authRequestStorage: this.#options.authRequestStorage?.forRequest(c),
@@ -724,8 +727,7 @@ export class HonoBff {
724
727
  if (this.#options.rpInitiatedLogout) {
725
728
  const endSession = this.#client.endSessionEndpoint;
726
729
  if (endSession) {
727
- const origin = this.#options.resolveOrigin?.(c) ??
728
- new URL(c.req.url).origin;
730
+ const origin = this.#options.resolveOrigin?.(c) ?? new URL(c.req.url).origin;
729
731
  const url = new URL(endSession, origin);
730
732
  if (idToken)
731
733
  url.searchParams.set("id_token_hint", idToken);
@@ -880,7 +882,8 @@ export class HonoBff {
880
882
  catch {
881
883
  subject = null;
882
884
  }
883
- if (!subject || (subject.sub === undefined && subject.sid === undefined)) {
885
+ if (!subject ||
886
+ (subject.sub === undefined && subject.sid === undefined)) {
884
887
  return c.json({
885
888
  error: "invalid_request",
886
889
  error_description: "invalid logout_token",
@@ -1021,7 +1024,7 @@ export class HonoBff {
1021
1024
  }
1022
1025
  const headers = new Headers(c.req.raw.headers);
1023
1026
  headers.set("Authorization", `Bearer ${resolution.entry.data.tokens.accessToken}`);
1024
- c.req.raw = new Request(c.req.raw, { headers });
1027
+ c.req.raw = inboundRequestWithHeaders(c.req.raw, headers);
1025
1028
  await next();
1026
1029
  };
1027
1030
  }
@@ -1089,7 +1092,9 @@ export class HonoBff {
1089
1092
  try {
1090
1093
  const inboundAuth = c.req.header("Authorization") ?? "";
1091
1094
  const hasBearer = /^bearer\s+\S/i.test(inboundAuth);
1092
- if (!hasBearer && this.#csrf && this.#hasSessionCookie(c) &&
1095
+ if (!hasBearer &&
1096
+ this.#csrf &&
1097
+ this.#hasSessionCookie(c) &&
1093
1098
  !this.#csrfHeaderOk(c)) {
1094
1099
  return this.#csrfReject(c);
1095
1100
  }
@@ -1203,7 +1208,7 @@ export class HonoBff {
1203
1208
  const retryOn401 = options.retryOn401 ?? true;
1204
1209
  const mountPrefix = (options.stripPrefix ?? "").endsWith("/")
1205
1210
  ? options.stripPrefix.slice(0, -1)
1206
- : options.stripPrefix ?? "";
1211
+ : (options.stripPrefix ?? "");
1207
1212
  return async (c) => {
1208
1213
  if (this.#csrf && this.#hasSessionCookie(c) && !this.#csrfHeaderOk(c)) {
1209
1214
  return this.#csrfReject(c);
@@ -1244,8 +1249,7 @@ export class HonoBff {
1244
1249
  cause,
1245
1250
  }));
1246
1251
  }
1247
- const canRetry = retryOn401 && body === null &&
1248
- entry.data.refreshToken !== undefined;
1252
+ const canRetry = retryOn401 && body === null && entry.data.refreshToken !== undefined;
1249
1253
  if (canRetry && isInvalidTokenChallenge(response)) {
1250
1254
  await response.body?.cancel();
1251
1255
  const outcome = await this.#refreshSessionEntry(c, entry);
@@ -1273,10 +1277,12 @@ export class HonoBff {
1273
1277
  mountPrefix,
1274
1278
  }),
1275
1279
  };
1276
- return downstream === null ? c.body(null, init) : c.body(downstream, {
1277
- ...init,
1278
- status: response.status,
1279
- });
1280
+ return downstream === null
1281
+ ? c.body(null, init)
1282
+ : c.body(downstream, {
1283
+ ...init,
1284
+ status: response.status,
1285
+ });
1280
1286
  };
1281
1287
  }
1282
1288
  }
@@ -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.