@robelest/convex-auth 0.0.4-preview.2 → 0.0.4-preview.21

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 (798) hide show
  1. package/README.md +67 -26
  2. package/dist/authorization/index.d.ts +63 -0
  3. package/dist/authorization/index.d.ts.map +1 -0
  4. package/dist/authorization/index.js +63 -0
  5. package/dist/authorization/index.js.map +1 -0
  6. package/dist/bin.js +6185 -0
  7. package/dist/client/core/types.d.ts +20 -0
  8. package/dist/client/core/types.d.ts.map +1 -0
  9. package/dist/client/index.d.ts +2 -299
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/index.js +407 -534
  12. package/dist/client/index.js.map +1 -1
  13. package/dist/component/_generated/api.d.ts +42 -0
  14. package/dist/component/_generated/api.d.ts.map +1 -1
  15. package/dist/component/_generated/api.js.map +1 -1
  16. package/dist/component/_generated/component.d.ts +2546 -90
  17. package/dist/component/_generated/component.d.ts.map +1 -1
  18. package/dist/component/client/core/types.d.ts +2 -0
  19. package/dist/component/client/index.d.ts +2 -0
  20. package/dist/component/convex.config.d.ts +2 -2
  21. package/dist/component/functions.d.ts +11 -9
  22. package/dist/component/functions.d.ts.map +1 -1
  23. package/dist/component/functions.js.map +1 -1
  24. package/dist/component/index.d.ts +7 -11
  25. package/dist/component/index.js +2 -3
  26. package/dist/component/model.d.ts +153 -0
  27. package/dist/component/model.d.ts.map +1 -0
  28. package/dist/component/model.js +349 -0
  29. package/dist/component/model.js.map +1 -0
  30. package/dist/component/providers/anonymous.d.ts +54 -0
  31. package/dist/component/providers/anonymous.d.ts.map +1 -0
  32. package/dist/component/providers/credentials.d.ts +5 -5
  33. package/dist/component/providers/credentials.d.ts.map +1 -1
  34. package/dist/component/providers/device.d.ts +67 -0
  35. package/dist/component/providers/device.d.ts.map +1 -0
  36. package/dist/component/providers/email.d.ts +62 -0
  37. package/dist/component/providers/email.d.ts.map +1 -0
  38. package/dist/component/providers/oauth.d.ts.map +1 -1
  39. package/dist/component/providers/oauth.js.map +1 -1
  40. package/dist/component/providers/passkey.d.ts +57 -0
  41. package/dist/component/providers/passkey.d.ts.map +1 -0
  42. package/dist/component/providers/password.d.ts +88 -0
  43. package/dist/component/providers/password.d.ts.map +1 -0
  44. package/dist/component/providers/phone.d.ts +48 -0
  45. package/dist/component/providers/phone.d.ts.map +1 -0
  46. package/dist/component/providers/sso.d.ts +50 -0
  47. package/dist/component/providers/sso.d.ts.map +1 -0
  48. package/dist/component/providers/totp.d.ts +45 -0
  49. package/dist/component/providers/totp.d.ts.map +1 -0
  50. package/dist/component/public/enterprise/audit.d.ts +73 -0
  51. package/dist/component/public/enterprise/audit.d.ts.map +1 -0
  52. package/dist/component/public/enterprise/audit.js +108 -0
  53. package/dist/component/public/enterprise/audit.js.map +1 -0
  54. package/dist/component/public/enterprise/core.d.ts +176 -0
  55. package/dist/component/public/enterprise/core.d.ts.map +1 -0
  56. package/dist/component/public/enterprise/core.js +292 -0
  57. package/dist/component/public/enterprise/core.js.map +1 -0
  58. package/dist/component/public/enterprise/domains.d.ts +174 -0
  59. package/dist/component/public/enterprise/domains.d.ts.map +1 -0
  60. package/dist/component/public/enterprise/domains.js +271 -0
  61. package/dist/component/public/enterprise/domains.js.map +1 -0
  62. package/dist/component/public/enterprise/scim.d.ts +245 -0
  63. package/dist/component/public/enterprise/scim.d.ts.map +1 -0
  64. package/dist/component/public/enterprise/scim.js +344 -0
  65. package/dist/component/public/enterprise/scim.js.map +1 -0
  66. package/dist/component/public/enterprise/secrets.d.ts +78 -0
  67. package/dist/component/public/enterprise/secrets.d.ts.map +1 -0
  68. package/dist/component/public/enterprise/secrets.js +118 -0
  69. package/dist/component/public/enterprise/secrets.js.map +1 -0
  70. package/dist/component/public/enterprise/webhooks.d.ts +211 -0
  71. package/dist/component/public/enterprise/webhooks.d.ts.map +1 -0
  72. package/dist/component/public/enterprise/webhooks.js +300 -0
  73. package/dist/component/public/enterprise/webhooks.js.map +1 -0
  74. package/dist/component/public/factors/devices.d.ts +157 -0
  75. package/dist/component/public/factors/devices.d.ts.map +1 -0
  76. package/dist/component/public/factors/devices.js +216 -0
  77. package/dist/component/public/factors/devices.js.map +1 -0
  78. package/dist/component/public/factors/passkeys.d.ts +175 -0
  79. package/dist/component/public/factors/passkeys.d.ts.map +1 -0
  80. package/dist/component/public/factors/passkeys.js +238 -0
  81. package/dist/component/public/factors/passkeys.js.map +1 -0
  82. package/dist/component/public/factors/totp.d.ts +189 -0
  83. package/dist/component/public/factors/totp.d.ts.map +1 -0
  84. package/dist/component/public/factors/totp.js +254 -0
  85. package/dist/component/public/factors/totp.js.map +1 -0
  86. package/dist/component/public/groups/core.d.ts +137 -0
  87. package/dist/component/public/groups/core.d.ts.map +1 -0
  88. package/dist/component/public/groups/core.js +321 -0
  89. package/dist/component/public/groups/core.js.map +1 -0
  90. package/dist/component/public/groups/invites.d.ts +217 -0
  91. package/dist/component/public/groups/invites.d.ts.map +1 -0
  92. package/dist/component/public/groups/invites.js +457 -0
  93. package/dist/component/public/groups/invites.js.map +1 -0
  94. package/dist/component/public/groups/members.d.ts +204 -0
  95. package/dist/component/public/groups/members.d.ts.map +1 -0
  96. package/dist/component/public/groups/members.js +355 -0
  97. package/dist/component/public/groups/members.js.map +1 -0
  98. package/dist/component/public/identity/accounts.d.ts +147 -0
  99. package/dist/component/public/identity/accounts.d.ts.map +1 -0
  100. package/dist/component/public/identity/accounts.js +200 -0
  101. package/dist/component/public/identity/accounts.js.map +1 -0
  102. package/dist/component/public/identity/codes.d.ts +104 -0
  103. package/dist/component/public/identity/codes.d.ts.map +1 -0
  104. package/dist/component/public/identity/codes.js +140 -0
  105. package/dist/component/public/identity/codes.js.map +1 -0
  106. package/dist/component/public/identity/sessions.d.ts +128 -0
  107. package/dist/component/public/identity/sessions.d.ts.map +1 -0
  108. package/dist/component/public/identity/sessions.js +192 -0
  109. package/dist/component/public/identity/sessions.js.map +1 -0
  110. package/dist/component/public/identity/tokens.d.ts +169 -0
  111. package/dist/component/public/identity/tokens.d.ts.map +1 -0
  112. package/dist/component/public/identity/tokens.js +227 -0
  113. package/dist/component/public/identity/tokens.js.map +1 -0
  114. package/dist/component/public/identity/users.d.ts +212 -0
  115. package/dist/component/public/identity/users.d.ts.map +1 -0
  116. package/dist/component/public/identity/users.js +311 -0
  117. package/dist/component/public/identity/users.js.map +1 -0
  118. package/dist/component/public/identity/verifiers.d.ts +116 -0
  119. package/dist/component/public/identity/verifiers.d.ts.map +1 -0
  120. package/dist/component/public/identity/verifiers.js +154 -0
  121. package/dist/component/public/identity/verifiers.js.map +1 -0
  122. package/dist/component/public/security/keys.d.ts +209 -0
  123. package/dist/component/public/security/keys.d.ts.map +1 -0
  124. package/dist/component/public/security/keys.js +319 -0
  125. package/dist/component/public/security/keys.js.map +1 -0
  126. package/dist/component/public/security/limits.d.ts +114 -0
  127. package/dist/component/public/security/limits.d.ts.map +1 -0
  128. package/dist/component/public/security/limits.js +169 -0
  129. package/dist/component/public/security/limits.js.map +1 -0
  130. package/dist/component/public.d.ts +24 -271
  131. package/dist/component/public.d.ts.map +1 -1
  132. package/dist/component/public.js +21 -1229
  133. package/dist/component/schema.d.ts +473 -110
  134. package/dist/component/schema.js +162 -73
  135. package/dist/component/schema.js.map +1 -1
  136. package/dist/component/server/auth.d.ts +318 -373
  137. package/dist/component/server/auth.d.ts.map +1 -1
  138. package/dist/component/server/auth.js +204 -123
  139. package/dist/component/server/auth.js.map +1 -1
  140. package/dist/component/server/authError.js +34 -0
  141. package/dist/component/server/authError.js.map +1 -0
  142. package/dist/component/server/{providers.js → config.js} +43 -12
  143. package/dist/component/server/config.js.map +1 -0
  144. package/dist/component/server/cookies.js +3 -0
  145. package/dist/component/server/cookies.js.map +1 -1
  146. package/dist/component/server/core.js +713 -0
  147. package/dist/component/server/core.js.map +1 -0
  148. package/dist/component/server/crypto.js +38 -0
  149. package/dist/component/server/crypto.js.map +1 -0
  150. package/dist/component/server/{implementation/db.js → db.js} +2 -1
  151. package/dist/component/server/db.js.map +1 -0
  152. package/dist/component/server/device.js +109 -0
  153. package/dist/component/server/device.js.map +1 -0
  154. package/dist/component/server/enterprise/config.js +46 -0
  155. package/dist/component/server/enterprise/config.js.map +1 -0
  156. package/dist/component/server/enterprise/domain.js +885 -0
  157. package/dist/component/server/enterprise/domain.js.map +1 -0
  158. package/dist/component/server/enterprise/http.js +766 -0
  159. package/dist/component/server/enterprise/http.js.map +1 -0
  160. package/dist/component/server/enterprise/oidc.js +248 -0
  161. package/dist/component/server/enterprise/oidc.js.map +1 -0
  162. package/dist/component/server/enterprise/policy.js +85 -0
  163. package/dist/component/server/enterprise/policy.js.map +1 -0
  164. package/dist/component/server/enterprise/saml.js +338 -0
  165. package/dist/component/server/enterprise/saml.js.map +1 -0
  166. package/dist/component/server/enterprise/scim.js +97 -0
  167. package/dist/component/server/enterprise/scim.js.map +1 -0
  168. package/dist/component/server/enterprise/shared.js +51 -0
  169. package/dist/component/server/enterprise/shared.js.map +1 -0
  170. package/dist/component/server/errors.d.ts +1 -0
  171. package/dist/component/server/errors.js +24 -16
  172. package/dist/component/server/errors.js.map +1 -1
  173. package/dist/component/server/http.js +288 -0
  174. package/dist/component/server/http.js.map +1 -0
  175. package/dist/component/server/identity.js +13 -0
  176. package/dist/component/server/identity.js.map +1 -0
  177. package/dist/{server/implementation → component/server}/keys.js +9 -31
  178. package/dist/component/server/keys.js.map +1 -0
  179. package/dist/component/server/limits.js +61 -0
  180. package/dist/component/server/limits.js.map +1 -0
  181. package/dist/component/server/mutations/account.js +44 -0
  182. package/dist/component/server/mutations/account.js.map +1 -0
  183. package/dist/component/server/{implementation/mutations → mutations}/code.js +7 -4
  184. package/dist/component/server/mutations/code.js.map +1 -0
  185. package/dist/component/server/mutations/invalidate.js +32 -0
  186. package/dist/component/server/mutations/invalidate.js.map +1 -0
  187. package/dist/component/server/mutations/oauth.js +110 -0
  188. package/dist/component/server/mutations/oauth.js.map +1 -0
  189. package/dist/component/server/mutations/refresh.js +119 -0
  190. package/dist/component/server/mutations/refresh.js.map +1 -0
  191. package/dist/component/server/mutations/register.js +83 -0
  192. package/dist/component/server/mutations/register.js.map +1 -0
  193. package/dist/component/server/mutations/retrieve.js +65 -0
  194. package/dist/component/server/mutations/retrieve.js.map +1 -0
  195. package/dist/component/server/mutations/signature.js +32 -0
  196. package/dist/component/server/mutations/signature.js.map +1 -0
  197. package/dist/component/server/{implementation/mutations → mutations}/signin.js +2 -2
  198. package/dist/component/server/mutations/signin.js.map +1 -0
  199. package/dist/component/server/mutations/signout.js +27 -0
  200. package/dist/component/server/mutations/signout.js.map +1 -0
  201. package/dist/component/server/mutations/store/refs.js +15 -0
  202. package/dist/component/server/mutations/store/refs.js.map +1 -0
  203. package/dist/component/server/mutations/store.js +85 -0
  204. package/dist/component/server/mutations/store.js.map +1 -0
  205. package/dist/component/server/mutations/verifier.js +18 -0
  206. package/dist/component/server/mutations/verifier.js.map +1 -0
  207. package/dist/component/server/mutations/verify.js +98 -0
  208. package/dist/component/server/mutations/verify.js.map +1 -0
  209. package/dist/component/server/oauth.js +106 -60
  210. package/dist/component/server/oauth.js.map +1 -1
  211. package/dist/component/server/passkey.js +328 -0
  212. package/dist/component/server/passkey.js.map +1 -0
  213. package/dist/{server/implementation → component/server}/redirects.js +13 -11
  214. package/dist/component/server/redirects.js.map +1 -0
  215. package/dist/component/server/refresh.js +96 -0
  216. package/dist/component/server/refresh.js.map +1 -0
  217. package/dist/component/server/runtime.d.ts +136 -0
  218. package/dist/component/server/runtime.d.ts.map +1 -0
  219. package/dist/component/server/runtime.js +413 -0
  220. package/dist/component/server/runtime.js.map +1 -0
  221. package/dist/{server/implementation → component/server}/sessions.js +14 -8
  222. package/dist/component/server/sessions.js.map +1 -0
  223. package/dist/component/server/signin.js +201 -0
  224. package/dist/component/server/signin.js.map +1 -0
  225. package/dist/component/server/tokens.js +17 -0
  226. package/dist/component/server/tokens.js.map +1 -0
  227. package/dist/component/server/totp.js +148 -0
  228. package/dist/component/server/totp.js.map +1 -0
  229. package/dist/component/server/types.d.ts +387 -298
  230. package/dist/component/server/types.d.ts.map +1 -1
  231. package/dist/component/server/{implementation/types.js → types.js} +1 -1
  232. package/dist/component/server/types.js.map +1 -0
  233. package/dist/component/server/{implementation/users.js → users.js} +54 -35
  234. package/dist/component/server/users.js.map +1 -0
  235. package/dist/component/server/utils.js +110 -4
  236. package/dist/component/server/utils.js.map +1 -1
  237. package/dist/core/types.d.ts +369 -0
  238. package/dist/core/types.d.ts.map +1 -0
  239. package/dist/factors/device.js +105 -0
  240. package/dist/factors/device.js.map +1 -0
  241. package/dist/factors/passkey.js +181 -0
  242. package/dist/factors/passkey.js.map +1 -0
  243. package/dist/factors/totp.js +122 -0
  244. package/dist/factors/totp.js.map +1 -0
  245. package/dist/providers/anonymous.d.ts +3 -9
  246. package/dist/providers/anonymous.d.ts.map +1 -1
  247. package/dist/providers/anonymous.js +1 -18
  248. package/dist/providers/anonymous.js.map +1 -1
  249. package/dist/providers/credentials.d.ts +8 -10
  250. package/dist/providers/credentials.d.ts.map +1 -1
  251. package/dist/providers/credentials.js +3 -5
  252. package/dist/providers/credentials.js.map +1 -1
  253. package/dist/providers/device.d.ts +18 -10
  254. package/dist/providers/device.d.ts.map +1 -1
  255. package/dist/providers/device.js +4 -8
  256. package/dist/providers/device.js.map +1 -1
  257. package/dist/providers/email.d.ts +50 -23
  258. package/dist/providers/email.d.ts.map +1 -1
  259. package/dist/providers/email.js +58 -34
  260. package/dist/providers/email.js.map +1 -1
  261. package/dist/providers/index.d.ts +7 -3
  262. package/dist/providers/index.js +4 -1
  263. package/dist/providers/oauth.d.ts.map +1 -1
  264. package/dist/providers/oauth.js.map +1 -1
  265. package/dist/providers/passkey.d.ts +12 -9
  266. package/dist/providers/passkey.d.ts.map +1 -1
  267. package/dist/providers/passkey.js +1 -7
  268. package/dist/providers/passkey.js.map +1 -1
  269. package/dist/providers/password.d.ts +6 -12
  270. package/dist/providers/password.d.ts.map +1 -1
  271. package/dist/providers/password.js +189 -89
  272. package/dist/providers/password.js.map +1 -1
  273. package/dist/providers/phone.d.ts +40 -11
  274. package/dist/providers/phone.d.ts.map +1 -1
  275. package/dist/providers/phone.js +52 -21
  276. package/dist/providers/phone.js.map +1 -1
  277. package/dist/providers/sso.d.ts +50 -0
  278. package/dist/providers/sso.d.ts.map +1 -0
  279. package/dist/providers/sso.js +34 -0
  280. package/dist/providers/sso.js.map +1 -0
  281. package/dist/providers/totp.d.ts +12 -9
  282. package/dist/providers/totp.d.ts.map +1 -1
  283. package/dist/providers/totp.js +1 -7
  284. package/dist/providers/totp.js.map +1 -1
  285. package/dist/runtime/browser.js +68 -0
  286. package/dist/runtime/browser.js.map +1 -0
  287. package/dist/runtime/invite.js +51 -0
  288. package/dist/runtime/invite.js.map +1 -0
  289. package/dist/runtime/proxy.js +70 -0
  290. package/dist/runtime/proxy.js.map +1 -0
  291. package/dist/runtime/storage.js +37 -0
  292. package/dist/runtime/storage.js.map +1 -0
  293. package/dist/server/auth.d.ts +335 -370
  294. package/dist/server/auth.d.ts.map +1 -1
  295. package/dist/server/auth.js +204 -123
  296. package/dist/server/auth.js.map +1 -1
  297. package/dist/server/authError.d.ts +46 -0
  298. package/dist/server/authError.d.ts.map +1 -0
  299. package/dist/server/authError.js +34 -0
  300. package/dist/server/authError.js.map +1 -0
  301. package/dist/server/config.d.ts +1 -0
  302. package/dist/server/{providers.js → config.js} +43 -12
  303. package/dist/server/config.js.map +1 -0
  304. package/dist/server/cookies.d.ts +1 -38
  305. package/dist/server/cookies.js +3 -0
  306. package/dist/server/cookies.js.map +1 -1
  307. package/dist/server/core.d.ts +1436 -0
  308. package/dist/server/core.d.ts.map +1 -0
  309. package/dist/server/core.js +713 -0
  310. package/dist/server/core.js.map +1 -0
  311. package/dist/server/crypto.d.ts +8 -0
  312. package/dist/server/crypto.d.ts.map +1 -0
  313. package/dist/server/crypto.js +38 -0
  314. package/dist/server/crypto.js.map +1 -0
  315. package/dist/server/db.d.ts +1 -0
  316. package/dist/server/{implementation/db.js → db.js} +2 -1
  317. package/dist/server/db.js.map +1 -0
  318. package/dist/server/device.d.ts +1 -0
  319. package/dist/server/device.js +109 -0
  320. package/dist/server/device.js.map +1 -0
  321. package/dist/server/enterprise/config.d.ts +1 -0
  322. package/dist/server/enterprise/config.js +46 -0
  323. package/dist/server/enterprise/config.js.map +1 -0
  324. package/dist/server/enterprise/domain.d.ts +409 -0
  325. package/dist/server/enterprise/domain.d.ts.map +1 -0
  326. package/dist/server/enterprise/domain.js +885 -0
  327. package/dist/server/enterprise/domain.js.map +1 -0
  328. package/dist/server/enterprise/http.d.ts +26 -0
  329. package/dist/server/enterprise/http.d.ts.map +1 -0
  330. package/dist/server/enterprise/http.js +766 -0
  331. package/dist/server/enterprise/http.js.map +1 -0
  332. package/dist/server/enterprise/oidc.d.ts +1 -0
  333. package/dist/server/enterprise/oidc.js +248 -0
  334. package/dist/server/enterprise/oidc.js.map +1 -0
  335. package/dist/server/enterprise/policy.d.ts +1 -0
  336. package/dist/server/enterprise/policy.js +85 -0
  337. package/dist/server/enterprise/policy.js.map +1 -0
  338. package/dist/server/enterprise/saml.d.ts +1 -0
  339. package/dist/server/enterprise/saml.js +338 -0
  340. package/dist/server/enterprise/saml.js.map +1 -0
  341. package/dist/server/enterprise/scim.d.ts +1 -0
  342. package/dist/server/enterprise/scim.js +97 -0
  343. package/dist/server/enterprise/scim.js.map +1 -0
  344. package/dist/server/enterprise/shared.d.ts +5 -0
  345. package/dist/server/enterprise/shared.d.ts.map +1 -0
  346. package/dist/server/enterprise/shared.js +51 -0
  347. package/dist/server/enterprise/shared.js.map +1 -0
  348. package/dist/server/enterprise/validators.d.ts +1 -0
  349. package/dist/server/enterprise/validators.js +60 -0
  350. package/dist/server/enterprise/validators.js.map +1 -0
  351. package/dist/server/errors.d.ts +33 -1
  352. package/dist/server/errors.d.ts.map +1 -1
  353. package/dist/server/errors.js +44 -1
  354. package/dist/server/errors.js.map +1 -1
  355. package/dist/server/http.d.ts +59 -0
  356. package/dist/server/http.d.ts.map +1 -0
  357. package/dist/server/http.js +288 -0
  358. package/dist/server/http.js.map +1 -0
  359. package/dist/server/identity.d.ts +1 -0
  360. package/dist/server/identity.js +13 -0
  361. package/dist/server/identity.js.map +1 -0
  362. package/dist/server/index.d.ts +4 -182
  363. package/dist/server/index.js +4 -376
  364. package/dist/server/keys.d.ts +1 -0
  365. package/dist/{component/server/implementation → server}/keys.js +9 -31
  366. package/dist/server/keys.js.map +1 -0
  367. package/dist/server/limits.d.ts +1 -0
  368. package/dist/server/limits.js +61 -0
  369. package/dist/server/limits.js.map +1 -0
  370. package/dist/server/mounts.d.ts +647 -0
  371. package/dist/server/mounts.d.ts.map +1 -0
  372. package/dist/server/mounts.js +643 -0
  373. package/dist/server/mounts.js.map +1 -0
  374. package/dist/server/mutations/account.d.ts +30 -0
  375. package/dist/server/mutations/account.d.ts.map +1 -0
  376. package/dist/server/mutations/account.js +44 -0
  377. package/dist/server/mutations/account.js.map +1 -0
  378. package/dist/server/mutations/code.d.ts +30 -0
  379. package/dist/server/mutations/code.d.ts.map +1 -0
  380. package/dist/server/{implementation/mutations → mutations}/code.js +7 -4
  381. package/dist/server/mutations/code.js.map +1 -0
  382. package/dist/server/mutations/index.d.ts +14 -0
  383. package/dist/server/mutations/index.js +15 -0
  384. package/dist/server/mutations/invalidate.d.ts +20 -0
  385. package/dist/server/mutations/invalidate.d.ts.map +1 -0
  386. package/dist/server/mutations/invalidate.js +32 -0
  387. package/dist/server/mutations/invalidate.js.map +1 -0
  388. package/dist/server/mutations/oauth.d.ts +28 -0
  389. package/dist/server/mutations/oauth.d.ts.map +1 -0
  390. package/dist/server/mutations/oauth.js +110 -0
  391. package/dist/server/mutations/oauth.js.map +1 -0
  392. package/dist/server/mutations/refresh.d.ts +21 -0
  393. package/dist/server/mutations/refresh.d.ts.map +1 -0
  394. package/dist/server/mutations/refresh.js +119 -0
  395. package/dist/server/mutations/refresh.js.map +1 -0
  396. package/dist/server/mutations/register.d.ts +38 -0
  397. package/dist/server/mutations/register.d.ts.map +1 -0
  398. package/dist/server/mutations/register.js +83 -0
  399. package/dist/server/mutations/register.js.map +1 -0
  400. package/dist/server/mutations/retrieve.d.ts +33 -0
  401. package/dist/server/mutations/retrieve.d.ts.map +1 -0
  402. package/dist/server/mutations/retrieve.js +65 -0
  403. package/dist/server/mutations/retrieve.js.map +1 -0
  404. package/dist/server/mutations/signature.d.ts +22 -0
  405. package/dist/server/mutations/signature.d.ts.map +1 -0
  406. package/dist/server/mutations/signature.js +32 -0
  407. package/dist/server/mutations/signature.js.map +1 -0
  408. package/dist/server/mutations/signin.d.ts +22 -0
  409. package/dist/server/mutations/signin.d.ts.map +1 -0
  410. package/dist/server/{implementation/mutations → mutations}/signin.js +2 -2
  411. package/dist/server/mutations/signin.js.map +1 -0
  412. package/dist/server/mutations/signout.d.ts +16 -0
  413. package/dist/server/mutations/signout.d.ts.map +1 -0
  414. package/dist/server/mutations/signout.js +27 -0
  415. package/dist/server/mutations/signout.js.map +1 -0
  416. package/dist/server/mutations/store/refs.d.ts +12 -0
  417. package/dist/server/mutations/store/refs.d.ts.map +1 -0
  418. package/dist/server/mutations/store/refs.js +15 -0
  419. package/dist/server/mutations/store/refs.js.map +1 -0
  420. package/dist/server/mutations/store.d.ts +306 -0
  421. package/dist/server/mutations/store.d.ts.map +1 -0
  422. package/dist/server/mutations/store.js +85 -0
  423. package/dist/server/mutations/store.js.map +1 -0
  424. package/dist/server/mutations/verifier.d.ts +13 -0
  425. package/dist/server/mutations/verifier.d.ts.map +1 -0
  426. package/dist/server/mutations/verifier.js +18 -0
  427. package/dist/server/mutations/verifier.js.map +1 -0
  428. package/dist/server/mutations/verify.d.ts +26 -0
  429. package/dist/server/mutations/verify.d.ts.map +1 -0
  430. package/dist/server/mutations/verify.js +98 -0
  431. package/dist/server/mutations/verify.js.map +1 -0
  432. package/dist/server/oauth.d.ts +1 -48
  433. package/dist/server/oauth.js +107 -64
  434. package/dist/server/oauth.js.map +1 -1
  435. package/dist/server/passkey.d.ts +27 -0
  436. package/dist/server/passkey.d.ts.map +1 -0
  437. package/dist/server/passkey.js +328 -0
  438. package/dist/server/passkey.js.map +1 -0
  439. package/dist/server/redirects.d.ts +1 -0
  440. package/dist/{component/server/implementation → server}/redirects.js +13 -11
  441. package/dist/server/redirects.js.map +1 -0
  442. package/dist/server/refresh.d.ts +1 -0
  443. package/dist/server/refresh.js +96 -0
  444. package/dist/server/refresh.js.map +1 -0
  445. package/dist/server/runtime.d.ts +136 -0
  446. package/dist/server/runtime.d.ts.map +1 -0
  447. package/dist/server/runtime.js +413 -0
  448. package/dist/server/runtime.js.map +1 -0
  449. package/dist/server/sessions.d.ts +1 -0
  450. package/dist/{component/server/implementation → server}/sessions.js +14 -8
  451. package/dist/server/sessions.js.map +1 -0
  452. package/dist/server/signin.d.ts +1 -0
  453. package/dist/server/signin.js +201 -0
  454. package/dist/server/signin.js.map +1 -0
  455. package/dist/server/ssr.d.ts +226 -0
  456. package/dist/server/ssr.d.ts.map +1 -0
  457. package/dist/server/ssr.js +786 -0
  458. package/dist/server/ssr.js.map +1 -0
  459. package/dist/server/templates.d.ts +1 -21
  460. package/dist/server/templates.js +2 -1
  461. package/dist/server/templates.js.map +1 -1
  462. package/dist/server/tokens.d.ts +1 -0
  463. package/dist/server/tokens.js +17 -0
  464. package/dist/server/tokens.js.map +1 -0
  465. package/dist/server/totp.d.ts +1 -0
  466. package/dist/server/totp.js +148 -0
  467. package/dist/server/totp.js.map +1 -0
  468. package/dist/server/types.d.ts +498 -306
  469. package/dist/server/types.d.ts.map +1 -1
  470. package/dist/server/types.js +108 -1
  471. package/dist/server/types.js.map +1 -0
  472. package/dist/server/users.d.ts +1 -0
  473. package/dist/server/{implementation/users.js → users.js} +54 -35
  474. package/dist/server/users.js.map +1 -0
  475. package/dist/server/utils.d.ts +1 -6
  476. package/dist/server/utils.js +110 -4
  477. package/dist/server/utils.js.map +1 -1
  478. package/package.json +49 -46
  479. package/src/authorization/index.ts +83 -0
  480. package/src/cli/bin.ts +5 -0
  481. package/src/cli/command.ts +6 -5
  482. package/src/cli/index.ts +456 -248
  483. package/src/cli/keys.ts +3 -0
  484. package/src/client/core/types.ts +437 -0
  485. package/src/client/factors/device.ts +160 -0
  486. package/src/client/factors/passkey.ts +282 -0
  487. package/src/client/factors/totp.ts +150 -0
  488. package/src/client/index.ts +745 -989
  489. package/src/client/runtime/browser.ts +112 -0
  490. package/src/client/runtime/invite.ts +65 -0
  491. package/src/client/runtime/proxy.ts +111 -0
  492. package/src/client/runtime/storage.ts +79 -0
  493. package/src/component/_generated/api.ts +42 -0
  494. package/src/component/_generated/component.ts +3123 -102
  495. package/src/component/functions.ts +38 -22
  496. package/src/component/index.ts +10 -20
  497. package/src/component/model.ts +449 -0
  498. package/src/component/public/enterprise/audit.ts +120 -0
  499. package/src/component/public/enterprise/core.ts +354 -0
  500. package/src/component/public/enterprise/domains.ts +323 -0
  501. package/src/component/public/enterprise/scim.ts +396 -0
  502. package/src/component/public/enterprise/secrets.ts +132 -0
  503. package/src/component/public/enterprise/webhooks.ts +306 -0
  504. package/src/component/public/factors/devices.ts +223 -0
  505. package/src/component/public/factors/passkeys.ts +242 -0
  506. package/src/component/public/factors/totp.ts +258 -0
  507. package/src/component/public/groups/core.ts +481 -0
  508. package/src/component/public/groups/invites.ts +602 -0
  509. package/src/component/public/groups/members.ts +409 -0
  510. package/src/component/public/identity/accounts.ts +206 -0
  511. package/src/component/public/identity/codes.ts +148 -0
  512. package/src/component/public/identity/sessions.ts +209 -0
  513. package/src/component/public/identity/tokens.ts +250 -0
  514. package/src/component/public/identity/users.ts +354 -0
  515. package/src/component/public/identity/verifiers.ts +157 -0
  516. package/src/component/public/security/keys.ts +365 -0
  517. package/src/component/public/security/limits.ts +173 -0
  518. package/src/component/public.ts +26 -1766
  519. package/src/component/schema.ts +273 -100
  520. package/src/providers/anonymous.ts +10 -20
  521. package/src/providers/credentials.ts +14 -22
  522. package/src/providers/device.ts +3 -14
  523. package/src/providers/email.ts +83 -47
  524. package/src/providers/index.ts +7 -0
  525. package/src/providers/oauth.ts +5 -3
  526. package/src/providers/passkey.ts +0 -13
  527. package/src/providers/password.ts +307 -130
  528. package/src/providers/phone.ts +81 -37
  529. package/src/providers/sso.ts +54 -0
  530. package/src/providers/totp.ts +0 -13
  531. package/src/samlify.d.ts +53 -0
  532. package/src/server/auth.ts +701 -247
  533. package/src/server/authError.ts +44 -0
  534. package/src/server/{providers.ts → config.ts} +84 -15
  535. package/src/server/cookies.ts +8 -1
  536. package/src/server/core.ts +2095 -0
  537. package/src/server/crypto.ts +88 -0
  538. package/src/server/{implementation/db.ts → db.ts} +90 -15
  539. package/src/server/device.ts +221 -0
  540. package/src/server/enterprise/config.ts +51 -0
  541. package/src/server/enterprise/domain.ts +1751 -0
  542. package/src/server/enterprise/http.ts +1324 -0
  543. package/src/server/enterprise/oidc.ts +500 -0
  544. package/src/server/enterprise/policy.ts +128 -0
  545. package/src/server/enterprise/saml.ts +578 -0
  546. package/src/server/enterprise/scim.ts +135 -0
  547. package/src/server/enterprise/shared.ts +134 -0
  548. package/src/server/enterprise/validators.ts +93 -0
  549. package/src/server/errors.ts +130 -119
  550. package/src/server/http.ts +531 -0
  551. package/src/server/identity.ts +18 -0
  552. package/src/server/index.ts +32 -650
  553. package/src/server/{implementation/keys.ts → keys.ts} +16 -44
  554. package/src/server/limits.ts +134 -0
  555. package/src/server/mounts.ts +948 -0
  556. package/src/server/mutations/account.ts +76 -0
  557. package/src/server/{implementation/mutations → mutations}/code.ts +22 -11
  558. package/src/server/mutations/index.ts +13 -0
  559. package/src/server/mutations/invalidate.ts +50 -0
  560. package/src/server/mutations/oauth.ts +237 -0
  561. package/src/server/mutations/refresh.ts +298 -0
  562. package/src/server/mutations/register.ts +200 -0
  563. package/src/server/mutations/retrieve.ts +109 -0
  564. package/src/server/mutations/signature.ts +50 -0
  565. package/src/server/{implementation/mutations → mutations}/signin.ts +9 -7
  566. package/src/server/mutations/signout.ts +43 -0
  567. package/src/server/mutations/store/refs.ts +10 -0
  568. package/src/server/mutations/store.ts +138 -0
  569. package/src/server/mutations/verifier.ts +34 -0
  570. package/src/server/mutations/verify.ts +202 -0
  571. package/src/server/oauth.ts +243 -131
  572. package/src/server/passkey.ts +784 -0
  573. package/src/server/{implementation/redirects.ts → redirects.ts} +21 -16
  574. package/src/server/refresh.ts +222 -0
  575. package/src/server/runtime.ts +880 -0
  576. package/src/server/{implementation/sessions.ts → sessions.ts} +33 -25
  577. package/src/server/signin.ts +438 -0
  578. package/src/server/ssr.ts +1764 -0
  579. package/src/server/templates.ts +8 -3
  580. package/src/server/{implementation/tokens.ts → tokens.ts} +11 -5
  581. package/src/server/totp.ts +349 -0
  582. package/src/server/types.ts +972 -207
  583. package/src/server/{implementation/users.ts → users.ts} +129 -75
  584. package/src/server/utils.ts +192 -5
  585. package/src/test.ts +28 -4
  586. package/dist/bin.cjs +0 -27757
  587. package/dist/component/providers/email.js +0 -47
  588. package/dist/component/providers/email.js.map +0 -1
  589. package/dist/component/public.js.map +0 -1
  590. package/dist/component/server/implementation/db.js.map +0 -1
  591. package/dist/component/server/implementation/device.js +0 -135
  592. package/dist/component/server/implementation/device.js.map +0 -1
  593. package/dist/component/server/implementation/index.d.ts +0 -870
  594. package/dist/component/server/implementation/index.d.ts.map +0 -1
  595. package/dist/component/server/implementation/index.js +0 -610
  596. package/dist/component/server/implementation/index.js.map +0 -1
  597. package/dist/component/server/implementation/keys.js.map +0 -1
  598. package/dist/component/server/implementation/mutations/account.js +0 -39
  599. package/dist/component/server/implementation/mutations/account.js.map +0 -1
  600. package/dist/component/server/implementation/mutations/code.js.map +0 -1
  601. package/dist/component/server/implementation/mutations/index.js +0 -70
  602. package/dist/component/server/implementation/mutations/index.js.map +0 -1
  603. package/dist/component/server/implementation/mutations/invalidate.js +0 -29
  604. package/dist/component/server/implementation/mutations/invalidate.js.map +0 -1
  605. package/dist/component/server/implementation/mutations/oauth.js +0 -51
  606. package/dist/component/server/implementation/mutations/oauth.js.map +0 -1
  607. package/dist/component/server/implementation/mutations/refresh.js +0 -85
  608. package/dist/component/server/implementation/mutations/refresh.js.map +0 -1
  609. package/dist/component/server/implementation/mutations/register.js +0 -65
  610. package/dist/component/server/implementation/mutations/register.js.map +0 -1
  611. package/dist/component/server/implementation/mutations/retrieve.js +0 -50
  612. package/dist/component/server/implementation/mutations/retrieve.js.map +0 -1
  613. package/dist/component/server/implementation/mutations/signature.js +0 -27
  614. package/dist/component/server/implementation/mutations/signature.js.map +0 -1
  615. package/dist/component/server/implementation/mutations/signin.js.map +0 -1
  616. package/dist/component/server/implementation/mutations/signout.js +0 -27
  617. package/dist/component/server/implementation/mutations/signout.js.map +0 -1
  618. package/dist/component/server/implementation/mutations/store.js +0 -12
  619. package/dist/component/server/implementation/mutations/store.js.map +0 -1
  620. package/dist/component/server/implementation/mutations/verifier.js +0 -16
  621. package/dist/component/server/implementation/mutations/verifier.js.map +0 -1
  622. package/dist/component/server/implementation/mutations/verify.js +0 -105
  623. package/dist/component/server/implementation/mutations/verify.js.map +0 -1
  624. package/dist/component/server/implementation/passkey.js +0 -307
  625. package/dist/component/server/implementation/passkey.js.map +0 -1
  626. package/dist/component/server/implementation/provider.js +0 -19
  627. package/dist/component/server/implementation/provider.js.map +0 -1
  628. package/dist/component/server/implementation/ratelimit.js +0 -48
  629. package/dist/component/server/implementation/ratelimit.js.map +0 -1
  630. package/dist/component/server/implementation/redirects.js.map +0 -1
  631. package/dist/component/server/implementation/refresh.js +0 -109
  632. package/dist/component/server/implementation/refresh.js.map +0 -1
  633. package/dist/component/server/implementation/sessions.js.map +0 -1
  634. package/dist/component/server/implementation/signin.js +0 -148
  635. package/dist/component/server/implementation/signin.js.map +0 -1
  636. package/dist/component/server/implementation/tokens.js +0 -15
  637. package/dist/component/server/implementation/tokens.js.map +0 -1
  638. package/dist/component/server/implementation/totp.js +0 -142
  639. package/dist/component/server/implementation/totp.js.map +0 -1
  640. package/dist/component/server/implementation/types.d.ts +0 -42
  641. package/dist/component/server/implementation/types.d.ts.map +0 -1
  642. package/dist/component/server/implementation/types.js.map +0 -1
  643. package/dist/component/server/implementation/users.js.map +0 -1
  644. package/dist/component/server/implementation/utils.js +0 -56
  645. package/dist/component/server/implementation/utils.js.map +0 -1
  646. package/dist/component/server/providers.js.map +0 -1
  647. package/dist/component/server/templates.js +0 -84
  648. package/dist/component/server/templates.js.map +0 -1
  649. package/dist/server/cookies.d.ts.map +0 -1
  650. package/dist/server/implementation/db.d.ts +0 -86
  651. package/dist/server/implementation/db.d.ts.map +0 -1
  652. package/dist/server/implementation/db.js.map +0 -1
  653. package/dist/server/implementation/device.d.ts +0 -30
  654. package/dist/server/implementation/device.d.ts.map +0 -1
  655. package/dist/server/implementation/device.js +0 -135
  656. package/dist/server/implementation/device.js.map +0 -1
  657. package/dist/server/implementation/index.d.ts +0 -870
  658. package/dist/server/implementation/index.d.ts.map +0 -1
  659. package/dist/server/implementation/index.js +0 -610
  660. package/dist/server/implementation/index.js.map +0 -1
  661. package/dist/server/implementation/keys.d.ts +0 -66
  662. package/dist/server/implementation/keys.d.ts.map +0 -1
  663. package/dist/server/implementation/keys.js.map +0 -1
  664. package/dist/server/implementation/mutations/account.d.ts +0 -27
  665. package/dist/server/implementation/mutations/account.d.ts.map +0 -1
  666. package/dist/server/implementation/mutations/account.js +0 -39
  667. package/dist/server/implementation/mutations/account.js.map +0 -1
  668. package/dist/server/implementation/mutations/code.d.ts +0 -29
  669. package/dist/server/implementation/mutations/code.d.ts.map +0 -1
  670. package/dist/server/implementation/mutations/code.js.map +0 -1
  671. package/dist/server/implementation/mutations/index.d.ts +0 -310
  672. package/dist/server/implementation/mutations/index.d.ts.map +0 -1
  673. package/dist/server/implementation/mutations/index.js +0 -70
  674. package/dist/server/implementation/mutations/index.js.map +0 -1
  675. package/dist/server/implementation/mutations/invalidate.d.ts +0 -18
  676. package/dist/server/implementation/mutations/invalidate.d.ts.map +0 -1
  677. package/dist/server/implementation/mutations/invalidate.js +0 -29
  678. package/dist/server/implementation/mutations/invalidate.js.map +0 -1
  679. package/dist/server/implementation/mutations/oauth.d.ts +0 -23
  680. package/dist/server/implementation/mutations/oauth.d.ts.map +0 -1
  681. package/dist/server/implementation/mutations/oauth.js +0 -51
  682. package/dist/server/implementation/mutations/oauth.js.map +0 -1
  683. package/dist/server/implementation/mutations/refresh.d.ts +0 -20
  684. package/dist/server/implementation/mutations/refresh.d.ts.map +0 -1
  685. package/dist/server/implementation/mutations/refresh.js +0 -85
  686. package/dist/server/implementation/mutations/refresh.js.map +0 -1
  687. package/dist/server/implementation/mutations/register.d.ts +0 -37
  688. package/dist/server/implementation/mutations/register.d.ts.map +0 -1
  689. package/dist/server/implementation/mutations/register.js +0 -65
  690. package/dist/server/implementation/mutations/register.js.map +0 -1
  691. package/dist/server/implementation/mutations/retrieve.d.ts +0 -31
  692. package/dist/server/implementation/mutations/retrieve.d.ts.map +0 -1
  693. package/dist/server/implementation/mutations/retrieve.js +0 -50
  694. package/dist/server/implementation/mutations/retrieve.js.map +0 -1
  695. package/dist/server/implementation/mutations/signature.d.ts +0 -19
  696. package/dist/server/implementation/mutations/signature.d.ts.map +0 -1
  697. package/dist/server/implementation/mutations/signature.js +0 -27
  698. package/dist/server/implementation/mutations/signature.js.map +0 -1
  699. package/dist/server/implementation/mutations/signin.d.ts +0 -21
  700. package/dist/server/implementation/mutations/signin.d.ts.map +0 -1
  701. package/dist/server/implementation/mutations/signin.js.map +0 -1
  702. package/dist/server/implementation/mutations/signout.d.ts +0 -14
  703. package/dist/server/implementation/mutations/signout.d.ts.map +0 -1
  704. package/dist/server/implementation/mutations/signout.js +0 -27
  705. package/dist/server/implementation/mutations/signout.js.map +0 -1
  706. package/dist/server/implementation/mutations/store.d.ts +0 -11
  707. package/dist/server/implementation/mutations/store.d.ts.map +0 -1
  708. package/dist/server/implementation/mutations/store.js +0 -12
  709. package/dist/server/implementation/mutations/store.js.map +0 -1
  710. package/dist/server/implementation/mutations/verifier.d.ts +0 -11
  711. package/dist/server/implementation/mutations/verifier.d.ts.map +0 -1
  712. package/dist/server/implementation/mutations/verifier.js +0 -16
  713. package/dist/server/implementation/mutations/verifier.js.map +0 -1
  714. package/dist/server/implementation/mutations/verify.d.ts +0 -25
  715. package/dist/server/implementation/mutations/verify.d.ts.map +0 -1
  716. package/dist/server/implementation/mutations/verify.js +0 -105
  717. package/dist/server/implementation/mutations/verify.js.map +0 -1
  718. package/dist/server/implementation/passkey.d.ts +0 -24
  719. package/dist/server/implementation/passkey.d.ts.map +0 -1
  720. package/dist/server/implementation/passkey.js +0 -307
  721. package/dist/server/implementation/passkey.js.map +0 -1
  722. package/dist/server/implementation/provider.d.ts +0 -10
  723. package/dist/server/implementation/provider.d.ts.map +0 -1
  724. package/dist/server/implementation/provider.js +0 -19
  725. package/dist/server/implementation/provider.js.map +0 -1
  726. package/dist/server/implementation/ratelimit.d.ts +0 -10
  727. package/dist/server/implementation/ratelimit.d.ts.map +0 -1
  728. package/dist/server/implementation/ratelimit.js +0 -48
  729. package/dist/server/implementation/ratelimit.js.map +0 -1
  730. package/dist/server/implementation/redirects.d.ts +0 -10
  731. package/dist/server/implementation/redirects.d.ts.map +0 -1
  732. package/dist/server/implementation/redirects.js.map +0 -1
  733. package/dist/server/implementation/refresh.d.ts +0 -37
  734. package/dist/server/implementation/refresh.d.ts.map +0 -1
  735. package/dist/server/implementation/refresh.js +0 -109
  736. package/dist/server/implementation/refresh.js.map +0 -1
  737. package/dist/server/implementation/sessions.d.ts +0 -29
  738. package/dist/server/implementation/sessions.d.ts.map +0 -1
  739. package/dist/server/implementation/sessions.js.map +0 -1
  740. package/dist/server/implementation/signin.d.ts +0 -55
  741. package/dist/server/implementation/signin.d.ts.map +0 -1
  742. package/dist/server/implementation/signin.js +0 -148
  743. package/dist/server/implementation/signin.js.map +0 -1
  744. package/dist/server/implementation/tokens.d.ts +0 -11
  745. package/dist/server/implementation/tokens.d.ts.map +0 -1
  746. package/dist/server/implementation/tokens.js +0 -15
  747. package/dist/server/implementation/tokens.js.map +0 -1
  748. package/dist/server/implementation/totp.d.ts +0 -31
  749. package/dist/server/implementation/totp.d.ts.map +0 -1
  750. package/dist/server/implementation/totp.js +0 -142
  751. package/dist/server/implementation/totp.js.map +0 -1
  752. package/dist/server/implementation/types.d.ts +0 -189
  753. package/dist/server/implementation/types.d.ts.map +0 -1
  754. package/dist/server/implementation/types.js +0 -97
  755. package/dist/server/implementation/types.js.map +0 -1
  756. package/dist/server/implementation/users.d.ts +0 -30
  757. package/dist/server/implementation/users.d.ts.map +0 -1
  758. package/dist/server/implementation/users.js.map +0 -1
  759. package/dist/server/implementation/utils.d.ts +0 -19
  760. package/dist/server/implementation/utils.d.ts.map +0 -1
  761. package/dist/server/implementation/utils.js +0 -56
  762. package/dist/server/implementation/utils.js.map +0 -1
  763. package/dist/server/index.d.ts.map +0 -1
  764. package/dist/server/index.js.map +0 -1
  765. package/dist/server/oauth.d.ts.map +0 -1
  766. package/dist/server/providers.d.ts +0 -72
  767. package/dist/server/providers.d.ts.map +0 -1
  768. package/dist/server/providers.js.map +0 -1
  769. package/dist/server/templates.d.ts.map +0 -1
  770. package/dist/server/utils.d.ts.map +0 -1
  771. package/dist/server/version.d.ts +0 -5
  772. package/dist/server/version.d.ts.map +0 -1
  773. package/dist/server/version.js +0 -6
  774. package/dist/server/version.js.map +0 -1
  775. package/src/cli/utils.ts +0 -248
  776. package/src/server/implementation/device.ts +0 -307
  777. package/src/server/implementation/index.ts +0 -1583
  778. package/src/server/implementation/mutations/account.ts +0 -50
  779. package/src/server/implementation/mutations/index.ts +0 -157
  780. package/src/server/implementation/mutations/invalidate.ts +0 -42
  781. package/src/server/implementation/mutations/oauth.ts +0 -73
  782. package/src/server/implementation/mutations/refresh.ts +0 -175
  783. package/src/server/implementation/mutations/register.ts +0 -100
  784. package/src/server/implementation/mutations/retrieve.ts +0 -79
  785. package/src/server/implementation/mutations/signature.ts +0 -39
  786. package/src/server/implementation/mutations/signout.ts +0 -35
  787. package/src/server/implementation/mutations/store.ts +0 -7
  788. package/src/server/implementation/mutations/verifier.ts +0 -24
  789. package/src/server/implementation/mutations/verify.ts +0 -194
  790. package/src/server/implementation/passkey.ts +0 -620
  791. package/src/server/implementation/provider.ts +0 -36
  792. package/src/server/implementation/ratelimit.ts +0 -79
  793. package/src/server/implementation/refresh.ts +0 -172
  794. package/src/server/implementation/signin.ts +0 -296
  795. package/src/server/implementation/totp.ts +0 -342
  796. package/src/server/implementation/types.ts +0 -444
  797. package/src/server/implementation/utils.ts +0 -91
  798. package/src/server/version.ts +0 -2
@@ -1 +0,0 @@
1
- {"version":3,"file":"passkey.js","names":[],"sources":["../../../../src/server/implementation/passkey.ts"],"sourcesContent":["/**\n * Server-side WebAuthn ceremony logic for passkey authentication.\n *\n * Handles the four phases of the WebAuthn flow:\n * 1. register-options — generate PublicKeyCredentialCreationOptions\n * 2. register-verify — verify attestation and store credential\n * 3. auth-options — generate PublicKeyCredentialRequestOptions\n * 4. auth-verify — verify assertion signature and sign in\n *\n * Uses `@oslojs/webauthn` for attestation/assertion parsing and\n * `@oslojs/crypto` for signature verification.\n */\n\nimport {\n parseAttestationObject,\n parseClientDataJSON,\n parseAuthenticatorData,\n createAssertionSignatureMessage,\n ClientDataType,\n coseAlgorithmES256,\n coseAlgorithmRS256,\n COSEKeyType,\n} from \"@oslojs/webauthn\";\nimport {\n p256,\n verifyECDSASignature,\n decodeSEC1PublicKey,\n decodePKIXECDSASignature,\n} from \"@oslojs/crypto/ecdsa\";\nimport {\n RSAPublicKey,\n decodePKCS1RSAPublicKey,\n sha256ObjectIdentifier,\n verifyRSASSAPKCS1v15Signature,\n} from \"@oslojs/crypto/rsa\";\nimport { sha256 } from \"@oslojs/crypto/sha2\";\nimport {\n encodeBase64urlNoPadding,\n decodeBase64urlIgnorePadding,\n} from \"@oslojs/encoding\";\nimport {\n PasskeyProviderConfig,\n GenericActionCtxWithAuthConfig,\n} from \"../types\";\nimport {\n AuthDataModel,\n SessionInfo,\n queryUserById,\n queryUserByVerifiedEmail,\n queryPasskeysByUserId,\n queryPasskeyByCredentialId,\n queryVerifierById,\n mutatePasskeyInsert,\n mutatePasskeyUpdateCounter,\n mutateVerifierDelete,\n} from \"./types\";\nimport { callSignIn, callVerifier } from \"./mutations/index\";\nimport { callVerifierSignature } from \"./mutations/signature\";\nimport { authDb } from \"./db\";\nimport { throwAuthError } from \"../errors\";\n\n\ntype EnrichedActionCtx = GenericActionCtxWithAuthConfig<AuthDataModel>;\n\n/**\n * Resolve passkey relying party options from provider config and environment.\n */\nfunction resolveRpOptions(provider: PasskeyProviderConfig) {\n // WebAuthn RP ID and origin must match the *frontend* domain, not the\n // Convex backend. SITE_URL is the canonical frontend URL\n // (e.g. \"http://localhost:3000\" in dev, \"https://myapp.com\" in prod).\n // CONVEX_SITE_URL points to the Convex cloud HTTP actions endpoint and\n // must NOT be used here — the browser would reject the credential\n // because the RP ID wouldn't match the page origin.\n const siteUrl = process.env.SITE_URL;\n if (!siteUrl && !provider.options.rpId) {\n throwAuthError(\n \"PASSKEY_MISSING_CONFIG\",\n \"Passkey provider requires SITE_URL env var (your frontend URL) \" +\n \"or explicit rpId / origin in the provider config. \" +\n \"CONVEX_SITE_URL cannot be used because WebAuthn RP ID must match the frontend domain.\",\n );\n }\n const siteHostname = siteUrl ? new URL(siteUrl).hostname : undefined;\n\n return {\n rpName: provider.options.rpName ?? siteHostname ?? \"localhost\",\n rpId: provider.options.rpId ?? siteHostname ?? \"localhost\",\n origin: provider.options.origin ?? siteUrl ?? \"http://localhost\",\n attestation: provider.options.attestation ?? \"none\",\n userVerification: provider.options.userVerification ?? \"required\",\n residentKey: provider.options.residentKey ?? \"preferred\",\n authenticatorAttachment: provider.options.authenticatorAttachment,\n algorithms: provider.options.algorithms ?? [coseAlgorithmES256, coseAlgorithmRS256],\n challengeExpirationMs: provider.options.challengeExpirationMs ?? 300_000,\n };\n}\n\n/**\n * Generate a cryptographically random challenge.\n */\nfunction generateChallenge(): Uint8Array {\n const challenge = new Uint8Array(32);\n crypto.getRandomValues(challenge);\n return challenge;\n}\n\n/**\n * Hash a challenge for storage in the verifier table's `signature` field.\n */\nfunction hashChallenge(challenge: Uint8Array): string {\n return encodeBase64urlNoPadding(new Uint8Array(sha256(challenge)));\n}\n\n// ============================================================================\n// Registration flow\n// ============================================================================\n\n/**\n * Phase 1: Generate registration options.\n *\n * Requires an authenticated user — passkey registration always adds a\n * credential to an existing account. The userId is taken from the\n * current session identity.\n */\nasync function handleRegisterOptions(\n ctx: EnrichedActionCtx,\n provider: PasskeyProviderConfig,\n params: Record<string, any>,\n): Promise<{\n kind: \"passkeyOptions\";\n options: Record<string, any>;\n verifier: string;\n}> {\n // Passkey registration requires an authenticated user\n const identity = await ctx.auth.getUserIdentity();\n if (identity === null) {\n throwAuthError(\"PASSKEY_AUTH_REQUIRED\");\n }\n const [userId] = identity.subject.split(\"|\");\n\n const rp = resolveRpOptions(provider);\n const challenge = generateChallenge();\n const challengeHash = hashChallenge(challenge);\n\n // Store the challenge hash in the verifier table\n const verifier = await callVerifier(ctx);\n await callVerifierSignature(ctx, {\n verifier,\n signature: challengeHash,\n });\n\n // Get the user's profile for credential metadata\n const user = await queryUserById(ctx, userId!);\n const userName = params.userName ?? user?.email ?? \"user\";\n const userDisplayName = params.userDisplayName ?? user?.name ?? userName;\n\n // Collect existing credentials to prevent re-registration\n const existing = await queryPasskeysByUserId(ctx, userId!);\n const excludeCredentials = existing.map((pk) => ({\n id: pk.credentialId,\n transports: pk.transports,\n }));\n\n // User handle is derived from the Convex userId\n const userHandle = encodeBase64urlNoPadding(\n new TextEncoder().encode(userId!),\n );\n\n const options = {\n rp: {\n name: rp.rpName,\n id: rp.rpId,\n },\n user: {\n id: userHandle,\n name: userName,\n displayName: userDisplayName,\n },\n challenge: encodeBase64urlNoPadding(challenge),\n pubKeyCredParams: rp.algorithms.map((alg) => ({\n type: \"public-key\" as const,\n alg,\n })),\n timeout: rp.challengeExpirationMs,\n attestation: rp.attestation,\n authenticatorSelection: {\n residentKey: rp.residentKey,\n requireResidentKey: rp.residentKey === \"required\",\n userVerification: rp.userVerification,\n ...(rp.authenticatorAttachment\n ? { authenticatorAttachment: rp.authenticatorAttachment }\n : {}),\n },\n excludeCredentials,\n };\n\n return { kind: \"passkeyOptions\", options, verifier };\n}\n\n/**\n * Phase 2: Verify registration attestation and store the credential.\n *\n * Requires an authenticated user. Parses the attestation, verifies the\n * challenge, extracts the public key, creates an account + passkey record\n * linked to the current user, and returns auth tokens.\n */\nasync function handleRegisterVerify(\n ctx: EnrichedActionCtx,\n provider: PasskeyProviderConfig,\n params: Record<string, any>,\n verifierValue: string | undefined,\n): Promise<{ kind: \"signedIn\"; signedIn: SessionInfo | null }> {\n // Passkey registration requires an authenticated user\n const identity = await ctx.auth.getUserIdentity();\n if (identity === null) {\n throwAuthError(\"PASSKEY_AUTH_REQUIRED\");\n }\n const [userId] = identity.subject.split(\"|\");\n\n const rp = resolveRpOptions(provider);\n\n if (!verifierValue) {\n throwAuthError(\"PASSKEY_MISSING_VERIFIER\");\n }\n\n // Decode client data\n const clientDataJSON = decodeBase64urlIgnorePadding(params.clientDataJSON);\n const clientData = parseClientDataJSON(clientDataJSON);\n\n // Verify client data type is \"webauthn.create\"\n if (clientData.type !== ClientDataType.Create) {\n throwAuthError(\"PASSKEY_INVALID_CLIENT_DATA\", \"Invalid client data type: expected webauthn.create\");\n }\n\n // Verify origin\n const allowedOrigins = Array.isArray(rp.origin) ? rp.origin : [rp.origin];\n if (!allowedOrigins.includes(clientData.origin)) {\n throwAuthError(\n \"PASSKEY_INVALID_ORIGIN\",\n `Invalid origin: ${clientData.origin}, expected one of: ${allowedOrigins.join(\", \")}`,\n );\n }\n\n // Verify challenge matches the stored verifier\n const challengeHash = encodeBase64urlNoPadding(\n new Uint8Array(sha256(clientData.challenge)),\n );\n const verifierDoc = await queryVerifierById(ctx, verifierValue);\n if (!verifierDoc || verifierDoc.signature !== challengeHash) {\n throwAuthError(\"PASSKEY_INVALID_CHALLENGE\");\n }\n\n // Clean up the verifier\n await mutateVerifierDelete(ctx, verifierValue);\n\n // Parse attestation object\n const attestationObjectBytes = decodeBase64urlIgnorePadding(params.attestationObject);\n const attestation = parseAttestationObject(attestationObjectBytes);\n const authenticatorData = attestation.authenticatorData;\n\n // Verify RP ID hash\n if (!authenticatorData.verifyRelyingPartyIdHash(rp.rpId)) {\n throwAuthError(\"PASSKEY_RP_MISMATCH\");\n }\n\n // Verify user presence and verification flags\n if (!authenticatorData.userPresent) {\n throwAuthError(\"PASSKEY_USER_PRESENCE\");\n }\n if (rp.userVerification === \"required\" && !authenticatorData.userVerified) {\n throwAuthError(\"PASSKEY_USER_VERIFICATION\");\n }\n\n // Extract credential\n const credential = authenticatorData.credential;\n if (!credential) {\n throwAuthError(\"PASSKEY_NO_CREDENTIAL\");\n }\n\n const credentialId = encodeBase64urlNoPadding(credential.id);\n const publicKey = credential.publicKey;\n\n // Determine algorithm and encode the public key for storage\n let algorithm: number;\n let publicKeyBytes: Uint8Array;\n\n if (publicKey.isAlgorithmDefined()) {\n algorithm = publicKey.algorithm();\n } else {\n const keyType = publicKey.type();\n algorithm =\n keyType === COSEKeyType.EC2\n ? coseAlgorithmES256\n : keyType === COSEKeyType.RSA\n ? coseAlgorithmRS256\n : coseAlgorithmES256;\n }\n\n if (algorithm === coseAlgorithmES256) {\n const ec2 = publicKey.ec2();\n // Encode as SEC1 uncompressed point (0x04 || x || y)\n const xBytes = bigintToBytes(ec2.x, 32);\n const yBytes = bigintToBytes(ec2.y, 32);\n publicKeyBytes = new Uint8Array(65);\n publicKeyBytes[0] = 0x04;\n publicKeyBytes.set(xBytes, 1);\n publicKeyBytes.set(yBytes, 33);\n } else if (algorithm === coseAlgorithmRS256) {\n const rsa = publicKey.rsa();\n const rsaPubKey = new RSAPublicKey(rsa.n, rsa.e);\n publicKeyBytes = rsaPubKey.encodePKCS1();\n } else {\n throwAuthError(\"PASSKEY_UNSUPPORTED_ALGORITHM\", `Unsupported algorithm: ${algorithm}`);\n }\n\n const deviceType = params.deviceType ?? \"single-device\";\n const backedUp = params.backedUp ?? false;\n\n // Create an account record linking the passkey to the current user.\n // Unlike unauthenticated flows, we don't create a new user — we\n // attach the passkey credential to the existing authenticated user.\n const db = authDb(ctx, ctx.auth.config);\n await db.accounts.create({\n userId: userId!,\n provider: provider.id,\n providerAccountId: credentialId,\n });\n\n // Store the passkey credential\n await mutatePasskeyInsert(ctx, {\n userId: userId!,\n credentialId,\n publicKey: publicKeyBytes.buffer.slice(\n publicKeyBytes.byteOffset,\n publicKeyBytes.byteOffset + publicKeyBytes.byteLength,\n ),\n algorithm,\n counter: authenticatorData.signatureCounter,\n transports: params.transports,\n deviceType,\n backedUp,\n name: params.passkeyName,\n createdAt: Date.now(),\n });\n\n // Return tokens for the existing session\n const signInResult = await callSignIn(ctx, {\n userId: userId!,\n generateTokens: true,\n });\n\n return { kind: \"signedIn\", signedIn: signInResult };\n}\n\n// ============================================================================\n// Authentication flow\n// ============================================================================\n\n/**\n * Phase 3: Generate authentication options.\n *\n * Creates a challenge and returns PublicKeyCredentialRequestOptions.\n * If an email is provided, scopes allowCredentials to that user's passkeys.\n */\nasync function handleAuthOptions(\n ctx: EnrichedActionCtx,\n provider: PasskeyProviderConfig,\n params: Record<string, any>,\n): Promise<{\n kind: \"passkeyOptions\";\n options: Record<string, any>;\n verifier: string;\n}> {\n const rp = resolveRpOptions(provider);\n const challenge = generateChallenge();\n const challengeHash = hashChallenge(challenge);\n\n // Store the challenge hash in the verifier table\n const verifier = await callVerifier(ctx);\n await callVerifierSignature(ctx, {\n verifier,\n signature: challengeHash,\n });\n\n // Build allowCredentials if email is provided\n let allowCredentials: Array<{ type: string; id: string; transports?: string[] }> | undefined;\n if (params.email) {\n // Look up user by email, then find their passkeys\n const user = await queryUserByVerifiedEmail(ctx, params.email);\n if (user) {\n const passkeys = await queryPasskeysByUserId(ctx, user._id);\n if (passkeys.length > 0) {\n allowCredentials = passkeys.map((pk) => ({\n type: \"public-key\",\n id: pk.credentialId,\n transports: pk.transports,\n }));\n }\n }\n }\n\n const options: Record<string, any> = {\n challenge: encodeBase64urlNoPadding(challenge),\n timeout: rp.challengeExpirationMs,\n rpId: rp.rpId,\n userVerification: rp.userVerification,\n };\n\n if (allowCredentials) {\n options.allowCredentials = allowCredentials;\n }\n\n return { kind: \"passkeyOptions\", options, verifier };\n}\n\n/**\n * Phase 4: Verify authentication assertion and sign in.\n *\n * Verifies the signature against the stored public key, checks the counter,\n * and creates a session.\n */\nasync function handleAuthVerify(\n ctx: EnrichedActionCtx,\n provider: PasskeyProviderConfig,\n params: Record<string, any>,\n verifierValue: string | undefined,\n): Promise<{ kind: \"signedIn\"; signedIn: SessionInfo | null }> {\n const rp = resolveRpOptions(provider);\n\n if (!verifierValue) {\n throwAuthError(\"PASSKEY_MISSING_VERIFIER\");\n }\n\n // Decode client data\n const clientDataJSON = decodeBase64urlIgnorePadding(params.clientDataJSON);\n const clientData = parseClientDataJSON(clientDataJSON);\n\n // Verify client data type is \"webauthn.get\"\n if (clientData.type !== ClientDataType.Get) {\n throwAuthError(\"PASSKEY_INVALID_CLIENT_DATA\", \"Invalid client data type: expected webauthn.get\");\n }\n\n // Verify origin\n const allowedOrigins = Array.isArray(rp.origin) ? rp.origin : [rp.origin];\n if (!allowedOrigins.includes(clientData.origin)) {\n throwAuthError(\n \"PASSKEY_INVALID_ORIGIN\",\n `Invalid origin: ${clientData.origin}, expected one of: ${allowedOrigins.join(\", \")}`,\n );\n }\n\n // Verify challenge matches the stored verifier\n const challengeHash = encodeBase64urlNoPadding(\n new Uint8Array(sha256(clientData.challenge)),\n );\n const verifierDoc = await queryVerifierById(ctx, verifierValue);\n if (!verifierDoc || verifierDoc.signature !== challengeHash) {\n throwAuthError(\"PASSKEY_INVALID_CHALLENGE\");\n }\n\n // Clean up the verifier\n await mutateVerifierDelete(ctx, verifierValue);\n\n // Look up the credential\n const credentialId = params.credentialId;\n if (!credentialId) {\n throwAuthError(\"PASSKEY_UNKNOWN_CREDENTIAL\", \"Missing credential ID\");\n }\n\n const passkey = await queryPasskeyByCredentialId(ctx, credentialId);\n if (!passkey) {\n throwAuthError(\"PASSKEY_UNKNOWN_CREDENTIAL\", \"Unknown credential\");\n }\n\n // Parse authenticator data\n const authenticatorDataBytes = decodeBase64urlIgnorePadding(params.authenticatorData);\n const authenticatorData = parseAuthenticatorData(authenticatorDataBytes);\n\n // Verify RP ID hash\n if (!authenticatorData.verifyRelyingPartyIdHash(rp.rpId)) {\n throwAuthError(\"PASSKEY_RP_MISMATCH\");\n }\n\n // Verify user presence\n if (!authenticatorData.userPresent) {\n throwAuthError(\"PASSKEY_USER_PRESENCE\");\n }\n if (rp.userVerification === \"required\" && !authenticatorData.userVerified) {\n throwAuthError(\"PASSKEY_USER_VERIFICATION\");\n }\n\n // Verify signature\n const signature = decodeBase64urlIgnorePadding(params.signature);\n const signatureMessage = createAssertionSignatureMessage(\n authenticatorDataBytes,\n clientDataJSON,\n );\n const messageHash = sha256(signatureMessage);\n\n const storedPublicKeyBytes = new Uint8Array(passkey.publicKey);\n\n if (passkey.algorithm === coseAlgorithmES256) {\n // EC P-256 verification\n const ecPublicKey = decodeSEC1PublicKey(p256, storedPublicKeyBytes);\n // WebAuthn signatures for EC keys are DER/ASN.1 (PKIX) encoded\n const ecdsaSignature = decodePKIXECDSASignature(signature);\n const valid = verifyECDSASignature(\n ecPublicKey,\n messageHash,\n ecdsaSignature,\n );\n if (!valid) {\n throwAuthError(\"PASSKEY_INVALID_SIGNATURE\");\n }\n } else if (passkey.algorithm === coseAlgorithmRS256) {\n // RSA PKCS#1 v1.5 with SHA-256 verification\n // Decode the stored PKCS#1 public key\n const rsaPublicKey = decodePKCS1RSAPublicKey(storedPublicKeyBytes);\n const valid = verifyRSASSAPKCS1v15Signature(\n rsaPublicKey,\n sha256ObjectIdentifier,\n messageHash,\n signature,\n );\n if (!valid) {\n throwAuthError(\"PASSKEY_INVALID_SIGNATURE\");\n }\n } else {\n throwAuthError(\"PASSKEY_UNSUPPORTED_ALGORITHM\", `Unsupported algorithm: ${passkey.algorithm}`);\n }\n\n // Verify counter (clone detection)\n // Counter of 0 means the authenticator doesn't support counters\n if (\n passkey.counter !== 0 &&\n authenticatorData.signatureCounter !== 0 &&\n authenticatorData.signatureCounter <= passkey.counter\n ) {\n throwAuthError(\"PASSKEY_COUNTER_ERROR\");\n }\n\n // Update counter and last used timestamp\n await mutatePasskeyUpdateCounter(\n ctx,\n passkey._id,\n authenticatorData.signatureCounter,\n Date.now(),\n );\n\n // Sign in the user\n const signInResult = await callSignIn(ctx, {\n userId: passkey.userId,\n generateTokens: true,\n });\n\n return { kind: \"signedIn\", signedIn: signInResult };\n}\n\n// ============================================================================\n// Main dispatch\n// ============================================================================\n\n/**\n * Main passkey handler dispatched from signIn.ts.\n *\n * Routes to the appropriate phase based on `params.flow`.\n */\nexport async function handlePasskey(\n ctx: EnrichedActionCtx,\n provider: PasskeyProviderConfig,\n args: {\n params?: Record<string, any>;\n verifier?: string;\n },\n): Promise<\n | { kind: \"signedIn\"; signedIn: SessionInfo | null }\n | { kind: \"passkeyOptions\"; options: Record<string, any>; verifier: string }\n> {\n const flow = args.params?.flow;\n if (!flow) {\n throwAuthError(\n \"PASSKEY_MISSING_FLOW\",\n \"Missing `flow` parameter. Expected one of: register-options, register-verify, auth-options, auth-verify\",\n );\n }\n\n switch (flow) {\n case \"register-options\":\n return handleRegisterOptions(ctx, provider, args.params ?? {});\n case \"register-verify\":\n return handleRegisterVerify(ctx, provider, args.params ?? {}, args.verifier);\n case \"auth-options\":\n return handleAuthOptions(ctx, provider, args.params ?? {});\n case \"auth-verify\":\n return handleAuthVerify(ctx, provider, args.params ?? {}, args.verifier);\n default:\n throwAuthError(\n \"PASSKEY_UNKNOWN_FLOW\",\n `Unknown passkey flow: ${flow}. Expected one of: register-options, register-verify, auth-options, auth-verify`,\n );\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Convert a bigint to a fixed-size big-endian byte array.\n */\nfunction bigintToBytes(value: bigint, length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n let v = value;\n for (let i = length - 1; i >= 0; i--) {\n bytes[i] = Number(v & 0xffn);\n v >>= 8n;\n }\n return bytes;\n}\n"],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- import { throwAuthError } from "../errors.js";
2
-
3
- //#region src/server/implementation/provider.ts
4
- async function hash(provider, secret) {
5
- if (provider.type !== "credentials") throwAuthError("INVALID_CREDENTIALS_PROVIDER", `Provider ${provider.id} is not a credentials provider`, { provider: provider.id });
6
- const hashSecretFn = provider.crypto?.hashSecret;
7
- if (hashSecretFn === void 0) throwAuthError("MISSING_CRYPTO_FUNCTION", `Provider ${provider.id} does not have a \`crypto.hashSecret\` function`, { provider: provider.id });
8
- return await hashSecretFn(secret);
9
- }
10
- async function verify(provider, secret, hash) {
11
- if (provider.type !== "credentials") throwAuthError("INVALID_CREDENTIALS_PROVIDER", `Provider ${provider.id} is not a credentials provider`, { provider: provider.id });
12
- const verifySecretFn = provider.crypto?.verifySecret;
13
- if (verifySecretFn === void 0) throwAuthError("MISSING_CRYPTO_FUNCTION", `Provider ${provider.id} does not have a \`crypto.verifySecret\` function`, { provider: provider.id });
14
- return await verifySecretFn(secret, hash);
15
- }
16
-
17
- //#endregion
18
- export { hash, verify };
19
- //# sourceMappingURL=provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"provider.js","names":[],"sources":["../../../../src/server/implementation/provider.ts"],"sourcesContent":["import { AuthProviderMaterializedConfig } from \"../types\";\nimport { ConvexAuthMaterializedConfig } from \"../types\";\nimport { throwAuthError } from \"../errors\";\n\nexport async function hash(provider: any, secret: string) {\n if (provider.type !== \"credentials\") {\n throwAuthError(\"INVALID_CREDENTIALS_PROVIDER\", `Provider ${provider.id} is not a credentials provider`, { provider: provider.id });\n }\n const hashSecretFn = provider.crypto?.hashSecret;\n if (hashSecretFn === undefined) {\n throwAuthError(\"MISSING_CRYPTO_FUNCTION\", `Provider ${provider.id} does not have a \\`crypto.hashSecret\\` function`, { provider: provider.id });\n }\n return await hashSecretFn(secret);\n}\n\nexport async function verify(\n provider: AuthProviderMaterializedConfig,\n secret: string,\n hash: string,\n) {\n if (provider.type !== \"credentials\") {\n throwAuthError(\"INVALID_CREDENTIALS_PROVIDER\", `Provider ${provider.id} is not a credentials provider`, { provider: provider.id });\n }\n const verifySecretFn = provider.crypto?.verifySecret;\n if (verifySecretFn === undefined) {\n throwAuthError(\"MISSING_CRYPTO_FUNCTION\", `Provider ${provider.id} does not have a \\`crypto.verifySecret\\` function`, { provider: provider.id });\n }\n return await verifySecretFn(secret, hash);\n}\n\nexport type GetProviderOrThrowFunc = (\n provider: string,\n allowExtraProviders?: boolean,\n) => AuthProviderMaterializedConfig;\n\nexport type Config = ConvexAuthMaterializedConfig;\n"],"mappings":";;;AAIA,eAAsB,KAAK,UAAe,QAAgB;AACxD,KAAI,SAAS,SAAS,cACpB,gBAAe,gCAAgC,YAAY,SAAS,GAAG,iCAAiC,EAAE,UAAU,SAAS,IAAI,CAAC;CAEpI,MAAM,eAAe,SAAS,QAAQ;AACtC,KAAI,iBAAiB,OACnB,gBAAe,2BAA2B,YAAY,SAAS,GAAG,kDAAkD,EAAE,UAAU,SAAS,IAAI,CAAC;AAEhJ,QAAO,MAAM,aAAa,OAAO;;AAGnC,eAAsB,OACpB,UACA,QACA,MACA;AACA,KAAI,SAAS,SAAS,cACpB,gBAAe,gCAAgC,YAAY,SAAS,GAAG,iCAAiC,EAAE,UAAU,SAAS,IAAI,CAAC;CAEpI,MAAM,iBAAiB,SAAS,QAAQ;AACxC,KAAI,mBAAmB,OACrB,gBAAe,2BAA2B,YAAY,SAAS,GAAG,oDAAoD,EAAE,UAAU,SAAS,IAAI,CAAC;AAElJ,QAAO,MAAM,eAAe,QAAQ,KAAK"}
@@ -1,48 +0,0 @@
1
- import { authDb } from "./db.js";
2
-
3
- //#region src/server/implementation/ratelimit.ts
4
- const DEFAULT_MAX_SIGN_IN_ATTEMPTS_PER_HOUR = 10;
5
- async function isSignInRateLimited(ctx, identifier, config) {
6
- const state = await getRateLimitState(ctx, identifier, config);
7
- if (state === null) return false;
8
- return state.attempsLeft < 1;
9
- }
10
- async function recordFailedSignIn(ctx, identifier, config) {
11
- const db = authDb(ctx, config);
12
- const state = await getRateLimitState(ctx, identifier, config);
13
- if (state !== null) await db.rateLimits.patch(state.limit._id, {
14
- attemptsLeft: state.attempsLeft - 1,
15
- lastAttemptTime: Date.now()
16
- });
17
- else {
18
- const maxAttempsPerHour = configuredMaxAttempsPerHour(config);
19
- await db.rateLimits.create({
20
- identifier,
21
- attemptsLeft: maxAttempsPerHour - 1,
22
- lastAttemptTime: Date.now()
23
- });
24
- }
25
- }
26
- async function resetSignInRateLimit(ctx, identifier, config) {
27
- const existingState = await getRateLimitState(ctx, identifier, config);
28
- if (existingState !== null) await authDb(ctx, config).rateLimits.delete(existingState.limit._id);
29
- }
30
- async function getRateLimitState(ctx, identifier, config) {
31
- const now = Date.now();
32
- const maxAttempsPerHour = configuredMaxAttempsPerHour(config);
33
- const limit = await authDb(ctx, config).rateLimits.get(identifier);
34
- if (limit === null) return null;
35
- const elapsed = now - limit.lastAttemptTime;
36
- const maxAttempsPerMs = maxAttempsPerHour / (3600 * 1e3);
37
- return {
38
- limit,
39
- attempsLeft: Math.min(maxAttempsPerHour, limit.attemptsLeft + elapsed * maxAttempsPerMs)
40
- };
41
- }
42
- function configuredMaxAttempsPerHour(config) {
43
- return config.signIn?.maxFailedAttempsPerHour ?? DEFAULT_MAX_SIGN_IN_ATTEMPTS_PER_HOUR;
44
- }
45
-
46
- //#endregion
47
- export { isSignInRateLimited, recordFailedSignIn, resetSignInRateLimit };
48
- //# sourceMappingURL=ratelimit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ratelimit.js","names":[],"sources":["../../../../src/server/implementation/ratelimit.ts"],"sourcesContent":["import { ConvexAuthConfig } from \"../types\";\nimport { Doc, MutationCtx } from \"./types\";\nimport { authDb } from \"./db\";\n\nconst DEFAULT_MAX_SIGN_IN_ATTEMPTS_PER_HOUR = 10;\n\nexport async function isSignInRateLimited(\n ctx: MutationCtx,\n identifier: string,\n config: ConvexAuthConfig,\n) {\n const state = await getRateLimitState(ctx, identifier, config);\n if (state === null) {\n return false;\n }\n return state.attempsLeft < 1;\n}\n\nexport async function recordFailedSignIn(\n ctx: MutationCtx,\n identifier: string,\n config: ConvexAuthConfig,\n) {\n const db = authDb(ctx, config);\n const state = await getRateLimitState(ctx, identifier, config);\n if (state !== null) {\n await db.rateLimits.patch(state.limit._id, {\n attemptsLeft: state.attempsLeft - 1,\n lastAttemptTime: Date.now(),\n });\n } else {\n const maxAttempsPerHour = configuredMaxAttempsPerHour(config);\n await db.rateLimits.create({\n identifier,\n attemptsLeft: maxAttempsPerHour - 1,\n lastAttemptTime: Date.now(),\n });\n }\n}\n\nexport async function resetSignInRateLimit(\n ctx: MutationCtx,\n identifier: string,\n config: ConvexAuthConfig,\n) {\n const existingState = await getRateLimitState(ctx, identifier, config);\n if (existingState !== null) {\n await authDb(ctx, config).rateLimits.delete(existingState.limit._id);\n }\n}\n\nasync function getRateLimitState(\n ctx: MutationCtx,\n identifier: string,\n config: ConvexAuthConfig,\n) {\n const now = Date.now();\n const maxAttempsPerHour = configuredMaxAttempsPerHour(config);\n const limit = (await authDb(ctx, config).rateLimits.get(identifier)) as\n | Doc<\"limit\">\n | null;\n if (limit === null) {\n return null;\n }\n const elapsed = now - limit.lastAttemptTime;\n const maxAttempsPerMs = maxAttempsPerHour / (60 * 60 * 1000);\n const attempsLeft = Math.min(\n maxAttempsPerHour,\n limit.attemptsLeft + elapsed * maxAttempsPerMs,\n );\n return { limit, attempsLeft };\n}\n\nfunction configuredMaxAttempsPerHour(config: ConvexAuthConfig) {\n return (\n config.signIn?.maxFailedAttempsPerHour ??\n DEFAULT_MAX_SIGN_IN_ATTEMPTS_PER_HOUR\n );\n}\n"],"mappings":";;;AAIA,MAAM,wCAAwC;AAE9C,eAAsB,oBACpB,KACA,YACA,QACA;CACA,MAAM,QAAQ,MAAM,kBAAkB,KAAK,YAAY,OAAO;AAC9D,KAAI,UAAU,KACZ,QAAO;AAET,QAAO,MAAM,cAAc;;AAG7B,eAAsB,mBACpB,KACA,YACA,QACA;CACA,MAAM,KAAK,OAAO,KAAK,OAAO;CAC9B,MAAM,QAAQ,MAAM,kBAAkB,KAAK,YAAY,OAAO;AAC9D,KAAI,UAAU,KACZ,OAAM,GAAG,WAAW,MAAM,MAAM,MAAM,KAAK;EACzC,cAAc,MAAM,cAAc;EAClC,iBAAiB,KAAK,KAAK;EAC5B,CAAC;MACG;EACL,MAAM,oBAAoB,4BAA4B,OAAO;AAC7D,QAAM,GAAG,WAAW,OAAO;GACzB;GACA,cAAc,oBAAoB;GAClC,iBAAiB,KAAK,KAAK;GAC5B,CAAC;;;AAIN,eAAsB,qBACpB,KACA,YACA,QACA;CACA,MAAM,gBAAgB,MAAM,kBAAkB,KAAK,YAAY,OAAO;AACtE,KAAI,kBAAkB,KACpB,OAAM,OAAO,KAAK,OAAO,CAAC,WAAW,OAAO,cAAc,MAAM,IAAI;;AAIxE,eAAe,kBACb,KACA,YACA,QACA;CACA,MAAM,MAAM,KAAK,KAAK;CACtB,MAAM,oBAAoB,4BAA4B,OAAO;CAC7D,MAAM,QAAS,MAAM,OAAO,KAAK,OAAO,CAAC,WAAW,IAAI,WAAW;AAGnE,KAAI,UAAU,KACZ,QAAO;CAET,MAAM,UAAU,MAAM,MAAM;CAC5B,MAAM,kBAAkB,qBAAqB,OAAU;AAKvD,QAAO;EAAE;EAAO,aAJI,KAAK,IACvB,mBACA,MAAM,eAAe,UAAU,gBAChC;EAC4B;;AAG/B,SAAS,4BAA4B,QAA0B;AAC7D,QACE,OAAO,QAAQ,2BACf"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"redirects.js","names":[],"sources":["../../../../src/server/implementation/redirects.ts"],"sourcesContent":["import { ConvexAuthMaterializedConfig } from \"../types\";\nimport { requireEnv } from \"../utils\";\nimport { throwAuthError } from \"../errors\";\n\nexport async function redirectAbsoluteUrl(\n config: ConvexAuthMaterializedConfig,\n params: { redirectTo: unknown },\n) {\n if (params.redirectTo !== undefined) {\n if (typeof params.redirectTo !== \"string\") {\n throwAuthError(\"INVALID_REDIRECT\", `Expected \\`redirectTo\\` to be a string, got ${params.redirectTo as any}`);\n }\n const redirectCallback =\n config.callbacks?.redirect ?? defaultRedirectCallback;\n return await redirectCallback(params as { redirectTo: string });\n }\n return siteUrl();\n}\n\nasync function defaultRedirectCallback({ redirectTo }: { redirectTo: string }) {\n // Resolve relative paths against SITE_URL; absolute URLs are passed through\n // as-is. The developer is trusted to provide valid redirect targets.\n if (redirectTo.startsWith(\"?\") || redirectTo.startsWith(\"/\")) {\n return `${siteUrl()}${redirectTo}`;\n }\n return redirectTo;\n}\n\n// Temporary work-around because Convex doesn't support\n// schemes other than http and https.\nexport function setURLSearchParam(\n absoluteUrl: string,\n param: string,\n value: string,\n) {\n const pattern = /([^:]+):(.*)/;\n const [, scheme, rest] = absoluteUrl.match(pattern)!;\n const hasNoDomain = /^\\/\\/(?:\\/|$|\\?)/.test(rest);\n const startsWithPath = hasNoDomain && rest.startsWith(\"///\");\n const url = new URL(\n `http:${hasNoDomain ? \"//googblibok\" + rest.slice(2) : rest}`,\n );\n url.searchParams.set(param, value);\n const [, , withParam] = url.toString().match(pattern)!;\n return `${scheme}:${hasNoDomain ? (startsWithPath ? \"/\" : \"\") + \"//\" + withParam.slice(13) : withParam}`;\n}\n\nfunction siteUrl() {\n return requireEnv(\"SITE_URL\").replace(/\\/$/, \"\");\n}\n"],"mappings":";;;;AAIA,eAAsB,oBACpB,QACA,QACA;AACA,KAAI,OAAO,eAAe,QAAW;AACnC,MAAI,OAAO,OAAO,eAAe,SAC/B,gBAAe,oBAAoB,+CAA+C,OAAO,aAAoB;AAI/G,SAAO,OADL,OAAO,WAAW,YAAY,yBACF,OAAiC;;AAEjE,QAAO,SAAS;;AAGlB,eAAe,wBAAwB,EAAE,cAAsC;AAG7E,KAAI,WAAW,WAAW,IAAI,IAAI,WAAW,WAAW,IAAI,CAC1D,QAAO,GAAG,SAAS,GAAG;AAExB,QAAO;;AAKT,SAAgB,kBACd,aACA,OACA,OACA;CACA,MAAM,UAAU;CAChB,MAAM,GAAG,QAAQ,QAAQ,YAAY,MAAM,QAAQ;CACnD,MAAM,cAAc,mBAAmB,KAAK,KAAK;CACjD,MAAM,iBAAiB,eAAe,KAAK,WAAW,MAAM;CAC5D,MAAM,MAAM,IAAI,IACd,QAAQ,cAAc,iBAAiB,KAAK,MAAM,EAAE,GAAG,OACxD;AACD,KAAI,aAAa,IAAI,OAAO,MAAM;CAClC,MAAM,KAAK,aAAa,IAAI,UAAU,CAAC,MAAM,QAAQ;AACrD,QAAO,GAAG,OAAO,GAAG,eAAe,iBAAiB,MAAM,MAAM,OAAO,UAAU,MAAM,GAAG,GAAG;;AAG/F,SAAS,UAAU;AACjB,QAAO,WAAW,WAAW,CAAC,QAAQ,OAAO,GAAG"}
@@ -1,109 +0,0 @@
1
- import { throwAuthError } from "../errors.js";
2
- import { LOG_LEVELS, REFRESH_TOKEN_DIVIDER, logWithLevel, maybeRedact, stringToNumber } from "./utils.js";
3
- import { authDb } from "./db.js";
4
-
5
- //#region src/server/implementation/refresh.ts
6
- const DEFAULT_SESSION_INACTIVE_DURATION_MS = 1e3 * 60 * 60 * 24 * 30;
7
- const REFRESH_TOKEN_REUSE_WINDOW_MS = 10 * 1e3;
8
- async function createRefreshToken(ctx, config, sessionId, parentRefreshTokenId) {
9
- const db = authDb(ctx, config);
10
- const expirationTime = Date.now() + (config.session?.inactiveDurationMs ?? stringToNumber(process.env.AUTH_SESSION_INACTIVE_DURATION_MS) ?? DEFAULT_SESSION_INACTIVE_DURATION_MS);
11
- return await db.refreshTokens.create({
12
- sessionId,
13
- expirationTime,
14
- parentRefreshTokenId: parentRefreshTokenId ?? void 0
15
- });
16
- }
17
- const formatRefreshToken = (refreshTokenId, sessionId) => {
18
- return `${refreshTokenId}${REFRESH_TOKEN_DIVIDER}${sessionId}`;
19
- };
20
- const parseRefreshToken = (refreshToken) => {
21
- const [refreshTokenId, sessionId] = refreshToken.split(REFRESH_TOKEN_DIVIDER);
22
- if (!refreshTokenId || !sessionId) throwAuthError("INVALID_REFRESH_TOKEN", `Can't parse refresh token: ${maybeRedact(refreshToken)}`);
23
- return {
24
- refreshTokenId,
25
- sessionId
26
- };
27
- };
28
- /**
29
- * Mark all refresh tokens descending from the given refresh token as invalid immediately.
30
- * This is used when we detect an invalid use of a refresh token, and want to revoke
31
- * the entire tree.
32
- *
33
- * @param ctx
34
- * @param refreshToken
35
- */
36
- async function invalidateRefreshTokensInSubtree(ctx, refreshToken, config) {
37
- const db = authDb(ctx, config);
38
- const tokensToInvalidate = [refreshToken];
39
- let frontier = [refreshToken._id];
40
- while (frontier.length > 0) {
41
- const nextFrontier = [];
42
- for (const currentTokenId of frontier) {
43
- const children = await db.refreshTokens.getChildren(refreshToken.sessionId, currentTokenId);
44
- tokensToInvalidate.push(...children);
45
- nextFrontier.push(...children.map((child) => child._id));
46
- }
47
- frontier = nextFrontier;
48
- }
49
- for (const token of tokensToInvalidate) if (token.firstUsedTime === void 0 || token.firstUsedTime > Date.now() - REFRESH_TOKEN_REUSE_WINDOW_MS) await db.refreshTokens.patch(token._id, { firstUsedTime: Date.now() - REFRESH_TOKEN_REUSE_WINDOW_MS });
50
- return tokensToInvalidate;
51
- }
52
- async function deleteAllRefreshTokens(ctx, sessionId, config) {
53
- await authDb(ctx, config).refreshTokens.deleteAll(sessionId);
54
- }
55
- async function refreshTokenIfValid(ctx, refreshTokenId, tokenSessionId, config) {
56
- const db = authDb(ctx, config);
57
- let refreshTokenDoc;
58
- try {
59
- refreshTokenDoc = await db.refreshTokens.getById(refreshTokenId);
60
- } catch {
61
- logWithLevel(LOG_LEVELS.ERROR, "Invalid refresh token format");
62
- return null;
63
- }
64
- if (refreshTokenDoc === null) {
65
- logWithLevel(LOG_LEVELS.ERROR, "Invalid refresh token");
66
- return null;
67
- }
68
- if (refreshTokenDoc.expirationTime < Date.now()) {
69
- logWithLevel(LOG_LEVELS.ERROR, "Expired refresh token");
70
- return null;
71
- }
72
- if (refreshTokenDoc.sessionId !== tokenSessionId) {
73
- logWithLevel(LOG_LEVELS.ERROR, "Invalid refresh token session ID");
74
- return null;
75
- }
76
- let session;
77
- try {
78
- session = await db.sessions.getById(refreshTokenDoc.sessionId);
79
- } catch {
80
- logWithLevel(LOG_LEVELS.ERROR, "Invalid refresh token session format");
81
- return null;
82
- }
83
- if (session === null) {
84
- logWithLevel(LOG_LEVELS.ERROR, "Invalid refresh token session");
85
- return null;
86
- }
87
- if (session.expirationTime < Date.now()) {
88
- logWithLevel(LOG_LEVELS.ERROR, "Expired refresh token session");
89
- return null;
90
- }
91
- return {
92
- session,
93
- refreshTokenDoc
94
- };
95
- }
96
- /**
97
- * The active refresh token is the most recently created refresh token that has
98
- * never been used.
99
- *
100
- * @param ctx
101
- * @param sessionId
102
- */
103
- async function loadActiveRefreshToken(ctx, sessionId, config) {
104
- return await authDb(ctx, config).refreshTokens.getActive(sessionId);
105
- }
106
-
107
- //#endregion
108
- export { REFRESH_TOKEN_REUSE_WINDOW_MS, createRefreshToken, deleteAllRefreshTokens, formatRefreshToken, invalidateRefreshTokensInSubtree, loadActiveRefreshToken, parseRefreshToken, refreshTokenIfValid };
109
- //# sourceMappingURL=refresh.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"refresh.js","names":[],"sources":["../../../../src/server/implementation/refresh.ts"],"sourcesContent":["import { GenericId } from \"convex/values\";\nimport { ConvexAuthConfig } from \"../types\";\nimport { throwAuthError } from \"../errors\";\nimport { Doc, MutationCtx } from \"./types\";\nimport {\n LOG_LEVELS,\n REFRESH_TOKEN_DIVIDER,\n logWithLevel,\n maybeRedact,\n stringToNumber,\n} from \"./utils\";\nimport { authDb } from \"./db\";\n\nconst DEFAULT_SESSION_INACTIVE_DURATION_MS = 1000 * 60 * 60 * 24 * 30; // 30 days\nexport const REFRESH_TOKEN_REUSE_WINDOW_MS = 10 * 1000; // 10 seconds\nexport async function createRefreshToken(\n ctx: MutationCtx,\n config: ConvexAuthConfig,\n sessionId: GenericId<\"session\">,\n parentRefreshTokenId: GenericId<\"token\"> | null,\n): Promise<GenericId<\"token\">> {\n const db = authDb(ctx, config);\n const expirationTime =\n Date.now() +\n (config.session?.inactiveDurationMs ??\n stringToNumber(process.env.AUTH_SESSION_INACTIVE_DURATION_MS) ??\n DEFAULT_SESSION_INACTIVE_DURATION_MS);\n const newRefreshTokenId = (await db.refreshTokens.create({\n sessionId,\n expirationTime,\n parentRefreshTokenId: parentRefreshTokenId ?? undefined,\n })) as GenericId<\"token\">;\n return newRefreshTokenId;\n}\n\nexport const formatRefreshToken = (\n refreshTokenId: GenericId<\"token\">,\n sessionId: GenericId<\"session\">,\n) => {\n return `${refreshTokenId}${REFRESH_TOKEN_DIVIDER}${sessionId}`;\n};\n\nexport const parseRefreshToken = (\n refreshToken: string,\n): {\n refreshTokenId: GenericId<\"token\">;\n sessionId: GenericId<\"session\">;\n} => {\n const [refreshTokenId, sessionId] = refreshToken.split(REFRESH_TOKEN_DIVIDER);\n if (!refreshTokenId || !sessionId) {\n throwAuthError(\"INVALID_REFRESH_TOKEN\", `Can't parse refresh token: ${maybeRedact(refreshToken)}`);\n }\n return {\n refreshTokenId: refreshTokenId as GenericId<\"token\">,\n sessionId: sessionId as GenericId<\"session\">,\n };\n};\n\n/**\n * Mark all refresh tokens descending from the given refresh token as invalid immediately.\n * This is used when we detect an invalid use of a refresh token, and want to revoke\n * the entire tree.\n *\n * @param ctx\n * @param refreshToken\n */\nexport async function invalidateRefreshTokensInSubtree(\n ctx: MutationCtx,\n refreshToken: Doc<\"token\">,\n config: ConvexAuthConfig,\n) {\n const db = authDb(ctx, config);\n const tokensToInvalidate = [refreshToken];\n let frontier: GenericId<\"token\">[] = [refreshToken._id];\n while (frontier.length > 0) {\n const nextFrontier: GenericId<\"token\">[] = [];\n for (const currentTokenId of frontier) {\n const children = (await db.refreshTokens.getChildren(\n refreshToken.sessionId,\n currentTokenId,\n )) as Doc<\"token\">[];\n tokensToInvalidate.push(...children);\n nextFrontier.push(...children.map((child) => child._id));\n }\n frontier = nextFrontier;\n }\n for (const token of tokensToInvalidate) {\n // Mark these as used so they can't be used again (even within the reuse window)\n if (\n token.firstUsedTime === undefined ||\n token.firstUsedTime > Date.now() - REFRESH_TOKEN_REUSE_WINDOW_MS\n ) {\n await db.refreshTokens.patch(token._id, {\n firstUsedTime: Date.now() - REFRESH_TOKEN_REUSE_WINDOW_MS,\n });\n }\n }\n return tokensToInvalidate;\n}\n\nexport async function deleteAllRefreshTokens(\n ctx: MutationCtx,\n sessionId: GenericId<\"session\">,\n config: ConvexAuthConfig,\n) {\n await authDb(ctx, config).refreshTokens.deleteAll(sessionId);\n}\n\nexport async function refreshTokenIfValid(\n ctx: MutationCtx,\n refreshTokenId: string,\n tokenSessionId: string,\n config: ConvexAuthConfig,\n) {\n const db = authDb(ctx, config);\n let refreshTokenDoc: Doc<\"token\"> | null;\n try {\n refreshTokenDoc = (await db.refreshTokens.getById(\n refreshTokenId as GenericId<\"token\">,\n )) as Doc<\"token\"> | null;\n } catch {\n logWithLevel(LOG_LEVELS.ERROR, \"Invalid refresh token format\");\n return null;\n }\n\n if (refreshTokenDoc === null) {\n logWithLevel(LOG_LEVELS.ERROR, \"Invalid refresh token\");\n return null;\n }\n if (refreshTokenDoc.expirationTime < Date.now()) {\n logWithLevel(LOG_LEVELS.ERROR, \"Expired refresh token\");\n return null;\n }\n if (refreshTokenDoc.sessionId !== tokenSessionId) {\n logWithLevel(LOG_LEVELS.ERROR, \"Invalid refresh token session ID\");\n return null;\n }\n let session: Doc<\"session\"> | null;\n try {\n session = (await db.sessions.getById(refreshTokenDoc.sessionId)) as\n | Doc<\"session\">\n | null;\n } catch {\n logWithLevel(LOG_LEVELS.ERROR, \"Invalid refresh token session format\");\n return null;\n }\n if (session === null) {\n logWithLevel(LOG_LEVELS.ERROR, \"Invalid refresh token session\");\n return null;\n }\n if (session.expirationTime < Date.now()) {\n logWithLevel(LOG_LEVELS.ERROR, \"Expired refresh token session\");\n return null;\n }\n return { session, refreshTokenDoc };\n}\n/**\n * The active refresh token is the most recently created refresh token that has\n * never been used.\n *\n * @param ctx\n * @param sessionId\n */\nexport async function loadActiveRefreshToken(\n ctx: MutationCtx,\n sessionId: GenericId<\"session\">,\n config: ConvexAuthConfig,\n) {\n return (await authDb(ctx, config).refreshTokens.getActive(sessionId)) as\n | Doc<\"token\">\n | null;\n}\n"],"mappings":";;;;;AAaA,MAAM,uCAAuC,MAAO,KAAK,KAAK,KAAK;AACnE,MAAa,gCAAgC,KAAK;AAClD,eAAsB,mBACpB,KACA,QACA,WACA,sBAC6B;CAC7B,MAAM,KAAK,OAAO,KAAK,OAAO;CAC9B,MAAM,iBACJ,KAAK,KAAK,IACT,OAAO,SAAS,sBACf,eAAe,QAAQ,IAAI,kCAAkC,IAC7D;AAMJ,QAL2B,MAAM,GAAG,cAAc,OAAO;EACvD;EACA;EACA,sBAAsB,wBAAwB;EAC/C,CAAC;;AAIJ,MAAa,sBACX,gBACA,cACG;AACH,QAAO,GAAG,iBAAiB,wBAAwB;;AAGrD,MAAa,qBACX,iBAIG;CACH,MAAM,CAAC,gBAAgB,aAAa,aAAa,MAAM,sBAAsB;AAC7E,KAAI,CAAC,kBAAkB,CAAC,UACtB,gBAAe,yBAAyB,8BAA8B,YAAY,aAAa,GAAG;AAEpG,QAAO;EACW;EACL;EACZ;;;;;;;;;;AAWH,eAAsB,iCACpB,KACA,cACA,QACA;CACA,MAAM,KAAK,OAAO,KAAK,OAAO;CAC9B,MAAM,qBAAqB,CAAC,aAAa;CACzC,IAAI,WAAiC,CAAC,aAAa,IAAI;AACvD,QAAO,SAAS,SAAS,GAAG;EAC1B,MAAM,eAAqC,EAAE;AAC7C,OAAK,MAAM,kBAAkB,UAAU;GACrC,MAAM,WAAY,MAAM,GAAG,cAAc,YACvC,aAAa,WACb,eACD;AACD,sBAAmB,KAAK,GAAG,SAAS;AACpC,gBAAa,KAAK,GAAG,SAAS,KAAK,UAAU,MAAM,IAAI,CAAC;;AAE1D,aAAW;;AAEb,MAAK,MAAM,SAAS,mBAElB,KACE,MAAM,kBAAkB,UACxB,MAAM,gBAAgB,KAAK,KAAK,GAAG,8BAEnC,OAAM,GAAG,cAAc,MAAM,MAAM,KAAK,EACtC,eAAe,KAAK,KAAK,GAAG,+BAC7B,CAAC;AAGN,QAAO;;AAGT,eAAsB,uBACpB,KACA,WACA,QACA;AACA,OAAM,OAAO,KAAK,OAAO,CAAC,cAAc,UAAU,UAAU;;AAG9D,eAAsB,oBACpB,KACA,gBACA,gBACA,QACA;CACA,MAAM,KAAK,OAAO,KAAK,OAAO;CAC9B,IAAI;AACJ,KAAI;AACF,oBAAmB,MAAM,GAAG,cAAc,QACxC,eACD;SACK;AACN,eAAa,WAAW,OAAO,+BAA+B;AAC9D,SAAO;;AAGT,KAAI,oBAAoB,MAAM;AAC5B,eAAa,WAAW,OAAO,wBAAwB;AACvD,SAAO;;AAET,KAAI,gBAAgB,iBAAiB,KAAK,KAAK,EAAE;AAC/C,eAAa,WAAW,OAAO,wBAAwB;AACvD,SAAO;;AAET,KAAI,gBAAgB,cAAc,gBAAgB;AAChD,eAAa,WAAW,OAAO,mCAAmC;AAClE,SAAO;;CAET,IAAI;AACJ,KAAI;AACF,YAAW,MAAM,GAAG,SAAS,QAAQ,gBAAgB,UAAU;SAGzD;AACN,eAAa,WAAW,OAAO,uCAAuC;AACtE,SAAO;;AAET,KAAI,YAAY,MAAM;AACpB,eAAa,WAAW,OAAO,gCAAgC;AAC/D,SAAO;;AAET,KAAI,QAAQ,iBAAiB,KAAK,KAAK,EAAE;AACvC,eAAa,WAAW,OAAO,gCAAgC;AAC/D,SAAO;;AAET,QAAO;EAAE;EAAS;EAAiB;;;;;;;;;AASrC,eAAsB,uBACpB,KACA,WACA,QACA;AACA,QAAQ,MAAM,OAAO,KAAK,OAAO,CAAC,cAAc,UAAU,UAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sessions.js","names":[],"sources":["../../../../src/server/implementation/sessions.ts"],"sourcesContent":["import { GenericId } from \"convex/values\";\nimport { ConvexAuthConfig } from \"../types\";\nimport { Doc, MutationCtx, SessionInfo } from \"./types\";\nimport { Auth } from \"convex/server\";\nimport {\n LOG_LEVELS,\n TOKEN_SUB_CLAIM_DIVIDER,\n logWithLevel,\n maybeRedact,\n stringToNumber,\n} from \"./utils\";\nimport { generateToken } from \"./tokens\";\nimport {\n createRefreshToken,\n formatRefreshToken,\n deleteAllRefreshTokens,\n} from \"./refresh\";\nimport { authDb } from \"./db\";\n\nconst DEFAULT_SESSION_TOTAL_DURATION_MS = 1000 * 60 * 60 * 24 * 30; // 30 days\n\nexport async function maybeGenerateTokensForSession(\n ctx: MutationCtx,\n config: ConvexAuthConfig,\n userId: GenericId<\"user\">,\n sessionId: GenericId<\"session\">,\n generateTokens: boolean,\n): Promise<SessionInfo> {\n return {\n userId,\n sessionId,\n tokens: generateTokens\n ? await generateTokensForSession(ctx, config, {\n userId,\n sessionId,\n issuedRefreshTokenId: null,\n parentRefreshTokenId: null,\n })\n : null,\n };\n}\n\nexport async function createNewAndDeleteExistingSession(\n ctx: MutationCtx,\n config: ConvexAuthConfig,\n userId: GenericId<\"user\">,\n) {\n const db = authDb(ctx, config);\n const existingSessionId = await getAuthSessionId(ctx);\n if (existingSessionId !== null) {\n const existingSession = await db.sessions.getById(existingSessionId);\n if (existingSession !== null) {\n await deleteSession(ctx, existingSession, config);\n }\n }\n return await createSession(ctx, userId, config);\n}\n\nexport async function generateTokensForSession(\n ctx: MutationCtx,\n config: ConvexAuthConfig,\n args: {\n userId: GenericId<\"user\">;\n sessionId: GenericId<\"session\">;\n issuedRefreshTokenId: GenericId<\"token\"> | null;\n parentRefreshTokenId: GenericId<\"token\"> | null;\n },\n) {\n const ids = { userId: args.userId, sessionId: args.sessionId };\n const refreshTokenId =\n args.issuedRefreshTokenId ??\n (await createRefreshToken(\n ctx,\n config,\n args.sessionId,\n args.parentRefreshTokenId,\n ));\n const result = {\n token: await generateToken(ids, config),\n refreshToken: formatRefreshToken(refreshTokenId, args.sessionId),\n };\n logWithLevel(\n LOG_LEVELS.DEBUG,\n `Generated token ${maybeRedact(result.token)} and refresh token ${maybeRedact(refreshTokenId)} for session ${maybeRedact(args.sessionId)}`,\n );\n return result;\n}\n\nasync function createSession(\n ctx: MutationCtx,\n userId: GenericId<\"user\">,\n config: ConvexAuthConfig,\n) {\n const db = authDb(ctx, config);\n const expirationTime =\n Date.now() +\n (config.session?.totalDurationMs ??\n stringToNumber(process.env.AUTH_SESSION_TOTAL_DURATION_MS) ??\n DEFAULT_SESSION_TOTAL_DURATION_MS);\n return (await db.sessions.create(userId, expirationTime)) as GenericId<\"session\">;\n}\n\nexport async function deleteSession(\n ctx: MutationCtx,\n session: Doc<\"session\">,\n config: ConvexAuthConfig,\n) {\n await authDb(ctx, config).sessions.delete(session._id);\n await deleteAllRefreshTokens(ctx, session._id, config);\n}\n\n/**\n * Return the current session ID from the auth identity subject.\n *\n * Internal helper used by auth runtime internals and `auth.session.current`.\n */\nexport async function getAuthSessionId(ctx: { auth: Auth }) {\n const identity = await ctx.auth.getUserIdentity();\n if (identity === null) {\n return null;\n }\n const [, sessionId] = identity.subject.split(TOKEN_SUB_CLAIM_DIVIDER);\n return sessionId as GenericId<\"session\">;\n}\n"],"mappings":";;;;;;AAmBA,MAAM,oCAAoC,MAAO,KAAK,KAAK,KAAK;AAEhE,eAAsB,8BACpB,KACA,QACA,QACA,WACA,gBACsB;AACtB,QAAO;EACL;EACA;EACA,QAAQ,iBACJ,MAAM,yBAAyB,KAAK,QAAQ;GAC1C;GACA;GACA,sBAAsB;GACtB,sBAAsB;GACvB,CAAC,GACF;EACL;;AAGH,eAAsB,kCACpB,KACA,QACA,QACA;CACA,MAAM,KAAK,OAAO,KAAK,OAAO;CAC9B,MAAM,oBAAoB,MAAM,iBAAiB,IAAI;AACrD,KAAI,sBAAsB,MAAM;EAC9B,MAAM,kBAAkB,MAAM,GAAG,SAAS,QAAQ,kBAAkB;AACpE,MAAI,oBAAoB,KACtB,OAAM,cAAc,KAAK,iBAAiB,OAAO;;AAGrD,QAAO,MAAM,cAAc,KAAK,QAAQ,OAAO;;AAGjD,eAAsB,yBACpB,KACA,QACA,MAMA;CACA,MAAM,MAAM;EAAE,QAAQ,KAAK;EAAQ,WAAW,KAAK;EAAW;CAC9D,MAAM,iBACJ,KAAK,wBACJ,MAAM,mBACL,KACA,QACA,KAAK,WACL,KAAK,qBACN;CACH,MAAM,SAAS;EACb,OAAO,MAAM,cAAc,KAAK,OAAO;EACvC,cAAc,mBAAmB,gBAAgB,KAAK,UAAU;EACjE;AACD,cACE,WAAW,OACX,mBAAmB,YAAY,OAAO,MAAM,CAAC,qBAAqB,YAAY,eAAe,CAAC,eAAe,YAAY,KAAK,UAAU,GACzI;AACD,QAAO;;AAGT,eAAe,cACb,KACA,QACA,QACA;CACA,MAAM,KAAK,OAAO,KAAK,OAAO;CAC9B,MAAM,iBACJ,KAAK,KAAK,IACT,OAAO,SAAS,mBACf,eAAe,QAAQ,IAAI,+BAA+B,IAC1D;AACJ,QAAQ,MAAM,GAAG,SAAS,OAAO,QAAQ,eAAe;;AAG1D,eAAsB,cACpB,KACA,SACA,QACA;AACA,OAAM,OAAO,KAAK,OAAO,CAAC,SAAS,OAAO,QAAQ,IAAI;AACtD,OAAM,uBAAuB,KAAK,QAAQ,KAAK,OAAO;;;;;;;AAQxD,eAAsB,iBAAiB,KAAqB;CAC1D,MAAM,WAAW,MAAM,IAAI,KAAK,iBAAiB;AACjD,KAAI,aAAa,KACf,QAAO;CAET,MAAM,GAAG,aAAa,SAAS,QAAQ,MAAM,wBAAwB;AACrE,QAAO"}
@@ -1,148 +0,0 @@
1
- import { throwAuthError } from "../errors.js";
2
- import { requireEnv } from "../utils.js";
3
- import { generateRandomString } from "./utils.js";
4
- import { callSignIn } from "./mutations/signin.js";
5
- import { callRefreshSession } from "./mutations/refresh.js";
6
- import { callVerifyCodeAndSignIn } from "./mutations/verify.js";
7
- import { callVerifierSignature } from "./mutations/signature.js";
8
- import { callCreateVerificationCode } from "./mutations/code.js";
9
- import { callVerifier } from "./mutations/verifier.js";
10
- import { redirectAbsoluteUrl, setURLSearchParam } from "./redirects.js";
11
- import { handlePasskey } from "./passkey.js";
12
- import { checkTotpRequired, handleTotp } from "./totp.js";
13
- import { handleDevice } from "./device.js";
14
-
15
- //#region src/server/implementation/signin.ts
16
- const DEFAULT_EMAIL_VERIFICATION_CODE_DURATION_S = 3600 * 24;
17
- async function signInImpl(ctx, provider, args, options) {
18
- if (provider === null && args.refreshToken) {
19
- const tokens = await callRefreshSession(ctx, { refreshToken: args.refreshToken });
20
- if (tokens === null) return {
21
- kind: "signedIn",
22
- signedIn: null
23
- };
24
- return {
25
- kind: "refreshTokens",
26
- signedIn: { tokens }
27
- };
28
- }
29
- if (provider === null && args.params?.code !== void 0) return {
30
- kind: "signedIn",
31
- signedIn: await callVerifyCodeAndSignIn(ctx, {
32
- params: args.params,
33
- verifier: args.verifier,
34
- generateTokens: true,
35
- allowExtraProviders: options.allowExtraProviders
36
- })
37
- };
38
- if (provider === null) throwAuthError("SIGN_IN_MISSING_PARAMS");
39
- if (provider.type === "email" || provider.type === "phone") return handleEmailAndPhoneProvider(ctx, provider, args, options);
40
- if (provider.type === "credentials") return handleCredentials(ctx, provider, args, options);
41
- if (provider.type === "oauth") return handleOAuthProvider(ctx, provider, args, options);
42
- if (provider.type === "passkey") return handlePasskey(ctx, provider, args);
43
- if (provider.type === "totp") return handleTotp(ctx, provider, args);
44
- if (provider.type === "device") return handleDevice(ctx, provider, args);
45
- throwAuthError("UNSUPPORTED_PROVIDER_TYPE", `Provider type ${provider.type} is not supported yet`);
46
- }
47
- async function handleEmailAndPhoneProvider(ctx, provider, args, options) {
48
- if (args.params?.code !== void 0) {
49
- const result = await callVerifyCodeAndSignIn(ctx, {
50
- params: args.params,
51
- provider: provider.id,
52
- generateTokens: options.generateTokens,
53
- allowExtraProviders: options.allowExtraProviders
54
- });
55
- if (result === null) throwAuthError("INVALID_VERIFICATION_CODE");
56
- return {
57
- kind: "signedIn",
58
- signedIn: result
59
- };
60
- }
61
- const code = provider.generateVerificationToken ? await provider.generateVerificationToken() : generateRandomString(32, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
62
- const expirationTime = Date.now() + (provider.maxAge ?? DEFAULT_EMAIL_VERIFICATION_CODE_DURATION_S) * 1e3;
63
- const verificationArgs = {
64
- identifier: await callCreateVerificationCode(ctx, {
65
- provider: provider.id,
66
- accountId: args.accountId,
67
- email: args.params?.email,
68
- phone: args.params?.phone,
69
- code,
70
- expirationTime,
71
- allowExtraProviders: options.allowExtraProviders
72
- }),
73
- url: setURLSearchParam(await redirectAbsoluteUrl(ctx.auth.config, args.params ?? {}), "code", code),
74
- token: code,
75
- expires: new Date(expirationTime)
76
- };
77
- if (provider.type === "email") await provider.sendVerificationRequest({
78
- ...verificationArgs,
79
- provider,
80
- request: new Request("http://localhost")
81
- }, ctx);
82
- else if (provider.type === "phone") await provider.sendVerificationRequest({
83
- ...verificationArgs,
84
- provider
85
- }, ctx);
86
- return {
87
- kind: "started",
88
- started: true
89
- };
90
- }
91
- async function handleCredentials(ctx, provider, args, options) {
92
- const result = await provider.authorize(args.params ?? {}, ctx);
93
- if (result === null) return {
94
- kind: "signedIn",
95
- signedIn: null
96
- };
97
- if (await checkTotpRequired(ctx, result.userId)) {
98
- await callSignIn(ctx, {
99
- userId: result.userId,
100
- sessionId: result.sessionId,
101
- generateTokens: false
102
- });
103
- const verifier = await callVerifier(ctx);
104
- await callVerifierSignature(ctx, {
105
- verifier,
106
- signature: JSON.stringify({ userId: result.userId })
107
- });
108
- return {
109
- kind: "totpRequired",
110
- verifier
111
- };
112
- }
113
- return {
114
- kind: "signedIn",
115
- signedIn: await callSignIn(ctx, {
116
- userId: result.userId,
117
- sessionId: result.sessionId,
118
- generateTokens: options.generateTokens
119
- })
120
- };
121
- }
122
- async function handleOAuthProvider(ctx, provider, args, options) {
123
- if (args.params?.code !== void 0) return {
124
- kind: "signedIn",
125
- signedIn: await callVerifyCodeAndSignIn(ctx, {
126
- params: args.params,
127
- verifier: args.verifier,
128
- generateTokens: true,
129
- allowExtraProviders: options.allowExtraProviders
130
- })
131
- };
132
- const redirect = new URL((process.env.CUSTOM_AUTH_SITE_URL ?? requireEnv("CONVEX_SITE_URL")) + `/api/auth/signin/${provider.id}`);
133
- const verifier = await callVerifier(ctx);
134
- redirect.searchParams.set("code", verifier);
135
- if (args.params?.redirectTo !== void 0) {
136
- if (typeof args.params.redirectTo !== "string") throwAuthError("INVALID_REDIRECT", `Expected \`redirectTo\` to be a string, got ${args.params.redirectTo}`);
137
- redirect.searchParams.set("redirectTo", args.params.redirectTo);
138
- }
139
- return {
140
- kind: "redirect",
141
- redirect: redirect.toString(),
142
- verifier
143
- };
144
- }
145
-
146
- //#endregion
147
- export { signInImpl };
148
- //# sourceMappingURL=signin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"signin.js","names":[],"sources":["../../../../src/server/implementation/signin.ts"],"sourcesContent":["import { GenericId } from \"convex/values\";\nimport {\n AuthProviderMaterializedConfig,\n ConvexCredentialsConfig,\n EmailConfig,\n GenericActionCtxWithAuthConfig,\n PhoneConfig,\n} from \"../types\";\nimport {\n AuthDataModel,\n SessionInfo,\n SessionInfoWithTokens,\n Tokens,\n} from \"./types\";\nimport {\n callCreateVerificationCode,\n callRefreshSession,\n callSignIn,\n callVerifier,\n callVerifierSignature,\n callVerifyCodeAndSignIn,\n} from \"./mutations/index\";\nimport { redirectAbsoluteUrl, setURLSearchParam } from \"./redirects\";\nimport { requireEnv } from \"../utils\";\nimport type { OAuthMaterializedConfig } from \"../types\";\nimport { generateRandomString } from \"./utils\";\nimport { handlePasskey } from \"./passkey\";\nimport { handleTotp, checkTotpRequired } from \"./totp\";\nimport { handleDevice } from \"./device\";\nimport { throwAuthError } from \"../errors\";\n\nconst DEFAULT_EMAIL_VERIFICATION_CODE_DURATION_S = 60 * 60 * 24; // 24 hours\n\ntype EnrichedActionCtx = GenericActionCtxWithAuthConfig<AuthDataModel>;\n\nexport async function signInImpl(\n ctx: EnrichedActionCtx,\n provider: AuthProviderMaterializedConfig | null,\n args: {\n accountId?: GenericId<\"account\">;\n params?: Record<string, any>;\n verifier?: string;\n refreshToken?: string;\n calledBy?: string;\n },\n options: {\n generateTokens: boolean;\n allowExtraProviders: boolean;\n },\n): Promise<\n | { kind: \"signedIn\"; signedIn: SessionInfo | null }\n // refresh tokens\n | { kind: \"refreshTokens\"; signedIn: { tokens: Tokens } }\n // Multi-step flows like magic link + OTP\n | { kind: \"started\"; started: true }\n // OAuth flows\n | { kind: \"redirect\"; redirect: string; verifier: string }\n // Passkey options (challenge + credential options)\n | { kind: \"passkeyOptions\"; options: Record<string, any>; verifier: string }\n // TOTP 2FA required after credentials sign-in\n | { kind: \"totpRequired\"; verifier: string }\n // TOTP setup response (enrollment)\n | { kind: \"totpSetup\"; uri: string; secret: string; verifier: string; totpId: string }\n // Device authorization (RFC 8628) — codes for the device to display\n | {\n kind: \"deviceCode\";\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n verificationUriComplete: string;\n expiresIn: number;\n interval: number;\n }\n> {\n if (provider === null && args.refreshToken) {\n const tokens = await callRefreshSession(ctx, {\n refreshToken: args.refreshToken,\n });\n if (tokens === null) {\n return { kind: \"signedIn\", signedIn: null };\n }\n return { kind: \"refreshTokens\", signedIn: { tokens } };\n }\n if (provider === null && args.params?.code !== undefined) {\n const result = await callVerifyCodeAndSignIn(ctx, {\n params: args.params,\n verifier: args.verifier,\n generateTokens: true,\n allowExtraProviders: options.allowExtraProviders,\n });\n return {\n kind: \"signedIn\",\n signedIn: result,\n };\n }\n\n if (provider === null) {\n throwAuthError(\"SIGN_IN_MISSING_PARAMS\");\n }\n if (provider.type === \"email\" || provider.type === \"phone\") {\n return handleEmailAndPhoneProvider(ctx, provider, args, options);\n }\n if (provider.type === \"credentials\") {\n return handleCredentials(ctx, provider, args, options);\n }\n if (provider.type === \"oauth\") {\n return handleOAuthProvider(ctx, provider, args, options);\n }\n if (provider.type === \"passkey\") {\n return handlePasskey(ctx, provider, args);\n }\n if (provider.type === \"totp\") {\n return handleTotp(ctx, provider, args);\n }\n if (provider.type === \"device\") {\n return handleDevice(ctx, provider, args);\n }\n const _typecheck: never = provider;\n throwAuthError(\n \"UNSUPPORTED_PROVIDER_TYPE\",\n `Provider type ${(provider as any).type} is not supported yet`,\n );\n}\n\nasync function handleEmailAndPhoneProvider(\n ctx: EnrichedActionCtx,\n provider: EmailConfig | PhoneConfig,\n args: {\n params?: Record<string, any>;\n accountId?: GenericId<\"account\">;\n },\n options: {\n generateTokens: boolean;\n allowExtraProviders: boolean;\n },\n): Promise<\n | { kind: \"started\"; started: true }\n | { kind: \"signedIn\"; signedIn: SessionInfoWithTokens }\n> {\n if (args.params?.code !== undefined) {\n const result = await callVerifyCodeAndSignIn(ctx, {\n params: args.params,\n provider: provider.id,\n generateTokens: options.generateTokens,\n allowExtraProviders: options.allowExtraProviders,\n });\n if (result === null) {\n throwAuthError(\"INVALID_VERIFICATION_CODE\");\n }\n return {\n kind: \"signedIn\",\n signedIn: result as SessionInfoWithTokens,\n };\n }\n\n const alphabet =\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n const code = provider.generateVerificationToken\n ? await provider.generateVerificationToken()\n : generateRandomString(32, alphabet);\n const expirationTime =\n Date.now() +\n (provider.maxAge ?? DEFAULT_EMAIL_VERIFICATION_CODE_DURATION_S) * 1000;\n\n const identifier = await callCreateVerificationCode(ctx, {\n provider: provider.id,\n accountId: args.accountId,\n email: args.params?.email,\n phone: args.params?.phone,\n code,\n expirationTime,\n allowExtraProviders: options.allowExtraProviders,\n });\n const destination = await redirectAbsoluteUrl(\n ctx.auth.config,\n (args.params ?? {}) as { redirectTo: unknown },\n );\n const verificationArgs = {\n identifier,\n url: setURLSearchParam(destination, \"code\", code),\n token: code,\n expires: new Date(expirationTime),\n };\n if (provider.type === \"email\") {\n await provider.sendVerificationRequest(\n {\n ...verificationArgs,\n provider,\n request: new Request(\"http://localhost\"),\n },\n ctx,\n );\n } else if (provider.type === \"phone\") {\n await provider.sendVerificationRequest(\n { ...verificationArgs, provider },\n ctx,\n );\n }\n return { kind: \"started\", started: true };\n}\n\nasync function handleCredentials(\n ctx: EnrichedActionCtx,\n provider: ConvexCredentialsConfig,\n args: {\n params?: Record<string, any>;\n },\n options: {\n generateTokens: boolean;\n },\n): Promise<\n | { kind: \"signedIn\"; signedIn: SessionInfo | null }\n | { kind: \"totpRequired\"; verifier: string }\n> {\n const result = await provider.authorize(args.params ?? {}, ctx);\n if (result === null) {\n return { kind: \"signedIn\", signedIn: null };\n }\n // Check if user has TOTP 2FA enrolled before issuing tokens\n const hasTotpEnrolled = await checkTotpRequired(ctx, result.userId);\n if (hasTotpEnrolled) {\n // Create session but withhold tokens — TOTP verification needed\n await callSignIn(ctx, {\n userId: result.userId,\n sessionId: result.sessionId,\n generateTokens: false,\n });\n // Store userId in verifier so the TOTP verify flow can complete sign-in\n const verifier = await callVerifier(ctx);\n await callVerifierSignature(ctx, {\n verifier,\n signature: JSON.stringify({ userId: result.userId }),\n });\n return { kind: \"totpRequired\", verifier };\n }\n\n const idsAndTokens = await callSignIn(ctx, {\n userId: result.userId,\n sessionId: result.sessionId,\n generateTokens: options.generateTokens,\n });\n return {\n kind: \"signedIn\",\n signedIn: idsAndTokens,\n };\n}\n\nasync function handleOAuthProvider(\n ctx: EnrichedActionCtx,\n provider: OAuthMaterializedConfig,\n args: {\n params?: Record<string, any>;\n verifier?: string;\n },\n options: {\n allowExtraProviders: boolean;\n },\n): Promise<\n | { kind: \"signedIn\"; signedIn: SessionInfoWithTokens | null }\n | { kind: \"redirect\"; redirect: string; verifier: string }\n> {\n // We have this action because:\n // 1. We remember the current sessionId if any, so we can link accounts\n // 2. The client doesn't need to know the HTTP Actions URL\n // of the backend (this simplifies using local backend)\n // 3. The client doesn't need to know which provider is of which type,\n // and hence which provider requires client-side redirect\n // 4. On mobile the client can complete the flow manually\n if (args.params?.code !== undefined) {\n const result = await callVerifyCodeAndSignIn(ctx, {\n params: args.params,\n verifier: args.verifier,\n generateTokens: true,\n allowExtraProviders: options.allowExtraProviders,\n });\n return {\n kind: \"signedIn\",\n signedIn: result as SessionInfoWithTokens | null,\n };\n }\n const redirect = new URL(\n (process.env.CUSTOM_AUTH_SITE_URL ?? requireEnv(\"CONVEX_SITE_URL\")) + `/api/auth/signin/${provider.id}`,\n );\n const verifier = await callVerifier(ctx);\n redirect.searchParams.set(\"code\", verifier);\n if (args.params?.redirectTo !== undefined) {\n if (typeof args.params.redirectTo !== \"string\") {\n throwAuthError(\n \"INVALID_REDIRECT\",\n `Expected \\`redirectTo\\` to be a string, got ${args.params.redirectTo}`,\n );\n }\n redirect.searchParams.set(\"redirectTo\", args.params.redirectTo);\n }\n return { kind: \"redirect\", redirect: redirect.toString(), verifier };\n}\n"],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import { requireEnv } from "../utils.js";
2
- import { TOKEN_SUB_CLAIM_DIVIDER } from "./utils.js";
3
- import { SignJWT, importPKCS8 } from "jose";
4
-
5
- //#region src/server/implementation/tokens.ts
6
- const DEFAULT_JWT_DURATION_MS = 1e3 * 60 * 60;
7
- async function generateToken(args, config) {
8
- const privateKey = await importPKCS8(requireEnv("JWT_PRIVATE_KEY"), "RS256");
9
- const expirationTime = new Date(Date.now() + (config.jwt?.durationMs ?? DEFAULT_JWT_DURATION_MS));
10
- return await new SignJWT({ sub: args.userId + TOKEN_SUB_CLAIM_DIVIDER + args.sessionId }).setProtectedHeader({ alg: "RS256" }).setIssuedAt().setIssuer(requireEnv("CONVEX_SITE_URL")).setAudience("convex").setExpirationTime(expirationTime).sign(privateKey);
11
- }
12
-
13
- //#endregion
14
- export { generateToken };
15
- //# sourceMappingURL=tokens.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tokens.js","names":[],"sources":["../../../../src/server/implementation/tokens.ts"],"sourcesContent":["import { GenericId } from \"convex/values\";\nimport { ConvexAuthConfig } from \"../types\";\nimport { SignJWT, importPKCS8 } from \"jose\";\nimport { requireEnv } from \"../utils\";\nimport { TOKEN_SUB_CLAIM_DIVIDER } from \"./utils\";\n\nconst DEFAULT_JWT_DURATION_MS = 1000 * 60 * 60; // 1 hour\n\nexport async function generateToken(\n args: {\n userId: GenericId<\"user\">;\n sessionId: GenericId<\"session\">;\n },\n config: ConvexAuthConfig,\n) {\n const privateKey = await importPKCS8(requireEnv(\"JWT_PRIVATE_KEY\"), \"RS256\");\n const expirationTime = new Date(\n Date.now() + (config.jwt?.durationMs ?? DEFAULT_JWT_DURATION_MS),\n );\n return await new SignJWT({\n sub: args.userId + TOKEN_SUB_CLAIM_DIVIDER + args.sessionId,\n })\n .setProtectedHeader({ alg: \"RS256\" })\n .setIssuedAt()\n .setIssuer(requireEnv(\"CONVEX_SITE_URL\"))\n .setAudience(\"convex\")\n .setExpirationTime(expirationTime)\n .sign(privateKey);\n}\n"],"mappings":";;;;;AAMA,MAAM,0BAA0B,MAAO,KAAK;AAE5C,eAAsB,cACpB,MAIA,QACA;CACA,MAAM,aAAa,MAAM,YAAY,WAAW,kBAAkB,EAAE,QAAQ;CAC5E,MAAM,iBAAiB,IAAI,KACzB,KAAK,KAAK,IAAI,OAAO,KAAK,cAAc,yBACzC;AACD,QAAO,MAAM,IAAI,QAAQ,EACvB,KAAK,KAAK,SAAS,0BAA0B,KAAK,WACnD,CAAC,CACC,mBAAmB,EAAE,KAAK,SAAS,CAAC,CACpC,aAAa,CACb,UAAU,WAAW,kBAAkB,CAAC,CACxC,YAAY,SAAS,CACrB,kBAAkB,eAAe,CACjC,KAAK,WAAW"}