@_mustachio/openauth 0.9.2 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (756) hide show
  1. package/dist/esm/adapters/d1/audit-log.js +15 -0
  2. package/dist/esm/adapters/d1/config-store.js +45 -0
  3. package/dist/esm/adapters/d1/index.js +12 -0
  4. package/dist/esm/adapters/d1/key-store.js +116 -0
  5. package/dist/esm/adapters/d1/method-store.js +52 -0
  6. package/dist/esm/adapters/d1/migrations.js +77 -0
  7. package/dist/esm/adapters/d1/session-store.js +134 -0
  8. package/dist/esm/adapters/d1/session.js +18 -0
  9. package/dist/esm/adapters/d1/token-store.js +140 -0
  10. package/dist/esm/adapters/durable-object/index.js +3 -0
  11. package/dist/esm/adapters/durable-object/session-store.js +139 -0
  12. package/dist/esm/adapters/durable-object/types.js +0 -0
  13. package/dist/esm/adapters/dynamo/audit-log.js +23 -0
  14. package/dist/esm/adapters/dynamo/client.js +0 -0
  15. package/dist/esm/adapters/dynamo/config-store.js +57 -0
  16. package/dist/esm/adapters/dynamo/index.js +10 -0
  17. package/dist/esm/adapters/dynamo/key-store.js +188 -0
  18. package/dist/esm/adapters/dynamo/method-store.js +72 -0
  19. package/dist/esm/adapters/dynamo/passkey-credential-store.js +83 -0
  20. package/dist/esm/adapters/dynamo/sdk.js +128 -0
  21. package/dist/esm/adapters/dynamo/session-store.js +173 -0
  22. package/dist/esm/adapters/dynamo/token-store.js +178 -0
  23. package/dist/esm/adapters/kms/in-memory-backing.js +28 -0
  24. package/dist/esm/adapters/kms/index.js +5 -0
  25. package/dist/esm/adapters/kms/key-store.js +129 -0
  26. package/dist/esm/adapters/kms/sdk.js +23 -0
  27. package/dist/esm/adapters/kms/types.js +0 -0
  28. package/dist/esm/adapters/kv/audit-log.js +21 -0
  29. package/dist/esm/adapters/kv/config-store.js +43 -0
  30. package/dist/esm/adapters/kv/index.js +5 -0
  31. package/dist/esm/adapters/kv/method-store.js +63 -0
  32. package/dist/esm/adapters/kv/types.js +0 -0
  33. package/dist/esm/adapters/memory/audit-log.js +16 -0
  34. package/dist/esm/adapters/memory/clock.js +5 -0
  35. package/dist/esm/adapters/memory/config-store.js +31 -0
  36. package/dist/esm/adapters/memory/index.js +10 -0
  37. package/dist/esm/adapters/memory/key-store.js +78 -0
  38. package/dist/esm/adapters/memory/method-store.js +43 -0
  39. package/dist/esm/adapters/memory/passkey-credential-store.js +53 -0
  40. package/dist/esm/adapters/memory/session-store.js +104 -0
  41. package/dist/esm/adapters/memory/token-store.js +104 -0
  42. package/dist/esm/adapters/postgres/audit-log.js +16 -0
  43. package/dist/esm/adapters/postgres/config-store.js +48 -0
  44. package/dist/esm/adapters/postgres/executor.js +21 -0
  45. package/dist/esm/adapters/postgres/index.js +13 -0
  46. package/dist/esm/adapters/postgres/key-store.js +191 -0
  47. package/dist/esm/adapters/postgres/method-store.js +61 -0
  48. package/dist/esm/adapters/postgres/migrations.js +111 -0
  49. package/dist/esm/adapters/postgres/passkey-credential-store.js +80 -0
  50. package/dist/esm/adapters/postgres/session-store.js +135 -0
  51. package/dist/esm/adapters/postgres/token-store.js +151 -0
  52. package/dist/esm/client.js +35 -12
  53. package/dist/esm/domain/audit.js +13 -0
  54. package/dist/esm/domain/authorize.js +217 -0
  55. package/dist/esm/domain/callback.js +176 -0
  56. package/dist/esm/domain/client-auth.js +61 -0
  57. package/dist/esm/domain/client-credentials.js +91 -0
  58. package/dist/esm/domain/crypto.js +97 -0
  59. package/dist/esm/domain/discovery.js +83 -0
  60. package/dist/esm/domain/dpop.js +122 -0
  61. package/dist/esm/domain/id-token.js +94 -0
  62. package/dist/esm/domain/introspect.js +55 -0
  63. package/dist/esm/domain/jwt.js +71 -0
  64. package/dist/esm/domain/logout.js +75 -0
  65. package/dist/esm/domain/method-cache.js +136 -0
  66. package/dist/esm/domain/method-dispatch.js +36 -0
  67. package/dist/esm/domain/method-route.js +111 -0
  68. package/dist/esm/domain/par.js +51 -0
  69. package/dist/esm/domain/pkce.js +16 -0
  70. package/dist/esm/domain/refresh.js +102 -0
  71. package/dist/esm/domain/register.js +74 -0
  72. package/dist/esm/domain/revoke.js +81 -0
  73. package/dist/esm/domain/state-envelope.js +80 -0
  74. package/dist/esm/domain/token-exchange.js +102 -0
  75. package/dist/esm/domain/token.js +246 -0
  76. package/dist/esm/domain/userinfo.js +62 -0
  77. package/dist/esm/http/context.js +7 -0
  78. package/dist/esm/http/cookies.js +98 -0
  79. package/dist/esm/http/errors.js +71 -0
  80. package/dist/esm/http/handlers/authorize.js +250 -0
  81. package/dist/esm/http/handlers/callback.js +53 -0
  82. package/dist/esm/http/handlers/end-session.js +64 -0
  83. package/dist/esm/http/handlers/metadata.js +37 -0
  84. package/dist/esm/http/handlers/method-route.js +87 -0
  85. package/dist/esm/http/handlers/par.js +53 -0
  86. package/dist/esm/http/handlers/register.js +46 -0
  87. package/dist/esm/http/handlers/revocation.js +98 -0
  88. package/dist/esm/http/handlers/token.js +197 -0
  89. package/dist/esm/http/handlers/userinfo.js +60 -0
  90. package/dist/esm/http/middleware/error.js +15 -0
  91. package/dist/esm/http/middleware/tenant.js +102 -0
  92. package/dist/esm/http/resolver.js +15 -0
  93. package/dist/esm/http/router.js +45 -0
  94. package/dist/esm/http/schemas/authorize.js +30 -0
  95. package/dist/esm/http/schemas/end-session.js +13 -0
  96. package/dist/esm/http/schemas/par.js +9 -0
  97. package/dist/esm/http/schemas/register.js +16 -0
  98. package/dist/esm/http/schemas/revocation.js +18 -0
  99. package/dist/esm/http/schemas/token.js +57 -0
  100. package/dist/esm/index.js +126 -9
  101. package/dist/esm/methods/code.js +221 -0
  102. package/dist/esm/methods/m2m.js +41 -0
  103. package/dist/esm/methods/oauth2-factory.js +84 -0
  104. package/dist/esm/methods/oauth2-generic.js +196 -0
  105. package/dist/esm/methods/oidc-generic.js +53 -0
  106. package/dist/esm/methods/passkey.js +275 -0
  107. package/dist/esm/methods/password-hash.js +79 -0
  108. package/dist/esm/methods/password.js +166 -0
  109. package/dist/esm/methods/providers/apple.js +29 -0
  110. package/dist/esm/methods/providers/cognito.js +37 -0
  111. package/dist/esm/methods/providers/discord.js +28 -0
  112. package/dist/esm/methods/providers/facebook.js +42 -0
  113. package/dist/esm/methods/providers/github.js +29 -0
  114. package/dist/esm/methods/providers/google.js +29 -0
  115. package/dist/esm/methods/providers/index.js +17 -0
  116. package/dist/esm/methods/providers/jumpcloud.js +27 -0
  117. package/dist/esm/methods/providers/keycloak.js +32 -0
  118. package/dist/esm/methods/providers/linkedin.js +28 -0
  119. package/dist/esm/methods/providers/microsoft.js +28 -0
  120. package/dist/esm/methods/providers/slack.js +30 -0
  121. package/dist/esm/methods/providers/spotify.js +28 -0
  122. package/dist/esm/methods/providers/twitch.js +28 -0
  123. package/dist/esm/methods/providers/x.js +28 -0
  124. package/dist/esm/methods/providers/yahoo.js +27 -0
  125. package/dist/esm/pkce.js +4 -16
  126. package/dist/esm/ports/audit-log.js +0 -0
  127. package/dist/esm/ports/config-store.js +0 -0
  128. package/dist/esm/ports/key-store.js +0 -0
  129. package/dist/esm/ports/method-store.js +0 -0
  130. package/dist/esm/ports/session-store.js +0 -0
  131. package/dist/esm/ports/token-store.js +0 -0
  132. package/dist/esm/types/authorization.js +0 -0
  133. package/dist/esm/types/error.js +70 -0
  134. package/dist/esm/types/flow.js +0 -0
  135. package/dist/esm/types/idp.js +0 -0
  136. package/dist/esm/types/method.js +0 -0
  137. package/dist/esm/types/picker.js +0 -0
  138. package/dist/esm/types/result.js +11 -0
  139. package/dist/esm/types/subject.js +0 -0
  140. package/dist/esm/types/tenant.js +5 -0
  141. package/dist/esm/types/token.js +0 -0
  142. package/dist/esm/ui/forms.js +253 -0
  143. package/dist/esm/ui/index.js +8 -0
  144. package/dist/esm/ui/picker.js +49 -0
  145. package/dist/types/adapters/d1/audit-log.d.ts +19 -0
  146. package/dist/types/adapters/d1/audit-log.d.ts.map +1 -0
  147. package/dist/types/adapters/d1/config-store.d.ts +20 -0
  148. package/dist/types/adapters/d1/config-store.d.ts.map +1 -0
  149. package/dist/types/adapters/d1/index.d.ts +35 -0
  150. package/dist/types/adapters/d1/index.d.ts.map +1 -0
  151. package/dist/types/adapters/d1/key-store.d.ts +17 -0
  152. package/dist/types/adapters/d1/key-store.d.ts.map +1 -0
  153. package/dist/types/adapters/d1/method-store.d.ts +21 -0
  154. package/dist/types/adapters/d1/method-store.d.ts.map +1 -0
  155. package/dist/types/adapters/d1/migrations.d.ts +18 -0
  156. package/dist/types/adapters/d1/migrations.d.ts.map +1 -0
  157. package/dist/types/adapters/d1/session-store.d.ts +20 -0
  158. package/dist/types/adapters/d1/session-store.d.ts.map +1 -0
  159. package/dist/types/adapters/d1/session.d.ts +18 -0
  160. package/dist/types/adapters/d1/session.d.ts.map +1 -0
  161. package/dist/types/adapters/d1/token-store.d.ts +29 -0
  162. package/dist/types/adapters/d1/token-store.d.ts.map +1 -0
  163. package/dist/types/adapters/d1/types.d.ts +43 -0
  164. package/dist/types/adapters/d1/types.d.ts.map +1 -0
  165. package/dist/types/adapters/durable-object/index.d.ts +17 -0
  166. package/dist/types/adapters/durable-object/index.d.ts.map +1 -0
  167. package/dist/types/adapters/durable-object/session-store.d.ts +21 -0
  168. package/dist/types/adapters/durable-object/session-store.d.ts.map +1 -0
  169. package/dist/types/adapters/durable-object/types.d.ts +23 -0
  170. package/dist/types/adapters/durable-object/types.d.ts.map +1 -0
  171. package/dist/types/adapters/dynamo/audit-log.d.ts +19 -0
  172. package/dist/types/adapters/dynamo/audit-log.d.ts.map +1 -0
  173. package/dist/types/adapters/dynamo/client.d.ts +111 -0
  174. package/dist/types/adapters/dynamo/client.d.ts.map +1 -0
  175. package/dist/types/adapters/dynamo/config-store.d.ts +21 -0
  176. package/dist/types/adapters/dynamo/config-store.d.ts.map +1 -0
  177. package/dist/types/adapters/dynamo/index.d.ts +60 -0
  178. package/dist/types/adapters/dynamo/index.d.ts.map +1 -0
  179. package/dist/types/adapters/dynamo/key-store.d.ts +23 -0
  180. package/dist/types/adapters/dynamo/key-store.d.ts.map +1 -0
  181. package/dist/types/adapters/dynamo/method-store.d.ts +20 -0
  182. package/dist/types/adapters/dynamo/method-store.d.ts.map +1 -0
  183. package/dist/types/adapters/dynamo/passkey-credential-store.d.ts +47 -0
  184. package/dist/types/adapters/dynamo/passkey-credential-store.d.ts.map +1 -0
  185. package/dist/types/adapters/dynamo/sdk.d.ts +23 -0
  186. package/dist/types/adapters/dynamo/sdk.d.ts.map +1 -0
  187. package/dist/types/adapters/dynamo/session-store.d.ts +20 -0
  188. package/dist/types/adapters/dynamo/session-store.d.ts.map +1 -0
  189. package/dist/types/adapters/dynamo/token-store.d.ts +29 -0
  190. package/dist/types/adapters/dynamo/token-store.d.ts.map +1 -0
  191. package/dist/types/adapters/kms/in-memory-backing.d.ts +9 -0
  192. package/dist/types/adapters/kms/in-memory-backing.d.ts.map +1 -0
  193. package/dist/types/adapters/kms/index.d.ts +35 -0
  194. package/dist/types/adapters/kms/index.d.ts.map +1 -0
  195. package/dist/types/adapters/kms/key-store.d.ts +20 -0
  196. package/dist/types/adapters/kms/key-store.d.ts.map +1 -0
  197. package/dist/types/adapters/kms/sdk.d.ts +16 -0
  198. package/dist/types/adapters/kms/sdk.d.ts.map +1 -0
  199. package/dist/types/adapters/kms/types.d.ts +58 -0
  200. package/dist/types/adapters/kms/types.d.ts.map +1 -0
  201. package/dist/types/adapters/kv/audit-log.d.ts +22 -0
  202. package/dist/types/adapters/kv/audit-log.d.ts.map +1 -0
  203. package/dist/types/adapters/kv/config-store.d.ts +25 -0
  204. package/dist/types/adapters/kv/config-store.d.ts.map +1 -0
  205. package/dist/types/adapters/kv/index.d.ts +21 -0
  206. package/dist/types/adapters/kv/index.d.ts.map +1 -0
  207. package/dist/types/adapters/kv/method-store.d.ts +23 -0
  208. package/dist/types/adapters/kv/method-store.d.ts.map +1 -0
  209. package/dist/types/adapters/kv/types.d.ts +28 -0
  210. package/dist/types/adapters/kv/types.d.ts.map +1 -0
  211. package/dist/types/adapters/memory/audit-log.d.ts +18 -0
  212. package/dist/types/adapters/memory/audit-log.d.ts.map +1 -0
  213. package/dist/types/adapters/memory/clock.d.ts +7 -0
  214. package/dist/types/adapters/memory/clock.d.ts.map +1 -0
  215. package/dist/types/adapters/memory/config-store.d.ts +19 -0
  216. package/dist/types/adapters/memory/config-store.d.ts.map +1 -0
  217. package/dist/types/adapters/memory/index.d.ts +15 -0
  218. package/dist/types/adapters/memory/index.d.ts.map +1 -0
  219. package/dist/types/adapters/memory/key-store.d.ts +17 -0
  220. package/dist/types/adapters/memory/key-store.d.ts.map +1 -0
  221. package/dist/types/adapters/memory/method-store.d.ts +26 -0
  222. package/dist/types/adapters/memory/method-store.d.ts.map +1 -0
  223. package/dist/types/adapters/memory/passkey-credential-store.d.ts +43 -0
  224. package/dist/types/adapters/memory/passkey-credential-store.d.ts.map +1 -0
  225. package/dist/types/adapters/memory/session-store.d.ts +21 -0
  226. package/dist/types/adapters/memory/session-store.d.ts.map +1 -0
  227. package/dist/types/adapters/memory/token-store.d.ts +29 -0
  228. package/dist/types/adapters/memory/token-store.d.ts.map +1 -0
  229. package/dist/types/adapters/postgres/audit-log.d.ts +18 -0
  230. package/dist/types/adapters/postgres/audit-log.d.ts.map +1 -0
  231. package/dist/types/adapters/postgres/config-store.d.ts +21 -0
  232. package/dist/types/adapters/postgres/config-store.d.ts.map +1 -0
  233. package/dist/types/adapters/postgres/executor.d.ts +48 -0
  234. package/dist/types/adapters/postgres/executor.d.ts.map +1 -0
  235. package/dist/types/adapters/postgres/index.d.ts +39 -0
  236. package/dist/types/adapters/postgres/index.d.ts.map +1 -0
  237. package/dist/types/adapters/postgres/key-store.d.ts +23 -0
  238. package/dist/types/adapters/postgres/key-store.d.ts.map +1 -0
  239. package/dist/types/adapters/postgres/method-store.d.ts +21 -0
  240. package/dist/types/adapters/postgres/method-store.d.ts.map +1 -0
  241. package/dist/types/adapters/postgres/migrations.d.ts +22 -0
  242. package/dist/types/adapters/postgres/migrations.d.ts.map +1 -0
  243. package/dist/types/adapters/postgres/passkey-credential-store.d.ts +48 -0
  244. package/dist/types/adapters/postgres/passkey-credential-store.d.ts.map +1 -0
  245. package/dist/types/adapters/postgres/session-store.d.ts +20 -0
  246. package/dist/types/adapters/postgres/session-store.d.ts.map +1 -0
  247. package/dist/types/adapters/postgres/token-store.d.ts +30 -0
  248. package/dist/types/adapters/postgres/token-store.d.ts.map +1 -0
  249. package/dist/types/client.d.ts +20 -1
  250. package/dist/types/client.d.ts.map +1 -1
  251. package/dist/types/domain/audit.d.ts +17 -0
  252. package/dist/types/domain/audit.d.ts.map +1 -0
  253. package/dist/types/domain/authorize.d.ts +125 -0
  254. package/dist/types/domain/authorize.d.ts.map +1 -0
  255. package/dist/types/domain/callback.d.ts +70 -0
  256. package/dist/types/domain/callback.d.ts.map +1 -0
  257. package/dist/types/domain/client-auth.d.ts +57 -0
  258. package/dist/types/domain/client-auth.d.ts.map +1 -0
  259. package/dist/types/domain/client-credentials.d.ts +54 -0
  260. package/dist/types/domain/client-credentials.d.ts.map +1 -0
  261. package/dist/types/domain/crypto.d.ts +53 -0
  262. package/dist/types/domain/crypto.d.ts.map +1 -0
  263. package/dist/types/domain/discovery.d.ts +81 -0
  264. package/dist/types/domain/discovery.d.ts.map +1 -0
  265. package/dist/types/domain/dpop.d.ts +61 -0
  266. package/dist/types/domain/dpop.d.ts.map +1 -0
  267. package/dist/types/domain/id-token.d.ts +83 -0
  268. package/dist/types/domain/id-token.d.ts.map +1 -0
  269. package/dist/types/domain/introspect.d.ts +79 -0
  270. package/dist/types/domain/introspect.d.ts.map +1 -0
  271. package/dist/types/domain/jwt.d.ts +74 -0
  272. package/dist/types/domain/jwt.d.ts.map +1 -0
  273. package/dist/types/domain/logout.d.ts +69 -0
  274. package/dist/types/domain/logout.d.ts.map +1 -0
  275. package/dist/types/domain/method-cache.d.ts +42 -0
  276. package/dist/types/domain/method-cache.d.ts.map +1 -0
  277. package/dist/types/domain/method-dispatch.d.ts +37 -0
  278. package/dist/types/domain/method-dispatch.d.ts.map +1 -0
  279. package/dist/types/domain/method-route.d.ts +77 -0
  280. package/dist/types/domain/method-route.d.ts.map +1 -0
  281. package/dist/types/domain/par.d.ts +62 -0
  282. package/dist/types/domain/par.d.ts.map +1 -0
  283. package/dist/types/domain/pkce.d.ts +15 -0
  284. package/dist/types/domain/pkce.d.ts.map +1 -0
  285. package/dist/types/domain/refresh.d.ts +52 -0
  286. package/dist/types/domain/refresh.d.ts.map +1 -0
  287. package/dist/types/domain/register.d.ts +33 -0
  288. package/dist/types/domain/register.d.ts.map +1 -0
  289. package/dist/types/domain/revoke.d.ts +61 -0
  290. package/dist/types/domain/revoke.d.ts.map +1 -0
  291. package/dist/types/domain/state-envelope.d.ts +30 -0
  292. package/dist/types/domain/state-envelope.d.ts.map +1 -0
  293. package/dist/types/domain/token-exchange.d.ts +69 -0
  294. package/dist/types/domain/token-exchange.d.ts.map +1 -0
  295. package/dist/types/domain/token.d.ts +140 -0
  296. package/dist/types/domain/token.d.ts.map +1 -0
  297. package/dist/types/domain/userinfo.d.ts +61 -0
  298. package/dist/types/domain/userinfo.d.ts.map +1 -0
  299. package/dist/types/http/context.d.ts +66 -0
  300. package/dist/types/http/context.d.ts.map +1 -0
  301. package/dist/types/http/cookies.d.ts +45 -0
  302. package/dist/types/http/cookies.d.ts.map +1 -0
  303. package/dist/types/http/errors.d.ts +36 -0
  304. package/dist/types/http/errors.d.ts.map +1 -0
  305. package/dist/types/http/handlers/authorize.d.ts +3 -0
  306. package/dist/types/http/handlers/authorize.d.ts.map +1 -0
  307. package/dist/types/http/handlers/callback.d.ts +3 -0
  308. package/dist/types/http/handlers/callback.d.ts.map +1 -0
  309. package/dist/types/http/handlers/end-session.d.ts +3 -0
  310. package/dist/types/http/handlers/end-session.d.ts.map +1 -0
  311. package/dist/types/http/handlers/metadata.d.ts +4 -0
  312. package/dist/types/http/handlers/metadata.d.ts.map +1 -0
  313. package/dist/types/http/handlers/method-route.d.ts +3 -0
  314. package/dist/types/http/handlers/method-route.d.ts.map +1 -0
  315. package/dist/types/http/handlers/par.d.ts +3 -0
  316. package/dist/types/http/handlers/par.d.ts.map +1 -0
  317. package/dist/types/http/handlers/register.d.ts +3 -0
  318. package/dist/types/http/handlers/register.d.ts.map +1 -0
  319. package/dist/types/http/handlers/revocation.d.ts +4 -0
  320. package/dist/types/http/handlers/revocation.d.ts.map +1 -0
  321. package/dist/types/http/handlers/token.d.ts +3 -0
  322. package/dist/types/http/handlers/token.d.ts.map +1 -0
  323. package/dist/types/http/handlers/userinfo.d.ts +3 -0
  324. package/dist/types/http/handlers/userinfo.d.ts.map +1 -0
  325. package/dist/types/http/middleware/error.d.ts +9 -0
  326. package/dist/types/http/middleware/error.d.ts.map +1 -0
  327. package/dist/types/http/middleware/tenant.d.ts +30 -0
  328. package/dist/types/http/middleware/tenant.d.ts.map +1 -0
  329. package/dist/types/http/resolver.d.ts +22 -0
  330. package/dist/types/http/resolver.d.ts.map +1 -0
  331. package/dist/types/http/router.d.ts +21 -0
  332. package/dist/types/http/router.d.ts.map +1 -0
  333. package/dist/types/http/schemas/authorize.d.ts +92 -0
  334. package/dist/types/http/schemas/authorize.d.ts.map +1 -0
  335. package/dist/types/http/schemas/end-session.d.ts +31 -0
  336. package/dist/types/http/schemas/end-session.d.ts.map +1 -0
  337. package/dist/types/http/schemas/par.d.ts +20 -0
  338. package/dist/types/http/schemas/par.d.ts.map +1 -0
  339. package/dist/types/http/schemas/register.d.ts +42 -0
  340. package/dist/types/http/schemas/register.d.ts.map +1 -0
  341. package/dist/types/http/schemas/revocation.d.ts +41 -0
  342. package/dist/types/http/schemas/revocation.d.ts.map +1 -0
  343. package/dist/types/http/schemas/token.d.ts +227 -0
  344. package/dist/types/http/schemas/token.d.ts.map +1 -0
  345. package/dist/types/index.d.ts +63 -13
  346. package/dist/types/index.d.ts.map +1 -1
  347. package/dist/types/methods/code.d.ts +96 -0
  348. package/dist/types/methods/code.d.ts.map +1 -0
  349. package/dist/types/methods/m2m.d.ts +41 -0
  350. package/dist/types/methods/m2m.d.ts.map +1 -0
  351. package/dist/types/methods/oauth2-factory.d.ts +133 -0
  352. package/dist/types/methods/oauth2-factory.d.ts.map +1 -0
  353. package/dist/types/methods/oauth2-generic.d.ts +75 -0
  354. package/dist/types/methods/oauth2-generic.d.ts.map +1 -0
  355. package/dist/types/methods/oidc-generic.d.ts +26 -0
  356. package/dist/types/methods/oidc-generic.d.ts.map +1 -0
  357. package/dist/types/methods/passkey.d.ts +106 -0
  358. package/dist/types/methods/passkey.d.ts.map +1 -0
  359. package/dist/types/methods/password-hash.d.ts +25 -0
  360. package/dist/types/methods/password-hash.d.ts.map +1 -0
  361. package/dist/types/methods/password.d.ts +70 -0
  362. package/dist/types/methods/password.d.ts.map +1 -0
  363. package/dist/types/methods/providers/apple.d.ts +29 -0
  364. package/dist/types/methods/providers/apple.d.ts.map +1 -0
  365. package/dist/types/methods/providers/cognito.d.ts +36 -0
  366. package/dist/types/methods/providers/cognito.d.ts.map +1 -0
  367. package/dist/types/methods/providers/discord.d.ts +22 -0
  368. package/dist/types/methods/providers/discord.d.ts.map +1 -0
  369. package/dist/types/methods/providers/facebook.d.ts +29 -0
  370. package/dist/types/methods/providers/facebook.d.ts.map +1 -0
  371. package/dist/types/methods/providers/github.d.ts +25 -0
  372. package/dist/types/methods/providers/github.d.ts.map +1 -0
  373. package/dist/types/methods/providers/google.d.ts +28 -0
  374. package/dist/types/methods/providers/google.d.ts.map +1 -0
  375. package/dist/types/methods/providers/index.d.ts +24 -0
  376. package/dist/types/methods/providers/index.d.ts.map +1 -0
  377. package/dist/types/methods/providers/jumpcloud.d.ts +22 -0
  378. package/dist/types/methods/providers/jumpcloud.d.ts.map +1 -0
  379. package/dist/types/methods/providers/keycloak.d.ts +30 -0
  380. package/dist/types/methods/providers/keycloak.d.ts.map +1 -0
  381. package/dist/types/methods/providers/linkedin.d.ts +22 -0
  382. package/dist/types/methods/providers/linkedin.d.ts.map +1 -0
  383. package/dist/types/methods/providers/microsoft.d.ts +30 -0
  384. package/dist/types/methods/providers/microsoft.d.ts.map +1 -0
  385. package/dist/types/methods/providers/slack.d.ts +25 -0
  386. package/dist/types/methods/providers/slack.d.ts.map +1 -0
  387. package/dist/types/methods/providers/spotify.d.ts +22 -0
  388. package/dist/types/methods/providers/spotify.d.ts.map +1 -0
  389. package/dist/types/methods/providers/twitch.d.ts +23 -0
  390. package/dist/types/methods/providers/twitch.d.ts.map +1 -0
  391. package/dist/types/methods/providers/x.d.ts +25 -0
  392. package/dist/types/methods/providers/x.d.ts.map +1 -0
  393. package/dist/types/methods/providers/yahoo.d.ts +22 -0
  394. package/dist/types/methods/providers/yahoo.d.ts.map +1 -0
  395. package/dist/types/pkce.d.ts +1 -2
  396. package/dist/types/pkce.d.ts.map +1 -1
  397. package/dist/types/ports/audit-log.d.ts +166 -0
  398. package/dist/types/ports/audit-log.d.ts.map +1 -0
  399. package/dist/types/ports/config-store.d.ts +32 -0
  400. package/dist/types/ports/config-store.d.ts.map +1 -0
  401. package/dist/types/ports/key-store.d.ts +98 -0
  402. package/dist/types/ports/key-store.d.ts.map +1 -0
  403. package/dist/types/ports/method-store.d.ts +29 -0
  404. package/dist/types/ports/method-store.d.ts.map +1 -0
  405. package/dist/types/ports/session-store.d.ts +109 -0
  406. package/dist/types/ports/session-store.d.ts.map +1 -0
  407. package/dist/types/ports/token-store.d.ts +105 -0
  408. package/dist/types/ports/token-store.d.ts.map +1 -0
  409. package/dist/types/types/authorization.d.ts +75 -0
  410. package/dist/types/types/authorization.d.ts.map +1 -0
  411. package/dist/types/types/error.d.ts +101 -0
  412. package/dist/types/types/error.d.ts.map +1 -0
  413. package/dist/types/types/flow.d.ts +97 -0
  414. package/dist/types/types/flow.d.ts.map +1 -0
  415. package/dist/types/types/idp.d.ts +324 -0
  416. package/dist/types/types/idp.d.ts.map +1 -0
  417. package/dist/types/types/method.d.ts +256 -0
  418. package/dist/types/types/method.d.ts.map +1 -0
  419. package/dist/types/types/picker.d.ts +31 -0
  420. package/dist/types/types/picker.d.ts.map +1 -0
  421. package/dist/types/types/result.d.ts +29 -0
  422. package/dist/types/types/result.d.ts.map +1 -0
  423. package/dist/types/types/subject.d.ts +47 -0
  424. package/dist/types/types/subject.d.ts.map +1 -0
  425. package/dist/types/types/tenant.d.ts +276 -0
  426. package/dist/types/types/tenant.d.ts.map +1 -0
  427. package/dist/types/types/token.d.ts +231 -0
  428. package/dist/types/types/token.d.ts.map +1 -0
  429. package/dist/types/ui/forms.d.ts +35 -0
  430. package/dist/types/ui/forms.d.ts.map +1 -0
  431. package/dist/types/ui/index.d.ts +14 -0
  432. package/dist/types/ui/index.d.ts.map +1 -0
  433. package/dist/types/ui/picker.d.ts +18 -0
  434. package/dist/types/ui/picker.d.ts.map +1 -0
  435. package/package.json +41 -6
  436. package/src/adapters/d1/audit-log.ts +32 -0
  437. package/src/adapters/d1/config-store.ts +67 -0
  438. package/src/adapters/d1/index.ts +41 -0
  439. package/src/adapters/d1/key-store.ts +218 -0
  440. package/src/adapters/d1/method-store.ts +103 -0
  441. package/src/adapters/d1/migrations.ts +89 -0
  442. package/src/adapters/d1/session-store.ts +230 -0
  443. package/src/adapters/d1/session.ts +38 -0
  444. package/src/adapters/d1/token-store.ts +251 -0
  445. package/src/adapters/d1/types.ts +53 -0
  446. package/src/adapters/durable-object/index.ts +23 -0
  447. package/src/adapters/durable-object/session-store.ts +227 -0
  448. package/src/adapters/durable-object/types.ts +25 -0
  449. package/src/adapters/dynamo/audit-log.ts +35 -0
  450. package/src/adapters/dynamo/client.ts +118 -0
  451. package/src/adapters/dynamo/config-store.ts +72 -0
  452. package/src/adapters/dynamo/index.ts +81 -0
  453. package/src/adapters/dynamo/key-store.ts +267 -0
  454. package/src/adapters/dynamo/method-store.ts +105 -0
  455. package/src/adapters/dynamo/passkey-credential-store.ts +132 -0
  456. package/src/adapters/dynamo/sdk.ts +189 -0
  457. package/src/adapters/dynamo/session-store.ts +229 -0
  458. package/src/adapters/dynamo/token-store.ts +248 -0
  459. package/src/adapters/kms/in-memory-backing.ts +36 -0
  460. package/src/adapters/kms/index.ts +39 -0
  461. package/src/adapters/kms/key-store.ts +176 -0
  462. package/src/adapters/kms/sdk.ts +39 -0
  463. package/src/adapters/kms/types.ts +61 -0
  464. package/src/adapters/kv/audit-log.ts +40 -0
  465. package/src/adapters/kv/config-store.ts +63 -0
  466. package/src/adapters/kv/index.ts +20 -0
  467. package/src/adapters/kv/method-store.ts +98 -0
  468. package/src/adapters/kv/types.ts +26 -0
  469. package/src/adapters/memory/audit-log.ts +28 -0
  470. package/src/adapters/memory/clock.ts +7 -0
  471. package/src/adapters/memory/config-store.ts +41 -0
  472. package/src/adapters/memory/index.ts +26 -0
  473. package/src/adapters/memory/key-store.ts +102 -0
  474. package/src/adapters/memory/method-store.ts +75 -0
  475. package/src/adapters/memory/passkey-credential-store.ts +97 -0
  476. package/src/adapters/memory/session-store.ts +171 -0
  477. package/src/adapters/memory/token-store.ts +181 -0
  478. package/src/adapters/postgres/audit-log.ts +34 -0
  479. package/src/adapters/postgres/config-store.ts +72 -0
  480. package/src/adapters/postgres/executor.ts +76 -0
  481. package/src/adapters/postgres/index.ts +60 -0
  482. package/src/adapters/postgres/key-store.ts +334 -0
  483. package/src/adapters/postgres/method-store.ts +104 -0
  484. package/src/adapters/postgres/migrations.ts +131 -0
  485. package/src/adapters/postgres/passkey-credential-store.ts +150 -0
  486. package/src/adapters/postgres/session-store.ts +216 -0
  487. package/src/adapters/postgres/token-store.ts +263 -0
  488. package/src/client.ts +82 -16
  489. package/src/domain/audit.ts +28 -0
  490. package/src/domain/authorize.ts +414 -0
  491. package/src/domain/callback.ts +268 -0
  492. package/src/domain/client-auth.ts +116 -0
  493. package/src/domain/client-credentials.ts +180 -0
  494. package/src/domain/crypto.ts +168 -0
  495. package/src/domain/discovery.ts +161 -0
  496. package/src/domain/dpop.ts +293 -0
  497. package/src/domain/id-token.ts +213 -0
  498. package/src/domain/introspect.ts +155 -0
  499. package/src/domain/jwt.ts +185 -0
  500. package/src/domain/logout.ts +180 -0
  501. package/src/domain/method-cache.ts +220 -0
  502. package/src/domain/method-dispatch.ts +95 -0
  503. package/src/domain/method-route.ts +213 -0
  504. package/src/domain/par.ts +141 -0
  505. package/src/domain/pkce.ts +37 -0
  506. package/src/domain/refresh.ts +210 -0
  507. package/src/domain/register.ts +168 -0
  508. package/src/domain/revoke.ts +161 -0
  509. package/src/domain/state-envelope.ts +142 -0
  510. package/src/domain/token-exchange.ts +243 -0
  511. package/src/domain/token.ts +483 -0
  512. package/src/domain/userinfo.ts +171 -0
  513. package/src/http/context.ts +90 -0
  514. package/src/http/cookies.ts +167 -0
  515. package/src/http/errors.ts +98 -0
  516. package/src/http/handlers/authorize.ts +362 -0
  517. package/src/http/handlers/callback.ts +77 -0
  518. package/src/http/handlers/end-session.ts +106 -0
  519. package/src/http/handlers/metadata.ts +49 -0
  520. package/src/http/handlers/method-route.ts +115 -0
  521. package/src/http/handlers/par.ts +84 -0
  522. package/src/http/handlers/register.ts +70 -0
  523. package/src/http/handlers/revocation.ts +151 -0
  524. package/src/http/handlers/token.ts +300 -0
  525. package/src/http/handlers/userinfo.ts +90 -0
  526. package/src/http/middleware/error.ts +26 -0
  527. package/src/http/middleware/tenant.ts +165 -0
  528. package/src/http/resolver.ts +34 -0
  529. package/src/http/router.ts +85 -0
  530. package/src/http/schemas/authorize.ts +85 -0
  531. package/src/http/schemas/end-session.ts +23 -0
  532. package/src/http/schemas/par.ts +23 -0
  533. package/src/http/schemas/register.ts +29 -0
  534. package/src/http/schemas/revocation.ts +23 -0
  535. package/src/http/schemas/token.ts +85 -0
  536. package/src/index.ts +283 -20
  537. package/src/methods/code.ts +359 -0
  538. package/src/methods/m2m.ts +82 -0
  539. package/src/methods/oauth2-factory.ts +151 -0
  540. package/src/methods/oauth2-generic.ts +360 -0
  541. package/src/methods/oidc-generic.ts +109 -0
  542. package/src/methods/passkey.ts +419 -0
  543. package/src/methods/password-hash.ts +134 -0
  544. package/src/methods/password.ts +298 -0
  545. package/src/methods/providers/apple.ts +42 -0
  546. package/src/methods/providers/cognito.ts +55 -0
  547. package/src/methods/providers/discord.ts +37 -0
  548. package/src/methods/providers/facebook.ts +54 -0
  549. package/src/methods/providers/github.ts +42 -0
  550. package/src/methods/providers/google.ts +43 -0
  551. package/src/methods/providers/index.ts +23 -0
  552. package/src/methods/providers/jumpcloud.ts +36 -0
  553. package/src/methods/providers/keycloak.ts +42 -0
  554. package/src/methods/providers/linkedin.ts +37 -0
  555. package/src/methods/providers/microsoft.ts +42 -0
  556. package/src/methods/providers/slack.ts +42 -0
  557. package/src/methods/providers/spotify.ts +37 -0
  558. package/src/methods/providers/twitch.ts +38 -0
  559. package/src/methods/providers/x.ts +40 -0
  560. package/src/methods/providers/yahoo.ts +36 -0
  561. package/src/pkce.ts +20 -21
  562. package/src/ports/CONSISTENCY.md +119 -0
  563. package/src/ports/audit-log.ts +177 -0
  564. package/src/ports/config-store.ts +34 -0
  565. package/src/ports/key-store.ts +106 -0
  566. package/src/ports/method-store.ts +41 -0
  567. package/src/ports/session-store.ts +131 -0
  568. package/src/ports/token-store.ts +116 -0
  569. package/src/types/authorization.ts +78 -0
  570. package/src/types/error.ts +146 -0
  571. package/src/types/flow.ts +99 -0
  572. package/src/types/idp.ts +365 -0
  573. package/src/types/method.ts +270 -0
  574. package/src/types/picker.ts +32 -0
  575. package/src/types/result.ts +23 -0
  576. package/src/types/subject.ts +50 -0
  577. package/src/types/tenant.ts +285 -0
  578. package/src/types/token.ts +236 -0
  579. package/src/ui/forms.ts +289 -0
  580. package/src/ui/index.ts +14 -0
  581. package/src/ui/picker.ts +63 -0
  582. package/dist/esm/issuer.js +0 -691
  583. package/dist/esm/jwt.js +0 -16
  584. package/dist/esm/keys.js +0 -113
  585. package/dist/esm/provider/apple.js +0 -28
  586. package/dist/esm/provider/arctic.js +0 -43
  587. package/dist/esm/provider/code.js +0 -58
  588. package/dist/esm/provider/cognito.js +0 -16
  589. package/dist/esm/provider/discord.js +0 -15
  590. package/dist/esm/provider/facebook.js +0 -24
  591. package/dist/esm/provider/github.js +0 -15
  592. package/dist/esm/provider/google.js +0 -25
  593. package/dist/esm/provider/index.js +0 -3
  594. package/dist/esm/provider/jumpcloud.js +0 -15
  595. package/dist/esm/provider/keycloak.js +0 -15
  596. package/dist/esm/provider/linkedin.js +0 -15
  597. package/dist/esm/provider/m2m.js +0 -16
  598. package/dist/esm/provider/microsoft.js +0 -24
  599. package/dist/esm/provider/oauth2.js +0 -119
  600. package/dist/esm/provider/oidc.js +0 -69
  601. package/dist/esm/provider/passkey.js +0 -315
  602. package/dist/esm/provider/password.js +0 -306
  603. package/dist/esm/provider/provider.js +0 -10
  604. package/dist/esm/provider/slack.js +0 -15
  605. package/dist/esm/provider/spotify.js +0 -15
  606. package/dist/esm/provider/twitch.js +0 -15
  607. package/dist/esm/provider/x.js +0 -16
  608. package/dist/esm/provider/yahoo.js +0 -15
  609. package/dist/esm/random.js +0 -27
  610. package/dist/esm/storage/aws.js +0 -39
  611. package/dist/esm/storage/cloudflare.js +0 -42
  612. package/dist/esm/storage/dynamo.js +0 -116
  613. package/dist/esm/storage/memory.js +0 -88
  614. package/dist/esm/storage/storage.js +0 -36
  615. package/dist/esm/subject.js +0 -7
  616. package/dist/esm/ui/base.js +0 -407
  617. package/dist/esm/ui/code.js +0 -151
  618. package/dist/esm/ui/form.js +0 -43
  619. package/dist/esm/ui/icon.js +0 -92
  620. package/dist/esm/ui/passkey.js +0 -329
  621. package/dist/esm/ui/password.js +0 -338
  622. package/dist/esm/ui/select.js +0 -187
  623. package/dist/esm/ui/theme.js +0 -115
  624. package/dist/esm/util.js +0 -54
  625. package/dist/types/issuer.d.ts +0 -607
  626. package/dist/types/issuer.d.ts.map +0 -1
  627. package/dist/types/jwt.d.ts +0 -6
  628. package/dist/types/jwt.d.ts.map +0 -1
  629. package/dist/types/keys.d.ts +0 -18
  630. package/dist/types/keys.d.ts.map +0 -1
  631. package/dist/types/provider/apple.d.ts +0 -108
  632. package/dist/types/provider/apple.d.ts.map +0 -1
  633. package/dist/types/provider/arctic.d.ts +0 -16
  634. package/dist/types/provider/arctic.d.ts.map +0 -1
  635. package/dist/types/provider/code.d.ts +0 -74
  636. package/dist/types/provider/code.d.ts.map +0 -1
  637. package/dist/types/provider/cognito.d.ts +0 -64
  638. package/dist/types/provider/cognito.d.ts.map +0 -1
  639. package/dist/types/provider/discord.d.ts +0 -38
  640. package/dist/types/provider/discord.d.ts.map +0 -1
  641. package/dist/types/provider/facebook.d.ts +0 -74
  642. package/dist/types/provider/facebook.d.ts.map +0 -1
  643. package/dist/types/provider/github.d.ts +0 -38
  644. package/dist/types/provider/github.d.ts.map +0 -1
  645. package/dist/types/provider/google.d.ts +0 -74
  646. package/dist/types/provider/google.d.ts.map +0 -1
  647. package/dist/types/provider/index.d.ts +0 -4
  648. package/dist/types/provider/index.d.ts.map +0 -1
  649. package/dist/types/provider/jumpcloud.d.ts +0 -38
  650. package/dist/types/provider/jumpcloud.d.ts.map +0 -1
  651. package/dist/types/provider/keycloak.d.ts +0 -67
  652. package/dist/types/provider/keycloak.d.ts.map +0 -1
  653. package/dist/types/provider/linkedin.d.ts +0 -6
  654. package/dist/types/provider/linkedin.d.ts.map +0 -1
  655. package/dist/types/provider/m2m.d.ts +0 -34
  656. package/dist/types/provider/m2m.d.ts.map +0 -1
  657. package/dist/types/provider/microsoft.d.ts +0 -89
  658. package/dist/types/provider/microsoft.d.ts.map +0 -1
  659. package/dist/types/provider/oauth2.d.ts +0 -133
  660. package/dist/types/provider/oauth2.d.ts.map +0 -1
  661. package/dist/types/provider/oidc.d.ts +0 -91
  662. package/dist/types/provider/oidc.d.ts.map +0 -1
  663. package/dist/types/provider/passkey.d.ts +0 -143
  664. package/dist/types/provider/passkey.d.ts.map +0 -1
  665. package/dist/types/provider/password.d.ts +0 -210
  666. package/dist/types/provider/password.d.ts.map +0 -1
  667. package/dist/types/provider/provider.d.ts +0 -29
  668. package/dist/types/provider/provider.d.ts.map +0 -1
  669. package/dist/types/provider/slack.d.ts +0 -59
  670. package/dist/types/provider/slack.d.ts.map +0 -1
  671. package/dist/types/provider/spotify.d.ts +0 -38
  672. package/dist/types/provider/spotify.d.ts.map +0 -1
  673. package/dist/types/provider/twitch.d.ts +0 -38
  674. package/dist/types/provider/twitch.d.ts.map +0 -1
  675. package/dist/types/provider/x.d.ts +0 -38
  676. package/dist/types/provider/x.d.ts.map +0 -1
  677. package/dist/types/provider/yahoo.d.ts +0 -38
  678. package/dist/types/provider/yahoo.d.ts.map +0 -1
  679. package/dist/types/random.d.ts +0 -3
  680. package/dist/types/random.d.ts.map +0 -1
  681. package/dist/types/storage/aws.d.ts +0 -4
  682. package/dist/types/storage/aws.d.ts.map +0 -1
  683. package/dist/types/storage/cloudflare.d.ts +0 -34
  684. package/dist/types/storage/cloudflare.d.ts.map +0 -1
  685. package/dist/types/storage/dynamo.d.ts +0 -65
  686. package/dist/types/storage/dynamo.d.ts.map +0 -1
  687. package/dist/types/storage/memory.d.ts +0 -49
  688. package/dist/types/storage/memory.d.ts.map +0 -1
  689. package/dist/types/storage/storage.d.ts +0 -15
  690. package/dist/types/storage/storage.d.ts.map +0 -1
  691. package/dist/types/subject.d.ts +0 -122
  692. package/dist/types/subject.d.ts.map +0 -1
  693. package/dist/types/ui/base.d.ts +0 -5
  694. package/dist/types/ui/base.d.ts.map +0 -1
  695. package/dist/types/ui/code.d.ts +0 -104
  696. package/dist/types/ui/code.d.ts.map +0 -1
  697. package/dist/types/ui/form.d.ts +0 -6
  698. package/dist/types/ui/form.d.ts.map +0 -1
  699. package/dist/types/ui/icon.d.ts +0 -6
  700. package/dist/types/ui/icon.d.ts.map +0 -1
  701. package/dist/types/ui/passkey.d.ts +0 -5
  702. package/dist/types/ui/passkey.d.ts.map +0 -1
  703. package/dist/types/ui/password.d.ts +0 -139
  704. package/dist/types/ui/password.d.ts.map +0 -1
  705. package/dist/types/ui/select.d.ts +0 -55
  706. package/dist/types/ui/select.d.ts.map +0 -1
  707. package/dist/types/ui/theme.d.ts +0 -207
  708. package/dist/types/ui/theme.d.ts.map +0 -1
  709. package/dist/types/util.d.ts +0 -8
  710. package/dist/types/util.d.ts.map +0 -1
  711. package/src/css.d.ts +0 -4
  712. package/src/issuer.ts +0 -1628
  713. package/src/jwt.ts +0 -17
  714. package/src/keys.ts +0 -139
  715. package/src/provider/apple.ts +0 -127
  716. package/src/provider/arctic.ts +0 -66
  717. package/src/provider/code.ts +0 -227
  718. package/src/provider/cognito.ts +0 -74
  719. package/src/provider/discord.ts +0 -45
  720. package/src/provider/facebook.ts +0 -84
  721. package/src/provider/github.ts +0 -45
  722. package/src/provider/google.ts +0 -85
  723. package/src/provider/index.ts +0 -3
  724. package/src/provider/jumpcloud.ts +0 -45
  725. package/src/provider/keycloak.ts +0 -75
  726. package/src/provider/linkedin.ts +0 -12
  727. package/src/provider/m2m.ts +0 -56
  728. package/src/provider/microsoft.ts +0 -100
  729. package/src/provider/oauth2.ts +0 -297
  730. package/src/provider/oidc.ts +0 -179
  731. package/src/provider/passkey.ts +0 -655
  732. package/src/provider/password.ts +0 -672
  733. package/src/provider/provider.ts +0 -33
  734. package/src/provider/slack.ts +0 -67
  735. package/src/provider/spotify.ts +0 -45
  736. package/src/provider/twitch.ts +0 -45
  737. package/src/provider/x.ts +0 -46
  738. package/src/provider/yahoo.ts +0 -45
  739. package/src/random.ts +0 -24
  740. package/src/storage/aws.ts +0 -59
  741. package/src/storage/cloudflare.ts +0 -77
  742. package/src/storage/dynamo.ts +0 -193
  743. package/src/storage/memory.ts +0 -135
  744. package/src/storage/storage.ts +0 -46
  745. package/src/subject.ts +0 -130
  746. package/src/ui/base.tsx +0 -118
  747. package/src/ui/code.tsx +0 -215
  748. package/src/ui/form.tsx +0 -40
  749. package/src/ui/icon.tsx +0 -95
  750. package/src/ui/passkey.tsx +0 -321
  751. package/src/ui/password.tsx +0 -405
  752. package/src/ui/select.tsx +0 -221
  753. package/src/ui/theme.ts +0 -319
  754. package/src/ui/ui.css +0 -252
  755. package/src/util.ts +0 -58
  756. /package/dist/esm/{css.d.js → adapters/d1/types.js} +0 -0
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Postgres `ConfigStore`. JSONB blob keyed by tenant id. Invalidation hook
3
+ * fires on every `putTenantConfig` so any in-process cache built on top of
4
+ * this adapter drops the stale value before the write resolves.
5
+ */
6
+ import type { ConfigStore } from "../../ports/config-store"
7
+ import { authError } from "../../types/error"
8
+ import type { Result } from "../../types/result"
9
+ import { err, ok } from "../../types/result"
10
+ import type { TenantConfig, TenantId } from "../../types/tenant"
11
+
12
+ import type { PostgresExecutor } from "./executor"
13
+
14
+ export type PostgresConfigStoreOptions = {
15
+ exec: PostgresExecutor
16
+ clock?: () => number
17
+ }
18
+
19
+ export class PostgresConfigStore implements ConfigStore {
20
+ #exec: PostgresExecutor
21
+ #clock: () => number
22
+ #listeners = new Set<(id: TenantId) => void>()
23
+
24
+ constructor(opts: PostgresConfigStoreOptions) {
25
+ this.#exec = opts.exec
26
+ this.#clock = opts.clock ?? (() => Date.now())
27
+ }
28
+
29
+ async getTenantConfig(id: TenantId): Promise<Result<TenantConfig>> {
30
+ let row: { config: unknown } | undefined
31
+ try {
32
+ const result = await this.#exec.query<{ config: unknown }>(
33
+ `SELECT config FROM openauth_tenants WHERE id = $1`,
34
+ [id],
35
+ )
36
+ row = result.rows[0]
37
+ } catch (e) {
38
+ return err(authError.internalError("getTenantConfig: query failed", e))
39
+ }
40
+ if (!row) {
41
+ return err(authError.tenantNotFound(`tenant "${id}" not found`, id))
42
+ }
43
+ const config =
44
+ typeof row.config === "string"
45
+ ? (JSON.parse(row.config) as TenantConfig)
46
+ : (row.config as TenantConfig)
47
+ return ok(config)
48
+ }
49
+
50
+ async putTenantConfig(config: TenantConfig): Promise<Result<void>> {
51
+ try {
52
+ await this.#exec.query(
53
+ `INSERT INTO openauth_tenants (id, config, updated_at)
54
+ VALUES ($1, $2::jsonb, $3)
55
+ ON CONFLICT (id) DO UPDATE SET config = EXCLUDED.config, updated_at = EXCLUDED.updated_at`,
56
+ [config.id, JSON.stringify(config), this.#clock()],
57
+ )
58
+ } catch (e) {
59
+ return err(authError.internalError("putTenantConfig: insert failed", e))
60
+ }
61
+ for (const fn of this.#listeners) {
62
+ try {
63
+ fn(config.id)
64
+ } catch {}
65
+ }
66
+ return ok(undefined)
67
+ }
68
+
69
+ onInvalidate(handler: (id: TenantId) => void): void {
70
+ this.#listeners.add(handler)
71
+ }
72
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Thin SQL-executor interface the Postgres adapters depend on.
3
+ *
4
+ * Both the production `postgres` (porsager/postgres) driver and the embedded
5
+ * `@electric-sql/pglite` test driver fit behind this shape. Adapters never
6
+ * import either driver directly — users wire one of the `from*` helpers
7
+ * below.
8
+ */
9
+
10
+ /** One row of a SQL result, addressed by column name. */
11
+ export type Row = Record<string, unknown>
12
+
13
+ /**
14
+ * Minimal Postgres-shaped executor. Positional `$1, $2` parameters; rows are
15
+ * column-name keyed objects.
16
+ */
17
+ export type PostgresExecutor = {
18
+ query<T extends Row = Row>(
19
+ sql: string,
20
+ params?: ReadonlyArray<unknown>,
21
+ ): Promise<{ rows: T[] }>
22
+ }
23
+
24
+ /**
25
+ * Wrap a porsager/postgres `Sql` instance in the `PostgresExecutor` shape.
26
+ * The adapter calls `sql.unsafe(text, params)` so positional binds work.
27
+ *
28
+ * @example
29
+ * import postgres from "postgres"
30
+ * import { fromPostgresJs, PostgresTokenStore } from "@_mustachio/openauth/adapters/postgres"
31
+ * const sql = postgres(process.env.DATABASE_URL!)
32
+ * const exec = fromPostgresJs(sql)
33
+ * const store = new PostgresTokenStore({ exec, keyStore })
34
+ */
35
+ export function fromPostgresJs(sql: PostgresJsLike): PostgresExecutor {
36
+ return {
37
+ async query<T extends Row = Row>(
38
+ text: string,
39
+ params: ReadonlyArray<unknown> = [],
40
+ ): Promise<{ rows: T[] }> {
41
+ const result = await sql.unsafe(text, params as unknown[])
42
+ // porsager/postgres returns an array-shaped result with row objects.
43
+ return { rows: Array.from(result as unknown as Iterable<T>) }
44
+ },
45
+ }
46
+ }
47
+
48
+ /** Minimal shape we use from porsager/postgres — kept untyped to avoid a runtime import. */
49
+ export type PostgresJsLike = {
50
+ unsafe: (text: string, params: unknown[]) => Promise<unknown>
51
+ }
52
+
53
+ /**
54
+ * Wrap a PGlite instance in the `PostgresExecutor` shape. Used by the
55
+ * port-conformance suite to run the Postgres adapters in-process without a
56
+ * server.
57
+ */
58
+ export function fromPGlite(db: PGliteLike): PostgresExecutor {
59
+ return {
60
+ async query<T extends Row = Row>(
61
+ text: string,
62
+ params: ReadonlyArray<unknown> = [],
63
+ ): Promise<{ rows: T[] }> {
64
+ const result = await db.query<T>(text, params as unknown[])
65
+ return { rows: result.rows }
66
+ },
67
+ }
68
+ }
69
+
70
+ /** Minimal shape we use from @electric-sql/pglite. */
71
+ export type PGliteLike = {
72
+ query: <T extends Row = Row>(
73
+ sql: string,
74
+ params?: unknown[],
75
+ ) => Promise<{ rows: T[] }>
76
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Postgres adapter set.
3
+ *
4
+ * Suitable for Node + Postgres deployments. Satisfies every contract in
5
+ * `ports/CONSISTENCY.md` — `consumeCode` / `consumeFlow` use
6
+ * `DELETE … RETURNING` for atomic single-winner CAS, `consumeRefresh` uses
7
+ * `UPDATE … WHERE consumed_at IS NULL RETURNING payload`, and `KeyStore`
8
+ * persists JWK material in JSONB columns.
9
+ *
10
+ * @example
11
+ * import postgres from "postgres"
12
+ * import {
13
+ * fromPostgresJs,
14
+ * migrate,
15
+ * PostgresTokenStore,
16
+ * PostgresSessionStore,
17
+ * PostgresKeyStore,
18
+ * PostgresConfigStore,
19
+ * PostgresMethodStore,
20
+ * PostgresAuditLog,
21
+ * } from "@_mustachio/openauth/adapters/postgres"
22
+ *
23
+ * const sql = postgres(process.env.DATABASE_URL!)
24
+ * const exec = fromPostgresJs(sql)
25
+ * await migrate(exec)
26
+ * const keyStore = new PostgresKeyStore({ exec })
27
+ * const tokenStore = new PostgresTokenStore({ exec, keyStore })
28
+ * // ...
29
+ */
30
+ export {
31
+ fromPGlite,
32
+ fromPostgresJs,
33
+ type PGliteLike,
34
+ type PostgresExecutor,
35
+ type PostgresJsLike,
36
+ type Row,
37
+ } from "./executor"
38
+ export { INITIAL_SCHEMA_SQL, migrate } from "./migrations"
39
+ export { PostgresAuditLog, type PostgresAuditLogOptions } from "./audit-log"
40
+ export {
41
+ PostgresConfigStore,
42
+ type PostgresConfigStoreOptions,
43
+ } from "./config-store"
44
+ export { PostgresKeyStore, type PostgresKeyStoreOptions } from "./key-store"
45
+ export {
46
+ PostgresMethodStore,
47
+ type PostgresMethodStoreOptions,
48
+ } from "./method-store"
49
+ export {
50
+ PostgresSessionStore,
51
+ type PostgresSessionStoreOptions,
52
+ } from "./session-store"
53
+ export {
54
+ PostgresTokenStore,
55
+ type PostgresTokenStoreOptions,
56
+ } from "./token-store"
57
+ export {
58
+ PostgresPasskeyCredentialStore,
59
+ type PostgresPasskeyCredentialStoreOptions,
60
+ } from "./passkey-credential-store"
@@ -0,0 +1,334 @@
1
+ /**
2
+ * Postgres `KeyStore`.
3
+ *
4
+ * Signing keys are persisted as a pair of JWK blobs (public + private) so
5
+ * the framework can transparently `importJWK(privateKeyRef)` on first use.
6
+ * Encryption keys are stored as raw bytes in a `bytea` column.
7
+ *
8
+ * On first read, if no active signing or encryption key exists the adapter
9
+ * auto-generates one. This keeps the developer experience aligned with the
10
+ * memory adapter (no manual bootstrap step) while still respecting whatever
11
+ * keys an operator may have provisioned out-of-band.
12
+ *
13
+ * **At-rest protection.** Pass `wrapper: { wrap, unwrap }` to encrypt the
14
+ * private JWK and the encryption-key bytes under a host-controlled master
15
+ * key (typically a KMS Encrypt/Decrypt round trip). Without a wrapper the
16
+ * adapter stores private material in plaintext at rest — acceptable for
17
+ * dev / local use, **not** acceptable for production. See `INTEGRATION.md`
18
+ * §4. The `private_jwk_wrapped` / `key_material_wrapped` boolean columns
19
+ * record which representation each row uses, so flipping a wrapper on for
20
+ * an existing deployment is a (forthcoming) re-wrap migration rather than
21
+ * a schema change.
22
+ *
23
+ * Rotation (`rotateSigningKeys` / `rotateEncryptionKeys`) is left as a Phase
24
+ * 8 deliverable — schema columns exist for `status` and `rotated_at`, so the
25
+ * later implementation will be a series of `UPDATE` statements without
26
+ * needing a migration.
27
+ */
28
+ import type { JWK } from "jose"
29
+ import { exportJWK, generateKeyPair, importJWK } from "jose"
30
+
31
+ import {
32
+ base64url,
33
+ generateSymmetricKey,
34
+ randomId,
35
+ utf8,
36
+ } from "../../domain/crypto"
37
+ import type {
38
+ EncryptionKey,
39
+ KeyStore,
40
+ KeyWrapper,
41
+ SigningKey,
42
+ } from "../../ports/key-store"
43
+ import { authError } from "../../types/error"
44
+ import type { Result } from "../../types/result"
45
+ import { err, ok } from "../../types/result"
46
+
47
+ import type { PostgresExecutor } from "./executor"
48
+
49
+ export type PostgresKeyStoreOptions = {
50
+ exec: PostgresExecutor
51
+ clock?: () => number
52
+ signingAlg?: "ES256" | "EdDSA"
53
+ /**
54
+ * Optional envelope that encrypts private JWKs and encryption-key bytes
55
+ * before they leave the process. STRONGLY RECOMMENDED in production.
56
+ * Pair with a cloud KMS or HSM-backed implementation.
57
+ */
58
+ wrapper?: KeyWrapper
59
+ }
60
+
61
+ export class PostgresKeyStore implements KeyStore {
62
+ #exec: PostgresExecutor
63
+ #clock: () => number
64
+ #signingAlg: "ES256" | "EdDSA"
65
+ #wrapper: KeyWrapper | undefined
66
+ // Cache imported private keys so we don't re-import on every sign.
67
+ #privateKeyCache = new Map<string, unknown>()
68
+
69
+ constructor(opts: PostgresKeyStoreOptions) {
70
+ this.#exec = opts.exec
71
+ this.#clock = opts.clock ?? (() => Date.now())
72
+ this.#signingAlg = opts.signingAlg ?? "ES256"
73
+ this.#wrapper = opts.wrapper
74
+ }
75
+
76
+ async currentSigningKey(): Promise<Result<SigningKey>> {
77
+ await this.#ensureSigningKey()
78
+ const rows = await this.#selectSigningRows(`status = 'active'`)
79
+ if (rows.length === 0) {
80
+ return err(
81
+ authError.internalError(
82
+ "no active signing key (should be unreachable)",
83
+ ),
84
+ )
85
+ }
86
+ const key = await this.#hydrateSigningKey(rows[0]!)
87
+ return ok(key)
88
+ }
89
+
90
+ async signingKeys(): Promise<Result<SigningKey[]>> {
91
+ await this.#ensureSigningKey()
92
+ const rows = await this.#selectSigningRows(
93
+ `status IN ('active','next','retired')`,
94
+ )
95
+ const keys = await Promise.all(rows.map((r) => this.#hydrateSigningKey(r)))
96
+ return ok(keys)
97
+ }
98
+
99
+ async currentEncryptionKey(): Promise<Result<EncryptionKey>> {
100
+ await this.#ensureEncryptionKey()
101
+ const rows = await this.#selectEncryptionRows(`status = 'active'`)
102
+ if (rows.length === 0) {
103
+ return err(
104
+ authError.internalError(
105
+ "no active encryption key (should be unreachable)",
106
+ ),
107
+ )
108
+ }
109
+ return ok(await this.#hydrateEncryptionKey(rows[0]!))
110
+ }
111
+
112
+ async getEncryptionKey(kid: string): Promise<Result<EncryptionKey>> {
113
+ let row: EncryptionKeyRow | undefined
114
+ try {
115
+ const result = await this.#exec.query<EncryptionKeyRow>(
116
+ `SELECT kid, alg, key_material, key_material_wrapped, status, created_at, rotated_at
117
+ FROM openauth_encryption_keys WHERE kid = $1`,
118
+ [kid],
119
+ )
120
+ row = result.rows[0]
121
+ } catch (e) {
122
+ return err(authError.internalError("getEncryptionKey: query failed", e))
123
+ }
124
+ if (!row) {
125
+ return err(authError.internalError(`encryption key "${kid}" not found`))
126
+ }
127
+ return ok(await this.#hydrateEncryptionKey(row))
128
+ }
129
+
130
+ // --- bootstrap -------------------------------------------------------
131
+
132
+ async #ensureSigningKey(): Promise<void> {
133
+ const rows = await this.#selectSigningRows(`status = 'active'`)
134
+ if (rows.length > 0) return
135
+ const { publicKey, privateKey } = await generateKeyPair(this.#signingAlg, {
136
+ extractable: true,
137
+ })
138
+ const publicJwk = await exportJWK(publicKey)
139
+ const privateJwk = await exportJWK(privateKey)
140
+ const kid = randomId()
141
+ const { jsonPayload, wrapped } = await this.#encodePrivateJwk(privateJwk)
142
+ await this.#exec.query(
143
+ `INSERT INTO openauth_signing_keys
144
+ (kid, alg, crv, public_jwk, private_jwk, private_jwk_wrapped, status, created_at)
145
+ VALUES ($1, $2, $3, $4::jsonb, $5::jsonb, $6, 'active', $7)
146
+ ON CONFLICT (kid) DO NOTHING`,
147
+ [
148
+ kid,
149
+ this.#signingAlg,
150
+ publicJwk.crv ?? null,
151
+ JSON.stringify(publicJwk),
152
+ jsonPayload,
153
+ wrapped,
154
+ this.#clock(),
155
+ ],
156
+ )
157
+ }
158
+
159
+ async #ensureEncryptionKey(): Promise<void> {
160
+ const rows = await this.#selectEncryptionRows(`status = 'active'`)
161
+ if (rows.length > 0) return
162
+ const kid = randomId()
163
+ const raw = generateSymmetricKey() // 32 bytes
164
+ const stored = this.#wrapper ? await this.#wrapper.wrap(raw) : raw
165
+ await this.#exec.query(
166
+ `INSERT INTO openauth_encryption_keys
167
+ (kid, alg, key_material, key_material_wrapped, status, created_at)
168
+ VALUES ($1, $2, $3, $4, 'active', $5)
169
+ ON CONFLICT (kid) DO NOTHING`,
170
+ [kid, "A256GCM", stored, this.#wrapper !== undefined, this.#clock()],
171
+ )
172
+ }
173
+
174
+ /**
175
+ * Encode a private JWK for `private_jwk jsonb` storage. With a wrapper,
176
+ * the plaintext JWK bytes are encrypted and stored as `{"ct": <base64url>}`
177
+ * — never as a recognizable JWK on disk. Without one, the JWK is stored
178
+ * verbatim.
179
+ */
180
+ async #encodePrivateJwk(
181
+ jwk: JWK,
182
+ ): Promise<{ jsonPayload: string; wrapped: boolean }> {
183
+ if (!this.#wrapper) {
184
+ return { jsonPayload: JSON.stringify(jwk), wrapped: false }
185
+ }
186
+ const ciphertext = await this.#wrapper.wrap(
187
+ utf8.encode(JSON.stringify(jwk)),
188
+ )
189
+ return {
190
+ jsonPayload: JSON.stringify({ ct: base64url.encode(ciphertext) }),
191
+ wrapped: true,
192
+ }
193
+ }
194
+
195
+ async #decodePrivateJwk(raw: unknown, wrapped: boolean): Promise<JWK> {
196
+ const parsed =
197
+ typeof raw === "string"
198
+ ? (JSON.parse(raw) as Record<string, unknown>)
199
+ : (raw as Record<string, unknown>)
200
+ if (!wrapped) return parsed as unknown as JWK
201
+ if (!this.#wrapper) {
202
+ throw new Error(
203
+ "PostgresKeyStore: signing key row is wrapped but no `wrapper` was supplied — refusing to read",
204
+ )
205
+ }
206
+ const ct = typeof parsed.ct === "string" ? parsed.ct : ""
207
+ if (!ct) {
208
+ throw new Error("PostgresKeyStore: wrapped signing key row missing `ct`")
209
+ }
210
+ const plaintext = await this.#wrapper.unwrap(base64url.decode(ct))
211
+ return JSON.parse(utf8.decode(plaintext)) as JWK
212
+ }
213
+
214
+ // --- helpers --------------------------------------------------------
215
+
216
+ async #selectSigningRows(where: string): Promise<SigningKeyRow[]> {
217
+ const result = await this.#exec.query<SigningKeyRow>(
218
+ `SELECT kid, alg, crv, public_jwk, private_jwk, private_jwk_wrapped,
219
+ status, created_at, rotated_at
220
+ FROM openauth_signing_keys WHERE ${where}`,
221
+ )
222
+ return result.rows
223
+ }
224
+
225
+ async #selectEncryptionRows(where: string): Promise<EncryptionKeyRow[]> {
226
+ const result = await this.#exec.query<EncryptionKeyRow>(
227
+ `SELECT kid, alg, key_material, key_material_wrapped, status, created_at, rotated_at
228
+ FROM openauth_encryption_keys WHERE ${where}`,
229
+ )
230
+ return result.rows
231
+ }
232
+
233
+ async #hydrateSigningKey(row: SigningKeyRow): Promise<SigningKey> {
234
+ let imported = this.#privateKeyCache.get(row.kid)
235
+ if (!imported) {
236
+ const privateJwk = await this.#decodePrivateJwk(
237
+ row.private_jwk,
238
+ row.private_jwk_wrapped === true,
239
+ )
240
+ imported = await importJWK(privateJwk, row.alg)
241
+ this.#privateKeyCache.set(row.kid, imported)
242
+ }
243
+ const publicJwk =
244
+ typeof row.public_jwk === "string"
245
+ ? (JSON.parse(row.public_jwk) as Record<string, unknown>)
246
+ : (row.public_jwk as Record<string, unknown>)
247
+ return {
248
+ kid: row.kid,
249
+ alg: row.alg,
250
+ ...(row.crv ? { crv: row.crv } : {}),
251
+ publicJwk,
252
+ privateKeyRef: imported,
253
+ status: row.status as SigningKey["status"],
254
+ createdAt: Number(row.created_at),
255
+ ...(row.rotated_at !== null && row.rotated_at !== undefined
256
+ ? { rotatedAt: Number(row.rotated_at) }
257
+ : {}),
258
+ }
259
+ }
260
+
261
+ async #hydrateEncryptionKey(row: EncryptionKeyRow): Promise<EncryptionKey> {
262
+ const stored = ensureBytes(row.key_material)
263
+ let keyRef = stored
264
+ if (row.key_material_wrapped === true) {
265
+ if (!this.#wrapper) {
266
+ throw new Error(
267
+ "PostgresKeyStore: encryption key row is wrapped but no `wrapper` was supplied — refusing to read",
268
+ )
269
+ }
270
+ keyRef = await this.#wrapper.unwrap(stored)
271
+ }
272
+ return {
273
+ kid: row.kid,
274
+ alg: row.alg,
275
+ keyRef,
276
+ status: row.status as EncryptionKey["status"],
277
+ createdAt: Number(row.created_at),
278
+ ...(row.rotated_at !== null && row.rotated_at !== undefined
279
+ ? { rotatedAt: Number(row.rotated_at) }
280
+ : {}),
281
+ }
282
+ }
283
+ }
284
+
285
+ type SigningKeyRow = {
286
+ kid: string
287
+ alg: string
288
+ crv: string | null
289
+ public_jwk: unknown
290
+ private_jwk: unknown
291
+ private_jwk_wrapped: boolean | number | null
292
+ status: string
293
+ created_at: string | number
294
+ rotated_at: string | number | null
295
+ }
296
+
297
+ type EncryptionKeyRow = {
298
+ kid: string
299
+ alg: string
300
+ key_material: Uint8Array | { type: string; data: number[] } | string
301
+ key_material_wrapped: boolean | number | null
302
+ status: string
303
+ created_at: string | number
304
+ rotated_at: string | number | null
305
+ }
306
+
307
+ /**
308
+ * Some drivers return `bytea` columns as `Uint8Array`; some return
309
+ * `Buffer`; some return base64-decoded strings or `{ type: "Buffer", data: [...] }`.
310
+ * Normalize to a plain `Uint8Array` so the encryption path is driver-agnostic.
311
+ */
312
+ function ensureBytes(value: EncryptionKeyRow["key_material"]): Uint8Array {
313
+ if (value instanceof Uint8Array) return value
314
+ if (typeof value === "string") {
315
+ // Best-effort: hex-encoded by postgres-js default; PGlite returns Uint8Array.
316
+ if (/^\\x[0-9a-fA-F]+$/.test(value)) {
317
+ const hex = value.slice(2)
318
+ const out = new Uint8Array(hex.length / 2)
319
+ for (let i = 0; i < out.length; i++) {
320
+ out[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16)
321
+ }
322
+ return out
323
+ }
324
+ return new TextEncoder().encode(value)
325
+ }
326
+ if (
327
+ value &&
328
+ typeof value === "object" &&
329
+ "data" in (value as Record<string, unknown>)
330
+ ) {
331
+ return new Uint8Array((value as { data: number[] }).data)
332
+ }
333
+ throw new Error("PostgresKeyStore: unsupported bytea representation")
334
+ }
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Postgres `MethodStore`. `(tenant_id, method_id)` composite key, JSONB
3
+ * `config` column for the method-config blob.
4
+ */
5
+ import type { MethodStore } from "../../ports/method-store"
6
+ import { authError } from "../../types/error"
7
+ import type { Result } from "../../types/result"
8
+ import { err, ok } from "../../types/result"
9
+ import type { MethodConfig, TenantId } from "../../types/tenant"
10
+
11
+ import type { PostgresExecutor } from "./executor"
12
+
13
+ export type PostgresMethodStoreOptions = {
14
+ exec: PostgresExecutor
15
+ clock?: () => number
16
+ }
17
+
18
+ export class PostgresMethodStore implements MethodStore {
19
+ #exec: PostgresExecutor
20
+ #clock: () => number
21
+
22
+ constructor(opts: PostgresMethodStoreOptions) {
23
+ this.#exec = opts.exec
24
+ this.#clock = opts.clock ?? (() => Date.now())
25
+ }
26
+
27
+ async listMethods(tenantId: TenantId): Promise<Result<MethodConfig[]>> {
28
+ try {
29
+ const result = await this.#exec.query<{ config: unknown }>(
30
+ `SELECT config FROM openauth_methods WHERE tenant_id = $1 ORDER BY method_id`,
31
+ [tenantId],
32
+ )
33
+ const methods = result.rows.map((r) => parseConfig(r.config))
34
+ return ok(methods)
35
+ } catch (e) {
36
+ return err(authError.internalError("listMethods: query failed", e))
37
+ }
38
+ }
39
+
40
+ async getMethodConfig(
41
+ tenantId: TenantId,
42
+ methodId: string,
43
+ ): Promise<Result<MethodConfig>> {
44
+ let row: { config: unknown } | undefined
45
+ try {
46
+ const result = await this.#exec.query<{ config: unknown }>(
47
+ `SELECT config FROM openauth_methods WHERE tenant_id = $1 AND method_id = $2`,
48
+ [tenantId, methodId],
49
+ )
50
+ row = result.rows[0]
51
+ } catch (e) {
52
+ return err(authError.internalError("getMethodConfig: query failed", e))
53
+ }
54
+ if (!row) {
55
+ return err(
56
+ authError.methodNotFound(
57
+ `method "${methodId}" not found for tenant "${tenantId}"`,
58
+ { methodId },
59
+ ),
60
+ )
61
+ }
62
+ return ok(parseConfig(row.config))
63
+ }
64
+
65
+ async putMethodConfig(
66
+ tenantId: TenantId,
67
+ method: MethodConfig,
68
+ ): Promise<Result<void>> {
69
+ try {
70
+ await this.#exec.query(
71
+ `INSERT INTO openauth_methods (tenant_id, method_id, config, updated_at)
72
+ VALUES ($1, $2, $3::jsonb, $4)
73
+ ON CONFLICT (tenant_id, method_id) DO UPDATE
74
+ SET config = EXCLUDED.config, updated_at = EXCLUDED.updated_at`,
75
+ [tenantId, method.id, JSON.stringify(method), this.#clock()],
76
+ )
77
+ } catch (e) {
78
+ return err(authError.internalError("putMethodConfig: insert failed", e))
79
+ }
80
+ return ok(undefined)
81
+ }
82
+
83
+ async deleteMethodConfig(
84
+ tenantId: TenantId,
85
+ methodId: string,
86
+ ): Promise<Result<void>> {
87
+ try {
88
+ await this.#exec.query(
89
+ `DELETE FROM openauth_methods WHERE tenant_id = $1 AND method_id = $2`,
90
+ [tenantId, methodId],
91
+ )
92
+ } catch (e) {
93
+ return err(
94
+ authError.internalError("deleteMethodConfig: delete failed", e),
95
+ )
96
+ }
97
+ return ok(undefined)
98
+ }
99
+ }
100
+
101
+ function parseConfig(raw: unknown): MethodConfig {
102
+ if (typeof raw === "string") return JSON.parse(raw) as MethodConfig
103
+ return raw as MethodConfig
104
+ }