@_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,267 @@
1
+ /**
2
+ * DynamoDB `KeyStore`. Single-table — signing keys under `pk="signing-key"`,
3
+ * encryption keys under `pk="encryption-key"`. Private JWKs are stored as
4
+ * JSON strings; encryption key material as base64url. Auto-generates an
5
+ * active key pair on first read.
6
+ *
7
+ * **At-rest protection.** Pass `wrapper: { wrap, unwrap }` to encrypt the
8
+ * private JWK and the encryption-key bytes under a host-controlled master
9
+ * key (typically a KMS Encrypt/Decrypt round trip). Without a wrapper the
10
+ * adapter stores private material in plaintext at rest — acceptable for
11
+ * dev / local use, **not** acceptable for production. See `INTEGRATION.md`
12
+ * §4. The `private_jwk_wrapped` / `key_material_wrapped` attributes record
13
+ * which representation each item uses.
14
+ */
15
+ import type { JWK } from "jose"
16
+ import { exportJWK, generateKeyPair, importJWK } from "jose"
17
+
18
+ import {
19
+ base64url,
20
+ generateSymmetricKey,
21
+ randomId,
22
+ utf8,
23
+ } from "../../domain/crypto"
24
+ import type {
25
+ EncryptionKey,
26
+ KeyStore,
27
+ KeyWrapper,
28
+ SigningKey,
29
+ } from "../../ports/key-store"
30
+ import { authError } from "../../types/error"
31
+ import type { Result } from "../../types/result"
32
+ import { err, ok } from "../../types/result"
33
+
34
+ import type { DynamoExecutor } from "./client"
35
+
36
+ export type DynamoKeyStoreOptions = {
37
+ exec: DynamoExecutor
38
+ clock?: () => number
39
+ signingAlg?: "ES256" | "EdDSA"
40
+ /**
41
+ * Optional envelope that encrypts private JWKs and encryption-key bytes
42
+ * before they leave the process. STRONGLY RECOMMENDED in production.
43
+ * Pair with a cloud KMS or HSM-backed implementation.
44
+ */
45
+ wrapper?: KeyWrapper
46
+ }
47
+
48
+ export class DynamoKeyStore implements KeyStore {
49
+ #exec: DynamoExecutor
50
+ #clock: () => number
51
+ #signingAlg: "ES256" | "EdDSA"
52
+ #wrapper: KeyWrapper | undefined
53
+ #privateKeyCache = new Map<string, unknown>()
54
+
55
+ constructor(opts: DynamoKeyStoreOptions) {
56
+ this.#exec = opts.exec
57
+ this.#clock = opts.clock ?? (() => Date.now())
58
+ this.#signingAlg = opts.signingAlg ?? "ES256"
59
+ this.#wrapper = opts.wrapper
60
+ }
61
+
62
+ async currentSigningKey(): Promise<Result<SigningKey>> {
63
+ await this.#ensureSigningKey()
64
+ const items = await this.#exec.query({
65
+ pk: "signing-key",
66
+ consistentRead: true,
67
+ filter: { attribute: "status", equals: "active" },
68
+ })
69
+ const row = items[0]
70
+ if (!row) {
71
+ return err(
72
+ authError.internalError(
73
+ "no active signing key (should be unreachable)",
74
+ ),
75
+ )
76
+ }
77
+ return ok(await this.#hydrateSigning(row))
78
+ }
79
+
80
+ async signingKeys(): Promise<Result<SigningKey[]>> {
81
+ await this.#ensureSigningKey()
82
+ const items = await this.#exec.query({
83
+ pk: "signing-key",
84
+ consistentRead: false,
85
+ })
86
+ const keys = await Promise.all(items.map((r) => this.#hydrateSigning(r)))
87
+ return ok(keys)
88
+ }
89
+
90
+ async currentEncryptionKey(): Promise<Result<EncryptionKey>> {
91
+ await this.#ensureEncryptionKey()
92
+ const items = await this.#exec.query({
93
+ pk: "encryption-key",
94
+ consistentRead: true,
95
+ filter: { attribute: "status", equals: "active" },
96
+ })
97
+ const row = items[0]
98
+ if (!row) {
99
+ return err(
100
+ authError.internalError(
101
+ "no active encryption key (should be unreachable)",
102
+ ),
103
+ )
104
+ }
105
+ return ok(await this.#hydrateEncryption(row))
106
+ }
107
+
108
+ async getEncryptionKey(kid: string): Promise<Result<EncryptionKey>> {
109
+ const row = await this.#exec.get({
110
+ key: { pk: "encryption-key", sk: kid },
111
+ consistentRead: true,
112
+ })
113
+ if (!row) {
114
+ return err(authError.internalError(`encryption key "${kid}" not found`))
115
+ }
116
+ return ok(await this.#hydrateEncryption(row))
117
+ }
118
+
119
+ async #ensureSigningKey(): Promise<void> {
120
+ const items = await this.#exec.query({
121
+ pk: "signing-key",
122
+ consistentRead: true,
123
+ filter: { attribute: "status", equals: "active" },
124
+ })
125
+ if (items.length > 0) return
126
+ const { publicKey, privateKey } = await generateKeyPair(this.#signingAlg, {
127
+ extractable: true,
128
+ })
129
+ const publicJwk = await exportJWK(publicKey)
130
+ const privateJwk = await exportJWK(privateKey)
131
+ const kid = randomId()
132
+ const privateJwkStored = await this.#encodePrivateJwk(privateJwk)
133
+ try {
134
+ await this.#exec.put({
135
+ item: {
136
+ pk: "signing-key",
137
+ sk: kid,
138
+ alg: this.#signingAlg,
139
+ crv: publicJwk.crv ?? null,
140
+ public_jwk: JSON.stringify(publicJwk),
141
+ private_jwk: privateJwkStored,
142
+ private_jwk_wrapped: this.#wrapper !== undefined,
143
+ status: "active",
144
+ created_at: this.#clock(),
145
+ },
146
+ condition: "not-exists",
147
+ })
148
+ } catch {
149
+ // Lost a race against another instance — fine; their key now exists.
150
+ }
151
+ }
152
+
153
+ async #ensureEncryptionKey(): Promise<void> {
154
+ const items = await this.#exec.query({
155
+ pk: "encryption-key",
156
+ consistentRead: true,
157
+ filter: { attribute: "status", equals: "active" },
158
+ })
159
+ if (items.length > 0) return
160
+ const kid = randomId()
161
+ const raw = generateSymmetricKey()
162
+ // DynamoDB stores bytes as Buffer/Uint8Array; base64url-encoded string is
163
+ // portable, supports `aws-sdk-client-mock`, and is marshalled back the
164
+ // same way. Wrapped bytes are encoded the same way after KMS encrypt.
165
+ const stored = this.#wrapper
166
+ ? base64url.encode(await this.#wrapper.wrap(raw))
167
+ : base64url.encode(raw)
168
+ try {
169
+ await this.#exec.put({
170
+ item: {
171
+ pk: "encryption-key",
172
+ sk: kid,
173
+ alg: "A256GCM",
174
+ key_material: stored,
175
+ key_material_wrapped: this.#wrapper !== undefined,
176
+ status: "active",
177
+ created_at: this.#clock(),
178
+ },
179
+ condition: "not-exists",
180
+ })
181
+ } catch {}
182
+ }
183
+
184
+ async #hydrateSigning(row: Record<string, unknown>): Promise<SigningKey> {
185
+ const kid = String(row.sk)
186
+ let imported = this.#privateKeyCache.get(kid)
187
+ if (!imported) {
188
+ const privateJwk = await this.#decodePrivateJwk(
189
+ String(row.private_jwk),
190
+ row.private_jwk_wrapped === true,
191
+ )
192
+ imported = await importJWK(privateJwk, String(row.alg))
193
+ this.#privateKeyCache.set(kid, imported)
194
+ }
195
+ const publicJwk = JSON.parse(String(row.public_jwk)) as Record<
196
+ string,
197
+ unknown
198
+ >
199
+ return {
200
+ kid,
201
+ alg: String(row.alg),
202
+ ...(row.crv ? { crv: String(row.crv) } : {}),
203
+ publicJwk,
204
+ privateKeyRef: imported,
205
+ status: String(row.status) as SigningKey["status"],
206
+ createdAt: Number(row.created_at),
207
+ ...(row.rotated_at !== undefined && row.rotated_at !== null
208
+ ? { rotatedAt: Number(row.rotated_at) }
209
+ : {}),
210
+ }
211
+ }
212
+
213
+ async #hydrateEncryption(
214
+ row: Record<string, unknown>,
215
+ ): Promise<EncryptionKey> {
216
+ const stored = base64url.decode(String(row.key_material))
217
+ let keyRef = stored
218
+ if (row.key_material_wrapped === true) {
219
+ if (!this.#wrapper) {
220
+ throw new Error(
221
+ "DynamoKeyStore: encryption key item is wrapped but no `wrapper` was supplied — refusing to read",
222
+ )
223
+ }
224
+ keyRef = await this.#wrapper.unwrap(stored)
225
+ }
226
+ return {
227
+ kid: String(row.sk),
228
+ alg: String(row.alg),
229
+ keyRef,
230
+ status: String(row.status) as EncryptionKey["status"],
231
+ createdAt: Number(row.created_at),
232
+ ...(row.rotated_at !== undefined && row.rotated_at !== null
233
+ ? { rotatedAt: Number(row.rotated_at) }
234
+ : {}),
235
+ }
236
+ }
237
+
238
+ /**
239
+ * Encode a private JWK for the `private_jwk` attribute. With a wrapper,
240
+ * the JWK bytes are encrypted and stored as `{"ct": <base64url>}` —
241
+ * never as a recognizable JWK at rest. Without one, the JWK is JSON-
242
+ * stringified verbatim (legacy path).
243
+ */
244
+ async #encodePrivateJwk(jwk: JWK): Promise<string> {
245
+ if (!this.#wrapper) return JSON.stringify(jwk)
246
+ const ciphertext = await this.#wrapper.wrap(
247
+ utf8.encode(JSON.stringify(jwk)),
248
+ )
249
+ return JSON.stringify({ ct: base64url.encode(ciphertext) })
250
+ }
251
+
252
+ async #decodePrivateJwk(raw: string, wrapped: boolean): Promise<JWK> {
253
+ const parsed = JSON.parse(raw) as Record<string, unknown>
254
+ if (!wrapped) return parsed as unknown as JWK
255
+ if (!this.#wrapper) {
256
+ throw new Error(
257
+ "DynamoKeyStore: signing key item is wrapped but no `wrapper` was supplied — refusing to read",
258
+ )
259
+ }
260
+ const ct = typeof parsed.ct === "string" ? parsed.ct : ""
261
+ if (!ct) {
262
+ throw new Error("DynamoKeyStore: wrapped signing key item missing `ct`")
263
+ }
264
+ const plaintext = await this.#wrapper.unwrap(base64url.decode(ct))
265
+ return JSON.parse(utf8.decode(plaintext)) as JWK
266
+ }
267
+ }
@@ -0,0 +1,105 @@
1
+ /**
2
+ * DynamoDB `MethodStore`. `pk="tenant-methods:<tenantId>"`, `sk=<methodId>`.
3
+ * Co-locating methods per-tenant lets `listMethods` use a single Query.
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 { DynamoExecutor } from "./client"
12
+
13
+ const partitionKey = (tenantId: TenantId) => `tenant-methods:${tenantId}`
14
+
15
+ export type DynamoMethodStoreOptions = {
16
+ exec: DynamoExecutor
17
+ }
18
+
19
+ export class DynamoMethodStore implements MethodStore {
20
+ #exec: DynamoExecutor
21
+
22
+ constructor(opts: DynamoMethodStoreOptions) {
23
+ this.#exec = opts.exec
24
+ }
25
+
26
+ async listMethods(tenantId: TenantId): Promise<Result<MethodConfig[]>> {
27
+ let items: Record<string, unknown>[]
28
+ try {
29
+ items = await this.#exec.query({
30
+ pk: partitionKey(tenantId),
31
+ consistentRead: false,
32
+ })
33
+ } catch (e) {
34
+ return err(authError.internalError("listMethods: query failed", e))
35
+ }
36
+ const methods = items
37
+ .map((r) => parseMethod(r.config))
38
+ .sort((a, b) => a.id.localeCompare(b.id))
39
+ return ok(methods)
40
+ }
41
+
42
+ async getMethodConfig(
43
+ tenantId: TenantId,
44
+ methodId: string,
45
+ ): Promise<Result<MethodConfig>> {
46
+ let row: Record<string, unknown> | undefined
47
+ try {
48
+ row = await this.#exec.get({
49
+ key: { pk: partitionKey(tenantId), sk: methodId },
50
+ consistentRead: false,
51
+ })
52
+ } catch (e) {
53
+ return err(authError.internalError("getMethodConfig: get failed", e))
54
+ }
55
+ if (!row) {
56
+ return err(
57
+ authError.methodNotFound(
58
+ `method "${methodId}" not found for tenant "${tenantId}"`,
59
+ { methodId },
60
+ ),
61
+ )
62
+ }
63
+ return ok(parseMethod(row.config))
64
+ }
65
+
66
+ async putMethodConfig(
67
+ tenantId: TenantId,
68
+ method: MethodConfig,
69
+ ): Promise<Result<void>> {
70
+ try {
71
+ await this.#exec.put({
72
+ item: {
73
+ pk: partitionKey(tenantId),
74
+ sk: method.id,
75
+ config: JSON.stringify(method),
76
+ updated_at: Date.now(),
77
+ },
78
+ })
79
+ } catch (e) {
80
+ return err(authError.internalError("putMethodConfig: put failed", e))
81
+ }
82
+ return ok(undefined)
83
+ }
84
+
85
+ async deleteMethodConfig(
86
+ tenantId: TenantId,
87
+ methodId: string,
88
+ ): Promise<Result<void>> {
89
+ try {
90
+ await this.#exec.delete({
91
+ key: { pk: partitionKey(tenantId), sk: methodId },
92
+ })
93
+ } catch (e) {
94
+ return err(
95
+ authError.internalError("deleteMethodConfig: delete failed", e),
96
+ )
97
+ }
98
+ return ok(undefined)
99
+ }
100
+ }
101
+
102
+ function parseMethod(raw: unknown): MethodConfig {
103
+ if (typeof raw === "string") return JSON.parse(raw) as MethodConfig
104
+ return raw as MethodConfig
105
+ }
@@ -0,0 +1,132 @@
1
+ /**
2
+ * DynamoDB `PasskeyCredentialStore`.
3
+ *
4
+ * Single-table layout, one item per credential:
5
+ *
6
+ * pk = "passkey-cred"
7
+ * sk = "<tenantId>#<credentialId>"
8
+ * user_key = "<tenantId>#<userId>" // GSI hash for findByUsername
9
+ * tenant_id, user_id, public_key, counter, transports, created_at
10
+ *
11
+ * Required GSI on the table (alongside `family-index` /
12
+ * `subject-index` from `DynamoTokenStore`):
13
+ *
14
+ * passkey-user-index
15
+ * Hash key: user_key (S)
16
+ * Projection: ALL
17
+ *
18
+ * The reference adapter treats `userId` as the username lookup key —
19
+ * matching the bundled `passkeyMethod`. Hosts that need
20
+ * username ≠ userId implement `PasskeyCredentialStore` directly.
21
+ */
22
+ import type {
23
+ PasskeyCredentialStore,
24
+ StoredCredential,
25
+ } from "../../methods/passkey"
26
+
27
+ import type { DynamoExecutor } from "./client"
28
+
29
+ export type DynamoPasskeyCredentialStoreOptions = {
30
+ exec: DynamoExecutor
31
+ clock?: () => number
32
+ }
33
+
34
+ export class DynamoPasskeyCredentialStore implements PasskeyCredentialStore {
35
+ #exec: DynamoExecutor
36
+ #clock: () => number
37
+
38
+ constructor(opts: DynamoPasskeyCredentialStoreOptions) {
39
+ this.#exec = opts.exec
40
+ this.#clock = opts.clock ?? (() => Date.now())
41
+ }
42
+
43
+ async findByUsername(
44
+ username: string,
45
+ tenantId: string,
46
+ ): Promise<{ userId: string; credentials: StoredCredential[] } | null> {
47
+ let items: Record<string, unknown>[]
48
+ try {
49
+ items = await this.#exec.queryByGsi({
50
+ indexName: "passkey-user-index",
51
+ hashKey: userKey(tenantId, username),
52
+ })
53
+ } catch {
54
+ return null
55
+ }
56
+ if (items.length === 0) return null
57
+ return {
58
+ userId: username,
59
+ credentials: items.map(itemToCredential),
60
+ }
61
+ }
62
+
63
+ async findById(
64
+ credentialId: string,
65
+ tenantId: string,
66
+ ): Promise<StoredCredential | null> {
67
+ const item = await this.#exec.get({
68
+ key: { pk: "passkey-cred", sk: sortKey(tenantId, credentialId) },
69
+ consistentRead: true,
70
+ })
71
+ if (!item) return null
72
+ return itemToCredential(item)
73
+ }
74
+
75
+ async updateCounter(input: {
76
+ credentialId: string
77
+ counter: number
78
+ tenantId: string
79
+ }): Promise<void> {
80
+ await this.#exec.updateItem({
81
+ key: {
82
+ pk: "passkey-cred",
83
+ sk: sortKey(input.tenantId, input.credentialId),
84
+ },
85
+ set: { counter: input.counter },
86
+ })
87
+ }
88
+
89
+ async create(input: {
90
+ userId: string
91
+ credential: StoredCredential
92
+ tenantId: string
93
+ }): Promise<void> {
94
+ const item: Record<string, unknown> = {
95
+ pk: "passkey-cred",
96
+ sk: sortKey(input.tenantId, input.credential.credentialId),
97
+ tenant_id: input.tenantId,
98
+ credential_id: input.credential.credentialId,
99
+ user_id: input.userId,
100
+ user_key: userKey(input.tenantId, input.userId),
101
+ public_key: input.credential.publicKey,
102
+ counter: input.credential.counter,
103
+ created_at: this.#clock(),
104
+ }
105
+ if (input.credential.transports) {
106
+ item.transports = input.credential.transports
107
+ }
108
+ await this.#exec.put({ item: item as never })
109
+ }
110
+ }
111
+
112
+ function sortKey(tenantId: string, credentialId: string): string {
113
+ return `${tenantId}#${credentialId}`
114
+ }
115
+
116
+ function userKey(tenantId: string, userId: string): string {
117
+ return `${tenantId}#${userId}`
118
+ }
119
+
120
+ function itemToCredential(item: Record<string, unknown>): StoredCredential {
121
+ const credential: StoredCredential = {
122
+ credentialId: String(item.credential_id ?? ""),
123
+ publicKey: String(item.public_key ?? ""),
124
+ counter: Number(item.counter ?? 0),
125
+ userId: String(item.user_id ?? ""),
126
+ }
127
+ const transports = item.transports
128
+ if (Array.isArray(transports)) {
129
+ credential.transports = transports.map(String)
130
+ }
131
+ return credential
132
+ }
@@ -0,0 +1,189 @@
1
+ /**
2
+ * `fromDynamoDBClient` — wires the `DynamoExecutor` interface to a real AWS
3
+ * SDK `DynamoDBDocumentClient`. Adapter consumers using AWS in production
4
+ * call this factory once, then pass the returned executor into every store
5
+ * adapter.
6
+ *
7
+ * The AWS SDK is imported via `@aws-sdk/lib-dynamodb` exclusively; the bare
8
+ * client is the caller's concern (they can configure region, creds, retries,
9
+ * etc.). This file is the **only** place in the package that imports the
10
+ * AWS SDK at runtime — keeping the adapter surface clean and the bundle
11
+ * lean for non-AWS consumers.
12
+ *
13
+ * @example
14
+ * import { DynamoDBClient } from "@aws-sdk/client-dynamodb"
15
+ * import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"
16
+ * const docClient = DynamoDBDocumentClient.from(new DynamoDBClient({}))
17
+ * const exec = fromDynamoDBClient(docClient, "openauth")
18
+ * const tokenStore = new DynamoTokenStore({ exec, keyStore })
19
+ */
20
+ import type { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"
21
+ import {
22
+ DeleteCommand,
23
+ GetCommand,
24
+ PutCommand,
25
+ QueryCommand,
26
+ UpdateCommand,
27
+ } from "@aws-sdk/lib-dynamodb"
28
+
29
+ import type {
30
+ DynamoDeleteInput,
31
+ DynamoExecutor,
32
+ DynamoGetInput,
33
+ DynamoPutInput,
34
+ DynamoQueryByGsiInput,
35
+ DynamoQueryInput,
36
+ DynamoUpdateConsumeRefreshInput,
37
+ DynamoUpdateItemInput,
38
+ } from "./client"
39
+
40
+ export function fromDynamoDBClient(
41
+ client: DynamoDBDocumentClient,
42
+ tableName: string,
43
+ ): DynamoExecutor {
44
+ return {
45
+ async get(input: DynamoGetInput) {
46
+ const result = await client.send(
47
+ new GetCommand({
48
+ TableName: tableName,
49
+ Key: input.key,
50
+ ConsistentRead: input.consistentRead,
51
+ }),
52
+ )
53
+ return (result.Item as Record<string, unknown> | undefined) ?? undefined
54
+ },
55
+ async put(input: DynamoPutInput) {
56
+ const condition =
57
+ input.condition === "not-exists"
58
+ ? "attribute_not_exists(pk) AND attribute_not_exists(sk)"
59
+ : input.condition === "exists"
60
+ ? "attribute_exists(pk) AND attribute_exists(sk)"
61
+ : undefined
62
+ await client.send(
63
+ new PutCommand({
64
+ TableName: tableName,
65
+ Item: input.item,
66
+ ...(condition ? { ConditionExpression: condition } : {}),
67
+ }),
68
+ )
69
+ },
70
+ async delete(input: DynamoDeleteInput) {
71
+ const result = await client.send(
72
+ new DeleteCommand({
73
+ TableName: tableName,
74
+ Key: input.key,
75
+ ReturnValues: "ALL_OLD",
76
+ }),
77
+ )
78
+ return (
79
+ (result.Attributes as Record<string, unknown> | undefined) ?? undefined
80
+ )
81
+ },
82
+ async consumeRefresh(input: DynamoUpdateConsumeRefreshInput) {
83
+ try {
84
+ const result = await client.send(
85
+ new UpdateCommand({
86
+ TableName: tableName,
87
+ Key: input.key,
88
+ UpdateExpression: "SET consumed_at = :now",
89
+ ConditionExpression:
90
+ "attribute_exists(pk) AND attribute_not_exists(consumed_at) AND expires_at > :now",
91
+ ExpressionAttributeValues: { ":now": input.now },
92
+ ReturnValues: "ALL_NEW",
93
+ }),
94
+ )
95
+ return (
96
+ (result.Attributes as Record<string, unknown> | undefined) ?? null
97
+ )
98
+ } catch (e) {
99
+ if (isConditionalCheckFailed(e)) return null
100
+ throw e
101
+ }
102
+ },
103
+ async query(input: DynamoQueryInput) {
104
+ const exprAttrValues: Record<string, unknown> = { ":pk": input.pk }
105
+ let keyExpr = "pk = :pk"
106
+ if (input.skBeginsWith) {
107
+ keyExpr += " AND begins_with(sk, :skp)"
108
+ exprAttrValues[":skp"] = input.skBeginsWith
109
+ }
110
+ let filterExpr: string | undefined
111
+ if (input.filter) {
112
+ const k = ":fv"
113
+ filterExpr = `#attr = ${k}`
114
+ exprAttrValues[k] = input.filter.equals
115
+ }
116
+ const result = await client.send(
117
+ new QueryCommand({
118
+ TableName: tableName,
119
+ KeyConditionExpression: keyExpr,
120
+ ConsistentRead: input.consistentRead,
121
+ ExpressionAttributeValues: exprAttrValues,
122
+ ...(filterExpr
123
+ ? {
124
+ FilterExpression: filterExpr,
125
+ ExpressionAttributeNames: { "#attr": input.filter!.attribute },
126
+ }
127
+ : {}),
128
+ }),
129
+ )
130
+ return (result.Items as Record<string, unknown>[] | undefined) ?? []
131
+ },
132
+ async queryByGsi(input: DynamoQueryByGsiInput) {
133
+ const result = await client.send(
134
+ new QueryCommand({
135
+ TableName: tableName,
136
+ IndexName: input.indexName,
137
+ KeyConditionExpression: "#hk = :v",
138
+ ExpressionAttributeNames: {
139
+ "#hk":
140
+ input.indexName === "family-index"
141
+ ? "family"
142
+ : input.indexName === "subject-index"
143
+ ? "subject_key"
144
+ : "user_key",
145
+ },
146
+ ExpressionAttributeValues: { ":v": input.hashKey },
147
+ }),
148
+ )
149
+ return (result.Items as Record<string, unknown>[] | undefined) ?? []
150
+ },
151
+ async updateItem(input: DynamoUpdateItemInput) {
152
+ const names: Record<string, string> = {}
153
+ const values: Record<string, unknown> = {}
154
+ const sets: string[] = []
155
+ let i = 0
156
+ for (const [attr, value] of Object.entries(input.set)) {
157
+ const nameRef = `#a${i}`
158
+ const valueRef = `:v${i}`
159
+ names[nameRef] = attr
160
+ values[valueRef] = value
161
+ sets.push(`${nameRef} = ${valueRef}`)
162
+ i += 1
163
+ }
164
+ if (sets.length === 0) return
165
+ try {
166
+ await client.send(
167
+ new UpdateCommand({
168
+ TableName: tableName,
169
+ Key: input.key,
170
+ UpdateExpression: `SET ${sets.join(", ")}`,
171
+ ConditionExpression:
172
+ "attribute_exists(pk) AND attribute_exists(sk)",
173
+ ExpressionAttributeNames: names,
174
+ ExpressionAttributeValues: values,
175
+ }),
176
+ )
177
+ } catch (e) {
178
+ // Item-missing is a no-op per the executor contract.
179
+ if (!isConditionalCheckFailed(e)) throw e
180
+ }
181
+ },
182
+ }
183
+ }
184
+
185
+ function isConditionalCheckFailed(e: unknown): boolean {
186
+ if (typeof e !== "object" || e === null) return false
187
+ const name = (e as { name?: string }).name
188
+ return name === "ConditionalCheckFailedException"
189
+ }