@_mustachio/openauth 0.9.2 → 0.10.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 (712) hide show
  1. package/dist/esm/adapters/d1/audit-log.js +15 -0
  2. package/dist/esm/adapters/d1/config-store.js +45 -0
  3. package/dist/esm/adapters/d1/index.js +12 -0
  4. package/dist/esm/adapters/d1/key-store.js +116 -0
  5. package/dist/esm/adapters/d1/method-store.js +52 -0
  6. package/dist/esm/adapters/d1/migrations.js +77 -0
  7. package/dist/esm/adapters/d1/session-store.js +134 -0
  8. package/dist/esm/adapters/d1/session.js +18 -0
  9. package/dist/esm/adapters/d1/token-store.js +140 -0
  10. package/dist/esm/adapters/durable-object/index.js +3 -0
  11. package/dist/esm/adapters/durable-object/session-store.js +139 -0
  12. package/dist/esm/adapters/durable-object/types.js +0 -0
  13. package/dist/esm/adapters/dynamo/audit-log.js +23 -0
  14. package/dist/esm/adapters/dynamo/client.js +0 -0
  15. package/dist/esm/adapters/dynamo/config-store.js +57 -0
  16. package/dist/esm/adapters/dynamo/index.js +10 -0
  17. package/dist/esm/adapters/dynamo/key-store.js +188 -0
  18. package/dist/esm/adapters/dynamo/method-store.js +72 -0
  19. package/dist/esm/adapters/dynamo/passkey-credential-store.js +83 -0
  20. package/dist/esm/adapters/dynamo/sdk.js +128 -0
  21. package/dist/esm/adapters/dynamo/session-store.js +173 -0
  22. package/dist/esm/adapters/dynamo/token-store.js +178 -0
  23. package/dist/esm/adapters/kms/in-memory-backing.js +28 -0
  24. package/dist/esm/adapters/kms/index.js +5 -0
  25. package/dist/esm/adapters/kms/key-store.js +129 -0
  26. package/dist/esm/adapters/kms/sdk.js +23 -0
  27. package/dist/esm/adapters/kms/types.js +0 -0
  28. package/dist/esm/adapters/kv/audit-log.js +21 -0
  29. package/dist/esm/adapters/kv/config-store.js +43 -0
  30. package/dist/esm/adapters/kv/index.js +5 -0
  31. package/dist/esm/adapters/kv/method-store.js +63 -0
  32. package/dist/esm/adapters/kv/types.js +0 -0
  33. package/dist/esm/adapters/memory/audit-log.js +16 -0
  34. package/dist/esm/adapters/memory/clock.js +5 -0
  35. package/dist/esm/adapters/memory/config-store.js +31 -0
  36. package/dist/esm/adapters/memory/index.js +10 -0
  37. package/dist/esm/adapters/memory/key-store.js +78 -0
  38. package/dist/esm/adapters/memory/method-store.js +43 -0
  39. package/dist/esm/adapters/memory/passkey-credential-store.js +53 -0
  40. package/dist/esm/adapters/memory/session-store.js +82 -0
  41. package/dist/esm/adapters/memory/token-store.js +91 -0
  42. package/dist/esm/adapters/postgres/audit-log.js +16 -0
  43. package/dist/esm/adapters/postgres/config-store.js +48 -0
  44. package/dist/esm/adapters/postgres/executor.js +21 -0
  45. package/dist/esm/adapters/postgres/index.js +13 -0
  46. package/dist/esm/adapters/postgres/key-store.js +191 -0
  47. package/dist/esm/adapters/postgres/method-store.js +61 -0
  48. package/dist/esm/adapters/postgres/migrations.js +111 -0
  49. package/dist/esm/adapters/postgres/passkey-credential-store.js +80 -0
  50. package/dist/esm/adapters/postgres/session-store.js +135 -0
  51. package/dist/esm/adapters/postgres/token-store.js +151 -0
  52. package/dist/esm/client.js +26 -10
  53. package/dist/esm/domain/audit.js +13 -0
  54. package/dist/esm/domain/authorize.js +212 -0
  55. package/dist/esm/domain/callback.js +173 -0
  56. package/dist/esm/domain/client-auth.js +61 -0
  57. package/dist/esm/domain/client-credentials.js +91 -0
  58. package/dist/esm/domain/crypto.js +97 -0
  59. package/dist/esm/domain/discovery.js +41 -0
  60. package/dist/esm/domain/introspect.js +51 -0
  61. package/dist/esm/domain/jwt.js +43 -0
  62. package/dist/esm/domain/method-cache.js +136 -0
  63. package/dist/esm/domain/method-dispatch.js +36 -0
  64. package/dist/esm/domain/method-route.js +108 -0
  65. package/dist/esm/domain/pkce.js +16 -0
  66. package/dist/esm/domain/refresh.js +91 -0
  67. package/dist/esm/domain/revoke.js +81 -0
  68. package/dist/esm/domain/state-envelope.js +80 -0
  69. package/dist/esm/domain/token-exchange.js +101 -0
  70. package/dist/esm/domain/token.js +205 -0
  71. package/dist/esm/domain/userinfo.js +27 -0
  72. package/dist/esm/http/context.js +7 -0
  73. package/dist/esm/http/cookies.js +98 -0
  74. package/dist/esm/http/errors.js +71 -0
  75. package/dist/esm/http/handlers/authorize.js +163 -0
  76. package/dist/esm/http/handlers/callback.js +53 -0
  77. package/dist/esm/http/handlers/metadata.js +34 -0
  78. package/dist/esm/http/handlers/method-route.js +87 -0
  79. package/dist/esm/http/handlers/revocation.js +98 -0
  80. package/dist/esm/http/handlers/token.js +167 -0
  81. package/dist/esm/http/handlers/userinfo.js +54 -0
  82. package/dist/esm/http/middleware/error.js +15 -0
  83. package/dist/esm/http/middleware/tenant.js +102 -0
  84. package/dist/esm/http/resolver.js +15 -0
  85. package/dist/esm/http/router.js +35 -0
  86. package/dist/esm/http/schemas/authorize.js +24 -0
  87. package/dist/esm/http/schemas/revocation.js +18 -0
  88. package/dist/esm/http/schemas/token.js +57 -0
  89. package/dist/esm/index.js +121 -9
  90. package/dist/esm/methods/code.js +221 -0
  91. package/dist/esm/methods/m2m.js +41 -0
  92. package/dist/esm/methods/oauth2-factory.js +84 -0
  93. package/dist/esm/methods/oauth2-generic.js +196 -0
  94. package/dist/esm/methods/oidc-generic.js +53 -0
  95. package/dist/esm/methods/passkey.js +275 -0
  96. package/dist/esm/methods/password-hash.js +79 -0
  97. package/dist/esm/methods/password.js +166 -0
  98. package/dist/esm/methods/providers/apple.js +29 -0
  99. package/dist/esm/methods/providers/cognito.js +37 -0
  100. package/dist/esm/methods/providers/discord.js +28 -0
  101. package/dist/esm/methods/providers/facebook.js +42 -0
  102. package/dist/esm/methods/providers/github.js +29 -0
  103. package/dist/esm/methods/providers/google.js +29 -0
  104. package/dist/esm/methods/providers/index.js +17 -0
  105. package/dist/esm/methods/providers/jumpcloud.js +27 -0
  106. package/dist/esm/methods/providers/keycloak.js +32 -0
  107. package/dist/esm/methods/providers/linkedin.js +28 -0
  108. package/dist/esm/methods/providers/microsoft.js +28 -0
  109. package/dist/esm/methods/providers/slack.js +30 -0
  110. package/dist/esm/methods/providers/spotify.js +28 -0
  111. package/dist/esm/methods/providers/twitch.js +28 -0
  112. package/dist/esm/methods/providers/x.js +28 -0
  113. package/dist/esm/methods/providers/yahoo.js +27 -0
  114. package/dist/esm/pkce.js +4 -16
  115. package/dist/esm/ports/audit-log.js +0 -0
  116. package/dist/esm/ports/config-store.js +0 -0
  117. package/dist/esm/ports/key-store.js +0 -0
  118. package/dist/esm/ports/method-store.js +0 -0
  119. package/dist/esm/ports/session-store.js +0 -0
  120. package/dist/esm/ports/token-store.js +0 -0
  121. package/dist/esm/types/authorization.js +0 -0
  122. package/dist/esm/types/error.js +65 -0
  123. package/dist/esm/types/flow.js +0 -0
  124. package/dist/esm/types/idp.js +0 -0
  125. package/dist/esm/types/method.js +0 -0
  126. package/dist/esm/types/picker.js +0 -0
  127. package/dist/esm/types/result.js +11 -0
  128. package/dist/esm/types/subject.js +0 -0
  129. package/dist/esm/types/tenant.js +5 -0
  130. package/dist/esm/types/token.js +0 -0
  131. package/dist/esm/ui/forms.js +253 -0
  132. package/dist/esm/ui/index.js +8 -0
  133. package/dist/esm/ui/picker.js +49 -0
  134. package/dist/types/adapters/d1/audit-log.d.ts +19 -0
  135. package/dist/types/adapters/d1/audit-log.d.ts.map +1 -0
  136. package/dist/types/adapters/d1/config-store.d.ts +20 -0
  137. package/dist/types/adapters/d1/config-store.d.ts.map +1 -0
  138. package/dist/types/adapters/d1/index.d.ts +35 -0
  139. package/dist/types/adapters/d1/index.d.ts.map +1 -0
  140. package/dist/types/adapters/d1/key-store.d.ts +17 -0
  141. package/dist/types/adapters/d1/key-store.d.ts.map +1 -0
  142. package/dist/types/adapters/d1/method-store.d.ts +21 -0
  143. package/dist/types/adapters/d1/method-store.d.ts.map +1 -0
  144. package/dist/types/adapters/d1/migrations.d.ts +18 -0
  145. package/dist/types/adapters/d1/migrations.d.ts.map +1 -0
  146. package/dist/types/adapters/d1/session-store.d.ts +20 -0
  147. package/dist/types/adapters/d1/session-store.d.ts.map +1 -0
  148. package/dist/types/adapters/d1/session.d.ts +18 -0
  149. package/dist/types/adapters/d1/session.d.ts.map +1 -0
  150. package/dist/types/adapters/d1/token-store.d.ts +29 -0
  151. package/dist/types/adapters/d1/token-store.d.ts.map +1 -0
  152. package/dist/types/adapters/d1/types.d.ts +43 -0
  153. package/dist/types/adapters/d1/types.d.ts.map +1 -0
  154. package/dist/types/adapters/durable-object/index.d.ts +17 -0
  155. package/dist/types/adapters/durable-object/index.d.ts.map +1 -0
  156. package/dist/types/adapters/durable-object/session-store.d.ts +21 -0
  157. package/dist/types/adapters/durable-object/session-store.d.ts.map +1 -0
  158. package/dist/types/adapters/durable-object/types.d.ts +23 -0
  159. package/dist/types/adapters/durable-object/types.d.ts.map +1 -0
  160. package/dist/types/adapters/dynamo/audit-log.d.ts +19 -0
  161. package/dist/types/adapters/dynamo/audit-log.d.ts.map +1 -0
  162. package/dist/types/adapters/dynamo/client.d.ts +111 -0
  163. package/dist/types/adapters/dynamo/client.d.ts.map +1 -0
  164. package/dist/types/adapters/dynamo/config-store.d.ts +21 -0
  165. package/dist/types/adapters/dynamo/config-store.d.ts.map +1 -0
  166. package/dist/types/adapters/dynamo/index.d.ts +60 -0
  167. package/dist/types/adapters/dynamo/index.d.ts.map +1 -0
  168. package/dist/types/adapters/dynamo/key-store.d.ts +23 -0
  169. package/dist/types/adapters/dynamo/key-store.d.ts.map +1 -0
  170. package/dist/types/adapters/dynamo/method-store.d.ts +20 -0
  171. package/dist/types/adapters/dynamo/method-store.d.ts.map +1 -0
  172. package/dist/types/adapters/dynamo/passkey-credential-store.d.ts +47 -0
  173. package/dist/types/adapters/dynamo/passkey-credential-store.d.ts.map +1 -0
  174. package/dist/types/adapters/dynamo/sdk.d.ts +23 -0
  175. package/dist/types/adapters/dynamo/sdk.d.ts.map +1 -0
  176. package/dist/types/adapters/dynamo/session-store.d.ts +20 -0
  177. package/dist/types/adapters/dynamo/session-store.d.ts.map +1 -0
  178. package/dist/types/adapters/dynamo/token-store.d.ts +29 -0
  179. package/dist/types/adapters/dynamo/token-store.d.ts.map +1 -0
  180. package/dist/types/adapters/kms/in-memory-backing.d.ts +9 -0
  181. package/dist/types/adapters/kms/in-memory-backing.d.ts.map +1 -0
  182. package/dist/types/adapters/kms/index.d.ts +35 -0
  183. package/dist/types/adapters/kms/index.d.ts.map +1 -0
  184. package/dist/types/adapters/kms/key-store.d.ts +20 -0
  185. package/dist/types/adapters/kms/key-store.d.ts.map +1 -0
  186. package/dist/types/adapters/kms/sdk.d.ts +16 -0
  187. package/dist/types/adapters/kms/sdk.d.ts.map +1 -0
  188. package/dist/types/adapters/kms/types.d.ts +58 -0
  189. package/dist/types/adapters/kms/types.d.ts.map +1 -0
  190. package/dist/types/adapters/kv/audit-log.d.ts +22 -0
  191. package/dist/types/adapters/kv/audit-log.d.ts.map +1 -0
  192. package/dist/types/adapters/kv/config-store.d.ts +25 -0
  193. package/dist/types/adapters/kv/config-store.d.ts.map +1 -0
  194. package/dist/types/adapters/kv/index.d.ts +21 -0
  195. package/dist/types/adapters/kv/index.d.ts.map +1 -0
  196. package/dist/types/adapters/kv/method-store.d.ts +23 -0
  197. package/dist/types/adapters/kv/method-store.d.ts.map +1 -0
  198. package/dist/types/adapters/kv/types.d.ts +28 -0
  199. package/dist/types/adapters/kv/types.d.ts.map +1 -0
  200. package/dist/types/adapters/memory/audit-log.d.ts +18 -0
  201. package/dist/types/adapters/memory/audit-log.d.ts.map +1 -0
  202. package/dist/types/adapters/memory/clock.d.ts +7 -0
  203. package/dist/types/adapters/memory/clock.d.ts.map +1 -0
  204. package/dist/types/adapters/memory/config-store.d.ts +19 -0
  205. package/dist/types/adapters/memory/config-store.d.ts.map +1 -0
  206. package/dist/types/adapters/memory/index.d.ts +15 -0
  207. package/dist/types/adapters/memory/index.d.ts.map +1 -0
  208. package/dist/types/adapters/memory/key-store.d.ts +17 -0
  209. package/dist/types/adapters/memory/key-store.d.ts.map +1 -0
  210. package/dist/types/adapters/memory/method-store.d.ts +26 -0
  211. package/dist/types/adapters/memory/method-store.d.ts.map +1 -0
  212. package/dist/types/adapters/memory/passkey-credential-store.d.ts +43 -0
  213. package/dist/types/adapters/memory/passkey-credential-store.d.ts.map +1 -0
  214. package/dist/types/adapters/memory/session-store.d.ts +19 -0
  215. package/dist/types/adapters/memory/session-store.d.ts.map +1 -0
  216. package/dist/types/adapters/memory/token-store.d.ts +28 -0
  217. package/dist/types/adapters/memory/token-store.d.ts.map +1 -0
  218. package/dist/types/adapters/postgres/audit-log.d.ts +18 -0
  219. package/dist/types/adapters/postgres/audit-log.d.ts.map +1 -0
  220. package/dist/types/adapters/postgres/config-store.d.ts +21 -0
  221. package/dist/types/adapters/postgres/config-store.d.ts.map +1 -0
  222. package/dist/types/adapters/postgres/executor.d.ts +48 -0
  223. package/dist/types/adapters/postgres/executor.d.ts.map +1 -0
  224. package/dist/types/adapters/postgres/index.d.ts +39 -0
  225. package/dist/types/adapters/postgres/index.d.ts.map +1 -0
  226. package/dist/types/adapters/postgres/key-store.d.ts +23 -0
  227. package/dist/types/adapters/postgres/key-store.d.ts.map +1 -0
  228. package/dist/types/adapters/postgres/method-store.d.ts +21 -0
  229. package/dist/types/adapters/postgres/method-store.d.ts.map +1 -0
  230. package/dist/types/adapters/postgres/migrations.d.ts +22 -0
  231. package/dist/types/adapters/postgres/migrations.d.ts.map +1 -0
  232. package/dist/types/adapters/postgres/passkey-credential-store.d.ts +48 -0
  233. package/dist/types/adapters/postgres/passkey-credential-store.d.ts.map +1 -0
  234. package/dist/types/adapters/postgres/session-store.d.ts +20 -0
  235. package/dist/types/adapters/postgres/session-store.d.ts.map +1 -0
  236. package/dist/types/adapters/postgres/token-store.d.ts +30 -0
  237. package/dist/types/adapters/postgres/token-store.d.ts.map +1 -0
  238. package/dist/types/client.d.ts +1 -1
  239. package/dist/types/client.d.ts.map +1 -1
  240. package/dist/types/domain/audit.d.ts +17 -0
  241. package/dist/types/domain/audit.d.ts.map +1 -0
  242. package/dist/types/domain/authorize.d.ts +125 -0
  243. package/dist/types/domain/authorize.d.ts.map +1 -0
  244. package/dist/types/domain/callback.d.ts +70 -0
  245. package/dist/types/domain/callback.d.ts.map +1 -0
  246. package/dist/types/domain/client-auth.d.ts +57 -0
  247. package/dist/types/domain/client-auth.d.ts.map +1 -0
  248. package/dist/types/domain/client-credentials.d.ts +52 -0
  249. package/dist/types/domain/client-credentials.d.ts.map +1 -0
  250. package/dist/types/domain/crypto.d.ts +53 -0
  251. package/dist/types/domain/crypto.d.ts.map +1 -0
  252. package/dist/types/domain/discovery.d.ts +44 -0
  253. package/dist/types/domain/discovery.d.ts.map +1 -0
  254. package/dist/types/domain/introspect.d.ts +71 -0
  255. package/dist/types/domain/introspect.d.ts.map +1 -0
  256. package/dist/types/domain/jwt.d.ts +48 -0
  257. package/dist/types/domain/jwt.d.ts.map +1 -0
  258. package/dist/types/domain/method-cache.d.ts +42 -0
  259. package/dist/types/domain/method-cache.d.ts.map +1 -0
  260. package/dist/types/domain/method-dispatch.d.ts +37 -0
  261. package/dist/types/domain/method-dispatch.d.ts.map +1 -0
  262. package/dist/types/domain/method-route.d.ts +77 -0
  263. package/dist/types/domain/method-route.d.ts.map +1 -0
  264. package/dist/types/domain/pkce.d.ts +15 -0
  265. package/dist/types/domain/pkce.d.ts.map +1 -0
  266. package/dist/types/domain/refresh.d.ts +43 -0
  267. package/dist/types/domain/refresh.d.ts.map +1 -0
  268. package/dist/types/domain/revoke.d.ts +61 -0
  269. package/dist/types/domain/revoke.d.ts.map +1 -0
  270. package/dist/types/domain/state-envelope.d.ts +30 -0
  271. package/dist/types/domain/state-envelope.d.ts.map +1 -0
  272. package/dist/types/domain/token-exchange.d.ts +67 -0
  273. package/dist/types/domain/token-exchange.d.ts.map +1 -0
  274. package/dist/types/domain/token.d.ts +100 -0
  275. package/dist/types/domain/token.d.ts.map +1 -0
  276. package/dist/types/domain/userinfo.d.ts +22 -0
  277. package/dist/types/domain/userinfo.d.ts.map +1 -0
  278. package/dist/types/http/context.d.ts +63 -0
  279. package/dist/types/http/context.d.ts.map +1 -0
  280. package/dist/types/http/cookies.d.ts +45 -0
  281. package/dist/types/http/cookies.d.ts.map +1 -0
  282. package/dist/types/http/errors.d.ts +36 -0
  283. package/dist/types/http/errors.d.ts.map +1 -0
  284. package/dist/types/http/handlers/authorize.d.ts +3 -0
  285. package/dist/types/http/handlers/authorize.d.ts.map +1 -0
  286. package/dist/types/http/handlers/callback.d.ts +3 -0
  287. package/dist/types/http/handlers/callback.d.ts.map +1 -0
  288. package/dist/types/http/handlers/metadata.d.ts +4 -0
  289. package/dist/types/http/handlers/metadata.d.ts.map +1 -0
  290. package/dist/types/http/handlers/method-route.d.ts +3 -0
  291. package/dist/types/http/handlers/method-route.d.ts.map +1 -0
  292. package/dist/types/http/handlers/revocation.d.ts +4 -0
  293. package/dist/types/http/handlers/revocation.d.ts.map +1 -0
  294. package/dist/types/http/handlers/token.d.ts +3 -0
  295. package/dist/types/http/handlers/token.d.ts.map +1 -0
  296. package/dist/types/http/handlers/userinfo.d.ts +3 -0
  297. package/dist/types/http/handlers/userinfo.d.ts.map +1 -0
  298. package/dist/types/http/middleware/error.d.ts +9 -0
  299. package/dist/types/http/middleware/error.d.ts.map +1 -0
  300. package/dist/types/http/middleware/tenant.d.ts +30 -0
  301. package/dist/types/http/middleware/tenant.d.ts.map +1 -0
  302. package/dist/types/http/resolver.d.ts +22 -0
  303. package/dist/types/http/resolver.d.ts.map +1 -0
  304. package/dist/types/http/router.d.ts +21 -0
  305. package/dist/types/http/router.d.ts.map +1 -0
  306. package/dist/types/http/schemas/authorize.d.ts +52 -0
  307. package/dist/types/http/schemas/authorize.d.ts.map +1 -0
  308. package/dist/types/http/schemas/revocation.d.ts +41 -0
  309. package/dist/types/http/schemas/revocation.d.ts.map +1 -0
  310. package/dist/types/http/schemas/token.d.ts +227 -0
  311. package/dist/types/http/schemas/token.d.ts.map +1 -0
  312. package/dist/types/index.d.ts +63 -13
  313. package/dist/types/index.d.ts.map +1 -1
  314. package/dist/types/methods/code.d.ts +96 -0
  315. package/dist/types/methods/code.d.ts.map +1 -0
  316. package/dist/types/methods/m2m.d.ts +41 -0
  317. package/dist/types/methods/m2m.d.ts.map +1 -0
  318. package/dist/types/methods/oauth2-factory.d.ts +133 -0
  319. package/dist/types/methods/oauth2-factory.d.ts.map +1 -0
  320. package/dist/types/methods/oauth2-generic.d.ts +75 -0
  321. package/dist/types/methods/oauth2-generic.d.ts.map +1 -0
  322. package/dist/types/methods/oidc-generic.d.ts +26 -0
  323. package/dist/types/methods/oidc-generic.d.ts.map +1 -0
  324. package/dist/types/methods/passkey.d.ts +106 -0
  325. package/dist/types/methods/passkey.d.ts.map +1 -0
  326. package/dist/types/methods/password-hash.d.ts +25 -0
  327. package/dist/types/methods/password-hash.d.ts.map +1 -0
  328. package/dist/types/methods/password.d.ts +70 -0
  329. package/dist/types/methods/password.d.ts.map +1 -0
  330. package/dist/types/methods/providers/apple.d.ts +29 -0
  331. package/dist/types/methods/providers/apple.d.ts.map +1 -0
  332. package/dist/types/methods/providers/cognito.d.ts +36 -0
  333. package/dist/types/methods/providers/cognito.d.ts.map +1 -0
  334. package/dist/types/methods/providers/discord.d.ts +22 -0
  335. package/dist/types/methods/providers/discord.d.ts.map +1 -0
  336. package/dist/types/methods/providers/facebook.d.ts +29 -0
  337. package/dist/types/methods/providers/facebook.d.ts.map +1 -0
  338. package/dist/types/methods/providers/github.d.ts +25 -0
  339. package/dist/types/methods/providers/github.d.ts.map +1 -0
  340. package/dist/types/methods/providers/google.d.ts +28 -0
  341. package/dist/types/methods/providers/google.d.ts.map +1 -0
  342. package/dist/types/methods/providers/index.d.ts +24 -0
  343. package/dist/types/methods/providers/index.d.ts.map +1 -0
  344. package/dist/types/methods/providers/jumpcloud.d.ts +22 -0
  345. package/dist/types/methods/providers/jumpcloud.d.ts.map +1 -0
  346. package/dist/types/methods/providers/keycloak.d.ts +30 -0
  347. package/dist/types/methods/providers/keycloak.d.ts.map +1 -0
  348. package/dist/types/methods/providers/linkedin.d.ts +22 -0
  349. package/dist/types/methods/providers/linkedin.d.ts.map +1 -0
  350. package/dist/types/methods/providers/microsoft.d.ts +30 -0
  351. package/dist/types/methods/providers/microsoft.d.ts.map +1 -0
  352. package/dist/types/methods/providers/slack.d.ts +25 -0
  353. package/dist/types/methods/providers/slack.d.ts.map +1 -0
  354. package/dist/types/methods/providers/spotify.d.ts +22 -0
  355. package/dist/types/methods/providers/spotify.d.ts.map +1 -0
  356. package/dist/types/methods/providers/twitch.d.ts +23 -0
  357. package/dist/types/methods/providers/twitch.d.ts.map +1 -0
  358. package/dist/types/methods/providers/x.d.ts +25 -0
  359. package/dist/types/methods/providers/x.d.ts.map +1 -0
  360. package/dist/types/methods/providers/yahoo.d.ts +22 -0
  361. package/dist/types/methods/providers/yahoo.d.ts.map +1 -0
  362. package/dist/types/pkce.d.ts +1 -2
  363. package/dist/types/pkce.d.ts.map +1 -1
  364. package/dist/types/ports/audit-log.d.ts +139 -0
  365. package/dist/types/ports/audit-log.d.ts.map +1 -0
  366. package/dist/types/ports/config-store.d.ts +32 -0
  367. package/dist/types/ports/config-store.d.ts.map +1 -0
  368. package/dist/types/ports/key-store.d.ts +98 -0
  369. package/dist/types/ports/key-store.d.ts.map +1 -0
  370. package/dist/types/ports/method-store.d.ts +29 -0
  371. package/dist/types/ports/method-store.d.ts.map +1 -0
  372. package/dist/types/ports/session-store.d.ts +82 -0
  373. package/dist/types/ports/session-store.d.ts.map +1 -0
  374. package/dist/types/ports/token-store.d.ts +93 -0
  375. package/dist/types/ports/token-store.d.ts.map +1 -0
  376. package/dist/types/types/authorization.d.ts +52 -0
  377. package/dist/types/types/authorization.d.ts.map +1 -0
  378. package/dist/types/types/error.d.ts +92 -0
  379. package/dist/types/types/error.d.ts.map +1 -0
  380. package/dist/types/types/flow.d.ts +87 -0
  381. package/dist/types/types/flow.d.ts.map +1 -0
  382. package/dist/types/types/idp.d.ts +234 -0
  383. package/dist/types/types/idp.d.ts.map +1 -0
  384. package/dist/types/types/method.d.ts +256 -0
  385. package/dist/types/types/method.d.ts.map +1 -0
  386. package/dist/types/types/picker.d.ts +31 -0
  387. package/dist/types/types/picker.d.ts.map +1 -0
  388. package/dist/types/types/result.d.ts +29 -0
  389. package/dist/types/types/result.d.ts.map +1 -0
  390. package/dist/types/types/subject.d.ts +47 -0
  391. package/dist/types/types/subject.d.ts.map +1 -0
  392. package/dist/types/types/tenant.d.ts +239 -0
  393. package/dist/types/types/tenant.d.ts.map +1 -0
  394. package/dist/types/types/token.d.ts +103 -0
  395. package/dist/types/types/token.d.ts.map +1 -0
  396. package/dist/types/ui/forms.d.ts +35 -0
  397. package/dist/types/ui/forms.d.ts.map +1 -0
  398. package/dist/types/ui/index.d.ts +14 -0
  399. package/dist/types/ui/index.d.ts.map +1 -0
  400. package/dist/types/ui/picker.d.ts +18 -0
  401. package/dist/types/ui/picker.d.ts.map +1 -0
  402. package/package.json +41 -6
  403. package/src/adapters/d1/audit-log.ts +32 -0
  404. package/src/adapters/d1/config-store.ts +67 -0
  405. package/src/adapters/d1/index.ts +41 -0
  406. package/src/adapters/d1/key-store.ts +218 -0
  407. package/src/adapters/d1/method-store.ts +103 -0
  408. package/src/adapters/d1/migrations.ts +89 -0
  409. package/src/adapters/d1/session-store.ts +230 -0
  410. package/src/adapters/d1/session.ts +38 -0
  411. package/src/adapters/d1/token-store.ts +251 -0
  412. package/src/adapters/d1/types.ts +53 -0
  413. package/src/adapters/durable-object/index.ts +23 -0
  414. package/src/adapters/durable-object/session-store.ts +227 -0
  415. package/src/adapters/durable-object/types.ts +25 -0
  416. package/src/adapters/dynamo/audit-log.ts +35 -0
  417. package/src/adapters/dynamo/client.ts +118 -0
  418. package/src/adapters/dynamo/config-store.ts +72 -0
  419. package/src/adapters/dynamo/index.ts +81 -0
  420. package/src/adapters/dynamo/key-store.ts +267 -0
  421. package/src/adapters/dynamo/method-store.ts +105 -0
  422. package/src/adapters/dynamo/passkey-credential-store.ts +132 -0
  423. package/src/adapters/dynamo/sdk.ts +189 -0
  424. package/src/adapters/dynamo/session-store.ts +229 -0
  425. package/src/adapters/dynamo/token-store.ts +248 -0
  426. package/src/adapters/kms/in-memory-backing.ts +36 -0
  427. package/src/adapters/kms/index.ts +39 -0
  428. package/src/adapters/kms/key-store.ts +176 -0
  429. package/src/adapters/kms/sdk.ts +39 -0
  430. package/src/adapters/kms/types.ts +61 -0
  431. package/src/adapters/kv/audit-log.ts +40 -0
  432. package/src/adapters/kv/config-store.ts +63 -0
  433. package/src/adapters/kv/index.ts +20 -0
  434. package/src/adapters/kv/method-store.ts +98 -0
  435. package/src/adapters/kv/types.ts +26 -0
  436. package/src/adapters/memory/audit-log.ts +28 -0
  437. package/src/adapters/memory/clock.ts +7 -0
  438. package/src/adapters/memory/config-store.ts +41 -0
  439. package/src/adapters/memory/index.ts +26 -0
  440. package/src/adapters/memory/key-store.ts +102 -0
  441. package/src/adapters/memory/method-store.ts +75 -0
  442. package/src/adapters/memory/passkey-credential-store.ts +97 -0
  443. package/src/adapters/memory/session-store.ts +128 -0
  444. package/src/adapters/memory/token-store.ts +165 -0
  445. package/src/adapters/postgres/audit-log.ts +34 -0
  446. package/src/adapters/postgres/config-store.ts +72 -0
  447. package/src/adapters/postgres/executor.ts +76 -0
  448. package/src/adapters/postgres/index.ts +60 -0
  449. package/src/adapters/postgres/key-store.ts +334 -0
  450. package/src/adapters/postgres/method-store.ts +104 -0
  451. package/src/adapters/postgres/migrations.ts +131 -0
  452. package/src/adapters/postgres/passkey-credential-store.ts +150 -0
  453. package/src/adapters/postgres/session-store.ts +216 -0
  454. package/src/adapters/postgres/token-store.ts +263 -0
  455. package/src/client.ts +50 -16
  456. package/src/domain/audit.ts +28 -0
  457. package/src/domain/authorize.ts +405 -0
  458. package/src/domain/callback.ts +263 -0
  459. package/src/domain/client-auth.ts +116 -0
  460. package/src/domain/client-credentials.ts +178 -0
  461. package/src/domain/crypto.ts +168 -0
  462. package/src/domain/discovery.ts +83 -0
  463. package/src/domain/introspect.ts +145 -0
  464. package/src/domain/jwt.ts +106 -0
  465. package/src/domain/method-cache.ts +220 -0
  466. package/src/domain/method-dispatch.ts +95 -0
  467. package/src/domain/method-route.ts +208 -0
  468. package/src/domain/pkce.ts +37 -0
  469. package/src/domain/refresh.ts +169 -0
  470. package/src/domain/revoke.ts +161 -0
  471. package/src/domain/state-envelope.ts +142 -0
  472. package/src/domain/token-exchange.ts +232 -0
  473. package/src/domain/token.ts +357 -0
  474. package/src/domain/userinfo.ts +56 -0
  475. package/src/http/context.ts +86 -0
  476. package/src/http/cookies.ts +167 -0
  477. package/src/http/errors.ts +98 -0
  478. package/src/http/handlers/authorize.ts +221 -0
  479. package/src/http/handlers/callback.ts +77 -0
  480. package/src/http/handlers/metadata.ts +44 -0
  481. package/src/http/handlers/method-route.ts +115 -0
  482. package/src/http/handlers/revocation.ts +151 -0
  483. package/src/http/handlers/token.ts +244 -0
  484. package/src/http/handlers/userinfo.ts +66 -0
  485. package/src/http/middleware/error.ts +26 -0
  486. package/src/http/middleware/tenant.ts +165 -0
  487. package/src/http/resolver.ts +34 -0
  488. package/src/http/router.ts +66 -0
  489. package/src/http/schemas/authorize.ts +58 -0
  490. package/src/http/schemas/revocation.ts +23 -0
  491. package/src/http/schemas/token.ts +85 -0
  492. package/src/index.ts +266 -20
  493. package/src/methods/code.ts +359 -0
  494. package/src/methods/m2m.ts +82 -0
  495. package/src/methods/oauth2-factory.ts +151 -0
  496. package/src/methods/oauth2-generic.ts +360 -0
  497. package/src/methods/oidc-generic.ts +109 -0
  498. package/src/methods/passkey.ts +419 -0
  499. package/src/methods/password-hash.ts +134 -0
  500. package/src/methods/password.ts +298 -0
  501. package/src/methods/providers/apple.ts +42 -0
  502. package/src/methods/providers/cognito.ts +55 -0
  503. package/src/methods/providers/discord.ts +37 -0
  504. package/src/methods/providers/facebook.ts +54 -0
  505. package/src/methods/providers/github.ts +42 -0
  506. package/src/methods/providers/google.ts +43 -0
  507. package/src/methods/providers/index.ts +23 -0
  508. package/src/methods/providers/jumpcloud.ts +36 -0
  509. package/src/methods/providers/keycloak.ts +42 -0
  510. package/src/methods/providers/linkedin.ts +37 -0
  511. package/src/methods/providers/microsoft.ts +42 -0
  512. package/src/methods/providers/slack.ts +42 -0
  513. package/src/methods/providers/spotify.ts +37 -0
  514. package/src/methods/providers/twitch.ts +38 -0
  515. package/src/methods/providers/x.ts +40 -0
  516. package/src/methods/providers/yahoo.ts +36 -0
  517. package/src/pkce.ts +20 -21
  518. package/src/ports/CONSISTENCY.md +88 -0
  519. package/src/ports/audit-log.ts +148 -0
  520. package/src/ports/config-store.ts +34 -0
  521. package/src/ports/key-store.ts +106 -0
  522. package/src/ports/method-store.ts +41 -0
  523. package/src/ports/session-store.ts +98 -0
  524. package/src/ports/token-store.ts +103 -0
  525. package/src/types/authorization.ts +53 -0
  526. package/src/types/error.ts +123 -0
  527. package/src/types/flow.ts +89 -0
  528. package/src/types/idp.ts +269 -0
  529. package/src/types/method.ts +270 -0
  530. package/src/types/picker.ts +32 -0
  531. package/src/types/result.ts +23 -0
  532. package/src/types/subject.ts +50 -0
  533. package/src/types/tenant.ts +248 -0
  534. package/src/types/token.ts +101 -0
  535. package/src/ui/forms.ts +289 -0
  536. package/src/ui/index.ts +14 -0
  537. package/src/ui/picker.ts +63 -0
  538. package/dist/esm/issuer.js +0 -691
  539. package/dist/esm/jwt.js +0 -16
  540. package/dist/esm/keys.js +0 -113
  541. package/dist/esm/provider/apple.js +0 -28
  542. package/dist/esm/provider/arctic.js +0 -43
  543. package/dist/esm/provider/code.js +0 -58
  544. package/dist/esm/provider/cognito.js +0 -16
  545. package/dist/esm/provider/discord.js +0 -15
  546. package/dist/esm/provider/facebook.js +0 -24
  547. package/dist/esm/provider/github.js +0 -15
  548. package/dist/esm/provider/google.js +0 -25
  549. package/dist/esm/provider/index.js +0 -3
  550. package/dist/esm/provider/jumpcloud.js +0 -15
  551. package/dist/esm/provider/keycloak.js +0 -15
  552. package/dist/esm/provider/linkedin.js +0 -15
  553. package/dist/esm/provider/m2m.js +0 -16
  554. package/dist/esm/provider/microsoft.js +0 -24
  555. package/dist/esm/provider/oauth2.js +0 -119
  556. package/dist/esm/provider/oidc.js +0 -69
  557. package/dist/esm/provider/passkey.js +0 -315
  558. package/dist/esm/provider/password.js +0 -306
  559. package/dist/esm/provider/provider.js +0 -10
  560. package/dist/esm/provider/slack.js +0 -15
  561. package/dist/esm/provider/spotify.js +0 -15
  562. package/dist/esm/provider/twitch.js +0 -15
  563. package/dist/esm/provider/x.js +0 -16
  564. package/dist/esm/provider/yahoo.js +0 -15
  565. package/dist/esm/random.js +0 -27
  566. package/dist/esm/storage/aws.js +0 -39
  567. package/dist/esm/storage/cloudflare.js +0 -42
  568. package/dist/esm/storage/dynamo.js +0 -116
  569. package/dist/esm/storage/memory.js +0 -88
  570. package/dist/esm/storage/storage.js +0 -36
  571. package/dist/esm/subject.js +0 -7
  572. package/dist/esm/ui/base.js +0 -407
  573. package/dist/esm/ui/code.js +0 -151
  574. package/dist/esm/ui/form.js +0 -43
  575. package/dist/esm/ui/icon.js +0 -92
  576. package/dist/esm/ui/passkey.js +0 -329
  577. package/dist/esm/ui/password.js +0 -338
  578. package/dist/esm/ui/select.js +0 -187
  579. package/dist/esm/ui/theme.js +0 -115
  580. package/dist/esm/util.js +0 -54
  581. package/dist/types/issuer.d.ts +0 -607
  582. package/dist/types/issuer.d.ts.map +0 -1
  583. package/dist/types/jwt.d.ts +0 -6
  584. package/dist/types/jwt.d.ts.map +0 -1
  585. package/dist/types/keys.d.ts +0 -18
  586. package/dist/types/keys.d.ts.map +0 -1
  587. package/dist/types/provider/apple.d.ts +0 -108
  588. package/dist/types/provider/apple.d.ts.map +0 -1
  589. package/dist/types/provider/arctic.d.ts +0 -16
  590. package/dist/types/provider/arctic.d.ts.map +0 -1
  591. package/dist/types/provider/code.d.ts +0 -74
  592. package/dist/types/provider/code.d.ts.map +0 -1
  593. package/dist/types/provider/cognito.d.ts +0 -64
  594. package/dist/types/provider/cognito.d.ts.map +0 -1
  595. package/dist/types/provider/discord.d.ts +0 -38
  596. package/dist/types/provider/discord.d.ts.map +0 -1
  597. package/dist/types/provider/facebook.d.ts +0 -74
  598. package/dist/types/provider/facebook.d.ts.map +0 -1
  599. package/dist/types/provider/github.d.ts +0 -38
  600. package/dist/types/provider/github.d.ts.map +0 -1
  601. package/dist/types/provider/google.d.ts +0 -74
  602. package/dist/types/provider/google.d.ts.map +0 -1
  603. package/dist/types/provider/index.d.ts +0 -4
  604. package/dist/types/provider/index.d.ts.map +0 -1
  605. package/dist/types/provider/jumpcloud.d.ts +0 -38
  606. package/dist/types/provider/jumpcloud.d.ts.map +0 -1
  607. package/dist/types/provider/keycloak.d.ts +0 -67
  608. package/dist/types/provider/keycloak.d.ts.map +0 -1
  609. package/dist/types/provider/linkedin.d.ts +0 -6
  610. package/dist/types/provider/linkedin.d.ts.map +0 -1
  611. package/dist/types/provider/m2m.d.ts +0 -34
  612. package/dist/types/provider/m2m.d.ts.map +0 -1
  613. package/dist/types/provider/microsoft.d.ts +0 -89
  614. package/dist/types/provider/microsoft.d.ts.map +0 -1
  615. package/dist/types/provider/oauth2.d.ts +0 -133
  616. package/dist/types/provider/oauth2.d.ts.map +0 -1
  617. package/dist/types/provider/oidc.d.ts +0 -91
  618. package/dist/types/provider/oidc.d.ts.map +0 -1
  619. package/dist/types/provider/passkey.d.ts +0 -143
  620. package/dist/types/provider/passkey.d.ts.map +0 -1
  621. package/dist/types/provider/password.d.ts +0 -210
  622. package/dist/types/provider/password.d.ts.map +0 -1
  623. package/dist/types/provider/provider.d.ts +0 -29
  624. package/dist/types/provider/provider.d.ts.map +0 -1
  625. package/dist/types/provider/slack.d.ts +0 -59
  626. package/dist/types/provider/slack.d.ts.map +0 -1
  627. package/dist/types/provider/spotify.d.ts +0 -38
  628. package/dist/types/provider/spotify.d.ts.map +0 -1
  629. package/dist/types/provider/twitch.d.ts +0 -38
  630. package/dist/types/provider/twitch.d.ts.map +0 -1
  631. package/dist/types/provider/x.d.ts +0 -38
  632. package/dist/types/provider/x.d.ts.map +0 -1
  633. package/dist/types/provider/yahoo.d.ts +0 -38
  634. package/dist/types/provider/yahoo.d.ts.map +0 -1
  635. package/dist/types/random.d.ts +0 -3
  636. package/dist/types/random.d.ts.map +0 -1
  637. package/dist/types/storage/aws.d.ts +0 -4
  638. package/dist/types/storage/aws.d.ts.map +0 -1
  639. package/dist/types/storage/cloudflare.d.ts +0 -34
  640. package/dist/types/storage/cloudflare.d.ts.map +0 -1
  641. package/dist/types/storage/dynamo.d.ts +0 -65
  642. package/dist/types/storage/dynamo.d.ts.map +0 -1
  643. package/dist/types/storage/memory.d.ts +0 -49
  644. package/dist/types/storage/memory.d.ts.map +0 -1
  645. package/dist/types/storage/storage.d.ts +0 -15
  646. package/dist/types/storage/storage.d.ts.map +0 -1
  647. package/dist/types/subject.d.ts +0 -122
  648. package/dist/types/subject.d.ts.map +0 -1
  649. package/dist/types/ui/base.d.ts +0 -5
  650. package/dist/types/ui/base.d.ts.map +0 -1
  651. package/dist/types/ui/code.d.ts +0 -104
  652. package/dist/types/ui/code.d.ts.map +0 -1
  653. package/dist/types/ui/form.d.ts +0 -6
  654. package/dist/types/ui/form.d.ts.map +0 -1
  655. package/dist/types/ui/icon.d.ts +0 -6
  656. package/dist/types/ui/icon.d.ts.map +0 -1
  657. package/dist/types/ui/passkey.d.ts +0 -5
  658. package/dist/types/ui/passkey.d.ts.map +0 -1
  659. package/dist/types/ui/password.d.ts +0 -139
  660. package/dist/types/ui/password.d.ts.map +0 -1
  661. package/dist/types/ui/select.d.ts +0 -55
  662. package/dist/types/ui/select.d.ts.map +0 -1
  663. package/dist/types/ui/theme.d.ts +0 -207
  664. package/dist/types/ui/theme.d.ts.map +0 -1
  665. package/dist/types/util.d.ts +0 -8
  666. package/dist/types/util.d.ts.map +0 -1
  667. package/src/css.d.ts +0 -4
  668. package/src/issuer.ts +0 -1628
  669. package/src/jwt.ts +0 -17
  670. package/src/keys.ts +0 -139
  671. package/src/provider/apple.ts +0 -127
  672. package/src/provider/arctic.ts +0 -66
  673. package/src/provider/code.ts +0 -227
  674. package/src/provider/cognito.ts +0 -74
  675. package/src/provider/discord.ts +0 -45
  676. package/src/provider/facebook.ts +0 -84
  677. package/src/provider/github.ts +0 -45
  678. package/src/provider/google.ts +0 -85
  679. package/src/provider/index.ts +0 -3
  680. package/src/provider/jumpcloud.ts +0 -45
  681. package/src/provider/keycloak.ts +0 -75
  682. package/src/provider/linkedin.ts +0 -12
  683. package/src/provider/m2m.ts +0 -56
  684. package/src/provider/microsoft.ts +0 -100
  685. package/src/provider/oauth2.ts +0 -297
  686. package/src/provider/oidc.ts +0 -179
  687. package/src/provider/passkey.ts +0 -655
  688. package/src/provider/password.ts +0 -672
  689. package/src/provider/provider.ts +0 -33
  690. package/src/provider/slack.ts +0 -67
  691. package/src/provider/spotify.ts +0 -45
  692. package/src/provider/twitch.ts +0 -45
  693. package/src/provider/x.ts +0 -46
  694. package/src/provider/yahoo.ts +0 -45
  695. package/src/random.ts +0 -24
  696. package/src/storage/aws.ts +0 -59
  697. package/src/storage/cloudflare.ts +0 -77
  698. package/src/storage/dynamo.ts +0 -193
  699. package/src/storage/memory.ts +0 -135
  700. package/src/storage/storage.ts +0 -46
  701. package/src/subject.ts +0 -130
  702. package/src/ui/base.tsx +0 -118
  703. package/src/ui/code.tsx +0 -215
  704. package/src/ui/form.tsx +0 -40
  705. package/src/ui/icon.tsx +0 -95
  706. package/src/ui/passkey.tsx +0 -321
  707. package/src/ui/password.tsx +0 -405
  708. package/src/ui/select.tsx +0 -221
  709. package/src/ui/theme.ts +0 -319
  710. package/src/ui/ui.css +0 -252
  711. package/src/util.ts +0 -58
  712. /package/dist/esm/{css.d.js → adapters/d1/types.js} +0 -0
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Sessions-API helper. Wraps a `D1Database` in a session pinned to the
3
+ * primary node for read-after-write consistency on security-critical paths.
4
+ *
5
+ * If the bundled `D1Database` lacks `withSession` (older runtime), the
6
+ * helper returns the plain `db` and the caller pays no Sessions-API cost
7
+ * (and gets eventual-consistency reads — documented in the adapter's
8
+ * top-level JSDoc).
9
+ */
10
+ import type {
11
+ AnyD1Database,
12
+ D1DatabaseSession,
13
+ D1DatabaseWithSessions,
14
+ } from "./types"
15
+
16
+ export function isSessionsCapable(
17
+ db: AnyD1Database,
18
+ ): db is D1DatabaseWithSessions {
19
+ return typeof (db as D1DatabaseWithSessions).withSession === "function"
20
+ }
21
+
22
+ /**
23
+ * Open a Sessions-API session pinned to the primary node. All `prepare` calls
24
+ * inside the session see the latest writes; bookmarks may be threaded across
25
+ * requests by the caller if needed.
26
+ */
27
+ export function primarySession(db: AnyD1Database): D1DatabaseSession {
28
+ if (isSessionsCapable(db)) {
29
+ return db.withSession("first-primary")
30
+ }
31
+ // Test shim / older runtime — fall back to the database itself, which
32
+ // exposes the same `prepare` / `batch` shape. `getBookmark` returns null.
33
+ return {
34
+ prepare: (q) => db.prepare(q),
35
+ batch: (s) => db.batch(s),
36
+ getBookmark: () => null,
37
+ }
38
+ }
@@ -0,0 +1,251 @@
1
+ /**
2
+ * D1 `TokenStore`. SQL-identical to the Postgres adapter except for SQLite
3
+ * dialect (`?N` binds, JSON-as-TEXT, BLOB) and the Sessions-API wrapping
4
+ * for read-after-write consistency.
5
+ *
6
+ * Every operation here is on the security-critical path and uses
7
+ * `primarySession(db)` so reads always see the latest write — per AD8 + the
8
+ * D1 read-replication caveat in `ports/CONSISTENCY.md`.
9
+ */
10
+ import { AUTH_CODE_TTL_MS } from "../../domain/authorize"
11
+ import type { KeyStore } from "../../ports/key-store"
12
+ import type { TokenStore } from "../../ports/token-store"
13
+ import { authError } from "../../types/error"
14
+ import type { Result } from "../../types/result"
15
+ import { err, ok } from "../../types/result"
16
+ import type { TenantId } from "../../types/tenant"
17
+ import type { RefreshTokenPayload } from "../../types/token"
18
+
19
+ import { primarySession } from "./session"
20
+ import type { AnyD1Database } from "./types"
21
+
22
+ export type D1TokenStoreOptions = {
23
+ db: AnyD1Database
24
+ /**
25
+ * Optional — retained for API stability after M1 moved code-payload
26
+ * encryption to the domain layer. The adapter no longer touches it.
27
+ */
28
+ keyStore?: KeyStore
29
+ clock?: () => number
30
+ }
31
+
32
+ export class D1TokenStore implements TokenStore {
33
+ #db: AnyD1Database
34
+ #clock: () => number
35
+
36
+ constructor(opts: D1TokenStoreOptions) {
37
+ this.#db = opts.db
38
+ this.#clock = opts.clock ?? (() => Date.now())
39
+ }
40
+
41
+ async saveCode(
42
+ code: string,
43
+ ciphertext: string,
44
+ ttl: number,
45
+ ): Promise<Result<void>> {
46
+ if (ttl <= 0 || ttl > AUTH_CODE_TTL_MS) {
47
+ return err(
48
+ authError.internalError(
49
+ `saveCode: ttl ${ttl} outside (0, ${AUTH_CODE_TTL_MS}] (auth-code TTL is fixed at 60s by OAuth 2.1 BCP)`,
50
+ ),
51
+ )
52
+ }
53
+ const expiresAt = this.#clock() + ttl
54
+ try {
55
+ await primarySession(this.#db)
56
+ .prepare(
57
+ `INSERT INTO openauth_codes (code, ciphertext, expires_at) VALUES (?1, ?2, ?3)`,
58
+ )
59
+ .bind(code, ciphertext, expiresAt)
60
+ .run()
61
+ } catch (e) {
62
+ return err(authError.internalError("saveCode: insert failed", e))
63
+ }
64
+ return ok(undefined)
65
+ }
66
+
67
+ async consumeCode(code: string): Promise<Result<string>> {
68
+ let row: { ciphertext: string; expires_at: number } | null
69
+ try {
70
+ row = await primarySession(this.#db)
71
+ .prepare(
72
+ `DELETE FROM openauth_codes WHERE code = ?1 RETURNING ciphertext, expires_at`,
73
+ )
74
+ .bind(code)
75
+ .first<{ ciphertext: string; expires_at: number }>()
76
+ } catch (e) {
77
+ return err(authError.internalError("consumeCode: query failed", e))
78
+ }
79
+ if (!row) {
80
+ return err(
81
+ authError.invalidGrant("auth code unknown or already consumed"),
82
+ )
83
+ }
84
+ if (this.#clock() >= Number(row.expires_at)) {
85
+ return err(authError.invalidGrant("auth code expired"))
86
+ }
87
+ return ok(row.ciphertext)
88
+ }
89
+
90
+ async saveRefresh(
91
+ refresh: string,
92
+ payload: RefreshTokenPayload,
93
+ ): Promise<Result<void>> {
94
+ try {
95
+ await primarySession(this.#db)
96
+ .prepare(
97
+ `INSERT INTO openauth_refresh_tokens
98
+ (token, tenant_id, client_id, subject_id, family, expires_at, payload)
99
+ VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)`,
100
+ )
101
+ .bind(
102
+ refresh,
103
+ payload.tenantId,
104
+ payload.clientId,
105
+ payload.subjectId,
106
+ payload.family,
107
+ payload.expiresAt,
108
+ JSON.stringify(payload),
109
+ )
110
+ .run()
111
+ } catch (e) {
112
+ return err(authError.internalError("saveRefresh: insert failed", e))
113
+ }
114
+ return ok(undefined)
115
+ }
116
+
117
+ async consumeRefresh(
118
+ refresh: string,
119
+ options: { reuseWindowMs?: number } = {},
120
+ ): Promise<Result<RefreshTokenPayload>> {
121
+ const reuseWindow = options.reuseWindowMs ?? 60_000
122
+ const now = this.#clock()
123
+ const session = primarySession(this.#db)
124
+ // Atomic claim — SQLite's UPDATE ... RETURNING is available from 3.35
125
+ // (D1 ships much newer). One row out means we won the race.
126
+ let claimed: { payload: string } | null
127
+ try {
128
+ claimed = await session
129
+ .prepare(
130
+ `UPDATE openauth_refresh_tokens
131
+ SET consumed_at = ?1
132
+ WHERE token = ?2
133
+ AND consumed_at IS NULL
134
+ AND expires_at > ?1
135
+ RETURNING payload`,
136
+ )
137
+ .bind(now, refresh)
138
+ .first<{ payload: string }>()
139
+ } catch (e) {
140
+ return err(authError.internalError("consumeRefresh: claim failed", e))
141
+ }
142
+ if (claimed) {
143
+ return ok(parseRefresh(claimed.payload))
144
+ }
145
+ // No claim — figure out why.
146
+ let existing: {
147
+ consumed_at: number | null
148
+ expires_at: number
149
+ payload: string
150
+ } | null
151
+ try {
152
+ existing = await session
153
+ .prepare(
154
+ `SELECT consumed_at, expires_at, payload
155
+ FROM openauth_refresh_tokens
156
+ WHERE token = ?1`,
157
+ )
158
+ .bind(refresh)
159
+ .first<{
160
+ consumed_at: number | null
161
+ expires_at: number
162
+ payload: string
163
+ }>()
164
+ } catch (e) {
165
+ return err(authError.internalError("consumeRefresh: lookup failed", e))
166
+ }
167
+ if (!existing) {
168
+ return err(authError.invalidGrant("refresh token unknown"))
169
+ }
170
+ if (existing.consumed_at !== null && existing.consumed_at !== undefined) {
171
+ const consumedAt = Number(existing.consumed_at)
172
+ const withinWindow = now - consumedAt <= reuseWindow
173
+ if (withinWindow) {
174
+ const payload = parseRefresh(existing.payload)
175
+ await this.revokeFamily(payload.family)
176
+ return err(
177
+ authError.invalidGrant(
178
+ `refresh token reuse detected (family=${payload.family})`,
179
+ {
180
+ family: payload.family,
181
+ tenantId: payload.tenantId,
182
+ subjectId: payload.subjectId,
183
+ },
184
+ ),
185
+ )
186
+ }
187
+ return err(authError.invalidGrant("refresh token already consumed"))
188
+ }
189
+ if (now >= Number(existing.expires_at)) {
190
+ return err(authError.invalidGrant("refresh token expired"))
191
+ }
192
+ return err(authError.internalError("consumeRefresh: unexplained miss"))
193
+ }
194
+
195
+ async peekRefresh(refresh: string): Promise<Result<RefreshTokenPayload>> {
196
+ let row: { expires_at: number; payload: string } | null
197
+ try {
198
+ row = await primarySession(this.#db)
199
+ .prepare(
200
+ `SELECT expires_at, payload
201
+ FROM openauth_refresh_tokens
202
+ WHERE token = ?1`,
203
+ )
204
+ .bind(refresh)
205
+ .first<{ expires_at: number; payload: string }>()
206
+ } catch (e) {
207
+ return err(authError.internalError("peekRefresh: lookup failed", e))
208
+ }
209
+ if (!row) {
210
+ return err(authError.invalidGrant("refresh token unknown"))
211
+ }
212
+ if (this.#clock() >= Number(row.expires_at)) {
213
+ return err(authError.invalidGrant("refresh token expired"))
214
+ }
215
+ return ok(parseRefresh(row.payload))
216
+ }
217
+
218
+ async revokeFamily(family: string): Promise<Result<void>> {
219
+ try {
220
+ await primarySession(this.#db)
221
+ .prepare(`DELETE FROM openauth_refresh_tokens WHERE family = ?1`)
222
+ .bind(family)
223
+ .run()
224
+ } catch (e) {
225
+ return err(authError.internalError("revokeFamily: delete failed", e))
226
+ }
227
+ return ok(undefined)
228
+ }
229
+
230
+ async revokeBySubject(
231
+ tenantId: TenantId,
232
+ subjectId: string,
233
+ ): Promise<Result<void>> {
234
+ try {
235
+ await primarySession(this.#db)
236
+ .prepare(
237
+ `DELETE FROM openauth_refresh_tokens WHERE tenant_id = ?1 AND subject_id = ?2`,
238
+ )
239
+ .bind(tenantId, subjectId)
240
+ .run()
241
+ } catch (e) {
242
+ return err(authError.internalError("revokeBySubject: delete failed", e))
243
+ }
244
+ return ok(undefined)
245
+ }
246
+ }
247
+
248
+ function parseRefresh(raw: string | RefreshTokenPayload): RefreshTokenPayload {
249
+ if (typeof raw === "string") return JSON.parse(raw) as RefreshTokenPayload
250
+ return raw
251
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * D1 type extensions.
3
+ *
4
+ * `@cloudflare/workers-types` < 2024-12 does not yet expose the D1 Sessions
5
+ * API on its `D1Database` class. We declare the augmentation locally and
6
+ * feature-detect at runtime: if `db.withSession` is a function the adapter
7
+ * uses it for read-after-write consistency on the security-critical paths;
8
+ * otherwise it falls back to plain `prepare`. This keeps the adapter
9
+ * type-safe today and forward-compatible when the workers-types release
10
+ * catches up.
11
+ */
12
+ import type {
13
+ D1Database,
14
+ D1PreparedStatement,
15
+ D1Result,
16
+ } from "@cloudflare/workers-types"
17
+
18
+ /**
19
+ * D1 Sessions API constraints. Documented at
20
+ * <https://developers.cloudflare.com/d1/best-practices/read-replication/>.
21
+ * - `"first-primary"` — pin the session to the primary node. All reads see
22
+ * the latest write. Used for security-critical paths.
23
+ * - `"first-unconstrained"` — pin to whichever node responds first. Lower
24
+ * latency, eventual consistency. Used for JWKS / config reads.
25
+ */
26
+ export type D1SessionConstraint = "first-primary" | "first-unconstrained"
27
+
28
+ /** A session bookmark — opaque token returned by `getBookmark()`. */
29
+ export type D1SessionBookmark = string
30
+
31
+ /** Minimal shape we use from `D1DatabaseSession`. */
32
+ export type D1DatabaseSession = {
33
+ prepare(query: string): D1PreparedStatement
34
+ batch<T = unknown>(statements: D1PreparedStatement[]): Promise<D1Result<T>[]>
35
+ getBookmark(): D1SessionBookmark | null
36
+ }
37
+
38
+ /**
39
+ * `D1Database` with the Sessions API. Use this type at the adapter boundary;
40
+ * the runtime feature-detects `withSession` so consumers can still pass a
41
+ * plain `D1Database` if Sessions is unavailable in their environment.
42
+ */
43
+ export type D1DatabaseWithSessions = D1Database & {
44
+ withSession(
45
+ constraintOrBookmark?: D1SessionConstraint | D1SessionBookmark,
46
+ ): D1DatabaseSession
47
+ }
48
+
49
+ /**
50
+ * Either a real D1Database or our test shim. Feature detection happens at
51
+ * call time so the adapter still works against both.
52
+ */
53
+ export type AnyD1Database = D1Database | D1DatabaseWithSessions
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Cloudflare Durable Objects adapters.
3
+ *
4
+ * Durable Objects are an excellent fit for `SessionStore` (flow records)
5
+ * because every operation on a single DO instance is serialized — atomic
6
+ * delete-on-read comes for free with `storage.transaction`. Per
7
+ * `ports/CONSISTENCY.md`, DOs are also acceptable for `TokenStore` in
8
+ * deployments that don't run D1.
9
+ *
10
+ * The adapter is supplied a `DurableObjectStorage` directly (`this.ctx.storage`
11
+ * from inside a DO class). Users wire their own DO class around the adapter
12
+ * and forward RPC / fetch calls to the methods. See the JSDoc on
13
+ * `DurableObjectSessionStore` for the canonical wiring pattern.
14
+ */
15
+ export {
16
+ DurableObjectSessionStore,
17
+ type DurableObjectSessionStoreOptions,
18
+ } from "./session-store"
19
+
20
+ export type {
21
+ DurableObjectStorageLike,
22
+ DurableObjectTransactionLike,
23
+ } from "./types"
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Durable Objects `SessionStore`. Per `ports/CONSISTENCY.md`, DOs are an
3
+ * acceptable backing store for `SessionStore` (and optionally `TokenStore`)
4
+ * because every operation on a single DO instance is serialized — atomic
5
+ * delete-on-read comes for free with `storage.transaction`.
6
+ *
7
+ * Wiring pattern: the adapter accepts a `DurableObjectStorage` reference,
8
+ * which the user supplies from inside their own DO class (`this.ctx.storage`).
9
+ * The user is responsible for routing requests to the right DO instance —
10
+ * typically one DO per flow-id (`namespace.idFromName(flowId)`), which keeps
11
+ * the per-flow state co-located and serialized.
12
+ *
13
+ * @example
14
+ * // Worker module export
15
+ * export class IdpSessionDO {
16
+ * constructor(ctx) {
17
+ * this.store = new DurableObjectSessionStore({ storage: ctx.storage })
18
+ * }
19
+ * async fetch(req) {
20
+ * const { op, args } = await req.json()
21
+ * const result = await (this.store as any)[op](...args)
22
+ * return Response.json(result)
23
+ * }
24
+ * }
25
+ *
26
+ * // Caller — round-trips through fetch
27
+ * const stub = env.IDP_SESSIONS.get(env.IDP_SESSIONS.idFromName(flowId))
28
+ * await stub.fetch("https://internal/", {
29
+ * method: "POST",
30
+ * body: JSON.stringify({ op: "consumeFlow", args: [flowId] }),
31
+ * })
32
+ */
33
+ import { authError } from "../../types/error"
34
+ import type { FlowRecord } from "../../types/flow"
35
+ import type { SessionRecord, SessionStore } from "../../ports/session-store"
36
+ import type { Result } from "../../types/result"
37
+ import { err, ok } from "../../types/result"
38
+
39
+ import type {
40
+ DurableObjectStorageLike,
41
+ DurableObjectTransactionLike,
42
+ } from "./types"
43
+
44
+ type StoredFlow = {
45
+ record: FlowRecord
46
+ expiresAt: number
47
+ }
48
+
49
+ type StoredSession = {
50
+ record: SessionRecord
51
+ expiresAt: number
52
+ }
53
+
54
+ export type DurableObjectSessionStoreOptions = {
55
+ storage: DurableObjectStorageLike
56
+ clock?: () => number
57
+ }
58
+
59
+ export class DurableObjectSessionStore implements SessionStore {
60
+ #storage: DurableObjectStorageLike
61
+ #clock: () => number
62
+
63
+ constructor(opts: DurableObjectSessionStoreOptions) {
64
+ this.#storage = opts.storage
65
+ this.#clock = opts.clock ?? (() => Date.now())
66
+ }
67
+
68
+ async saveFlow(
69
+ flowId: string,
70
+ payload: FlowRecord,
71
+ ttl: number,
72
+ ): Promise<Result<void>> {
73
+ if (ttl <= 0) {
74
+ return err(
75
+ authError.internalError(`saveFlow: ttl must be positive, got ${ttl}`),
76
+ )
77
+ }
78
+ const stored: StoredFlow = {
79
+ record: payload,
80
+ expiresAt: this.#clock() + ttl,
81
+ }
82
+ try {
83
+ await this.#storage.put(flowKey(flowId), stored)
84
+ } catch (e) {
85
+ return err(authError.internalError("saveFlow: put failed", e))
86
+ }
87
+ return ok(undefined)
88
+ }
89
+
90
+ async updateFlowMethodState(
91
+ flowId: string,
92
+ methodState: unknown,
93
+ ): Promise<Result<void>> {
94
+ const now = this.#clock()
95
+ try {
96
+ // Transaction so the read-then-write is atomic against concurrent
97
+ // consumers on the same DO.
98
+ const outcome = await this.#storage.transaction(async (txn) => {
99
+ const existing = await txn.get<StoredFlow>(flowKey(flowId))
100
+ if (!existing) return "unknown" as const
101
+ if (now >= existing.expiresAt) return "expired" as const
102
+ await txn.put(flowKey(flowId), {
103
+ record: { ...existing.record, methodState },
104
+ expiresAt: existing.expiresAt,
105
+ })
106
+ return "ok" as const
107
+ })
108
+ if (outcome === "unknown")
109
+ return err(authError.unknownState(`flow "${flowId}" unknown`))
110
+ if (outcome === "expired")
111
+ return err(authError.unknownState(`flow "${flowId}" expired`))
112
+ } catch (e) {
113
+ return err(
114
+ authError.internalError("updateFlowMethodState: transaction failed", e),
115
+ )
116
+ }
117
+ return ok(undefined)
118
+ }
119
+
120
+ async readFlow(flowId: string): Promise<Result<FlowRecord>> {
121
+ let stored: StoredFlow | undefined
122
+ try {
123
+ stored = await this.#storage.get<StoredFlow>(flowKey(flowId))
124
+ } catch (e) {
125
+ return err(authError.internalError("readFlow: get failed", e))
126
+ }
127
+ if (!stored) {
128
+ return err(authError.unknownState(`flow "${flowId}" unknown`))
129
+ }
130
+ if (this.#clock() >= stored.expiresAt) {
131
+ try {
132
+ await this.#storage.delete(flowKey(flowId))
133
+ } catch {}
134
+ return err(authError.unknownState(`flow "${flowId}" expired`))
135
+ }
136
+ return ok(stored.record)
137
+ }
138
+
139
+ async consumeFlow(flowId: string): Promise<Result<FlowRecord>> {
140
+ let result:
141
+ | { kind: "miss" }
142
+ | { kind: "expired" }
143
+ | { kind: "hit"; record: FlowRecord }
144
+ try {
145
+ result = await this.#storage.transaction(async (txn) => {
146
+ const stored = await txn.get<StoredFlow>(flowKey(flowId))
147
+ if (!stored) return { kind: "miss" as const }
148
+ // Delete first to enforce single-winner semantics — any other caller
149
+ // racing on the same flowId will see the key gone on its read.
150
+ await txn.delete(flowKey(flowId))
151
+ if (this.#clock() >= stored.expiresAt) {
152
+ return { kind: "expired" as const }
153
+ }
154
+ return { kind: "hit" as const, record: stored.record }
155
+ })
156
+ } catch (e) {
157
+ return err(authError.internalError("consumeFlow: transaction failed", e))
158
+ }
159
+ if (result.kind === "miss") {
160
+ return err(
161
+ authError.unknownState(`flow "${flowId}" unknown or already consumed`),
162
+ )
163
+ }
164
+ if (result.kind === "expired") {
165
+ return err(authError.unknownState(`flow "${flowId}" expired`))
166
+ }
167
+ return ok(result.record)
168
+ }
169
+
170
+ async createSession(
171
+ sessionId: string,
172
+ payload: SessionRecord,
173
+ ttl: number,
174
+ ): Promise<Result<void>> {
175
+ if (ttl <= 0) {
176
+ return err(
177
+ authError.internalError(
178
+ `createSession: ttl must be positive, got ${ttl}`,
179
+ ),
180
+ )
181
+ }
182
+ const stored: StoredSession = {
183
+ record: payload,
184
+ expiresAt: this.#clock() + ttl,
185
+ }
186
+ try {
187
+ await this.#storage.put(sessionKey(sessionId), stored)
188
+ } catch (e) {
189
+ return err(authError.internalError("createSession: put failed", e))
190
+ }
191
+ return ok(undefined)
192
+ }
193
+
194
+ async readSession(sessionId: string): Promise<Result<SessionRecord>> {
195
+ let stored: StoredSession | undefined
196
+ try {
197
+ stored = await this.#storage.get<StoredSession>(sessionKey(sessionId))
198
+ } catch (e) {
199
+ return err(authError.internalError("readSession: get failed", e))
200
+ }
201
+ if (!stored) {
202
+ return err(authError.invalidRequest(`session "${sessionId}" unknown`))
203
+ }
204
+ if (this.#clock() >= stored.expiresAt) {
205
+ try {
206
+ await this.#storage.delete(sessionKey(sessionId))
207
+ } catch {}
208
+ return err(authError.invalidRequest(`session "${sessionId}" expired`))
209
+ }
210
+ return ok(stored.record)
211
+ }
212
+
213
+ async revokeSession(sessionId: string): Promise<Result<void>> {
214
+ try {
215
+ await this.#storage.delete(sessionKey(sessionId))
216
+ } catch (e) {
217
+ return err(authError.internalError("revokeSession: delete failed", e))
218
+ }
219
+ return ok(undefined)
220
+ }
221
+ }
222
+
223
+ const flowKey = (flowId: string) => `flow:${flowId}`
224
+ const sessionKey = (sessionId: string) => `session:${sessionId}`
225
+
226
+ // Re-exported for adapter users wiring `storage.transaction` callbacks.
227
+ export type { DurableObjectStorageLike, DurableObjectTransactionLike }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Minimal `DurableObjectStorage` shape the adapter depends on. Defined
3
+ * locally so the adapter is testable without a real Workers runtime and so
4
+ * it stays compatible with both legacy and current versions of
5
+ * `@cloudflare/workers-types`.
6
+ *
7
+ * Real `DurableObjectStorage` instances satisfy this interface — pass
8
+ * `this.ctx.storage` directly.
9
+ */
10
+ export type DurableObjectTransactionLike = {
11
+ get<T>(key: string): Promise<T | undefined>
12
+ put<T>(key: string, value: T): Promise<void>
13
+ delete(key: string): Promise<boolean>
14
+ }
15
+
16
+ export type DurableObjectStorageLike = DurableObjectTransactionLike & {
17
+ /**
18
+ * Run a closure atomically. On any DO, all operations within `closure`
19
+ * see a consistent snapshot of storage; the closure's return value is
20
+ * resolved after the writes are durable.
21
+ */
22
+ transaction<T>(
23
+ closure: (txn: DurableObjectTransactionLike) => Promise<T>,
24
+ ): Promise<T>
25
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * DynamoDB `AuditLog`. `pk="audit"`, `sk="<paddedTs>:<rand>"` so a Query
3
+ * pulls events in insertion order. As with all `AuditLog` adapters, `log()`
4
+ * never throws — durability failures are swallowed so the IdP's hot paths
5
+ * are not gated on the log.
6
+ */
7
+ import type { AuditEvent, AuditLog } from "../../ports/audit-log"
8
+
9
+ import type { DynamoExecutor } from "./client"
10
+
11
+ export type DynamoAuditLogOptions = {
12
+ exec: DynamoExecutor
13
+ }
14
+
15
+ export class DynamoAuditLog implements AuditLog {
16
+ #exec: DynamoExecutor
17
+
18
+ constructor(opts: DynamoAuditLogOptions) {
19
+ this.#exec = opts.exec
20
+ }
21
+
22
+ async log(event: AuditEvent & { timestamp: number }): Promise<void> {
23
+ const padded = String(event.timestamp).padStart(16, "0")
24
+ const suffix = Math.random().toString(36).slice(2, 10)
25
+ try {
26
+ await this.#exec.put({
27
+ item: {
28
+ pk: "audit",
29
+ sk: `${padded}:${suffix}`,
30
+ payload: JSON.stringify(event),
31
+ },
32
+ })
33
+ } catch {}
34
+ }
35
+ }