@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,4 +1,12 @@
1
1
  import { AUTH_ERRORS, isAuthError, parseAuthError } from "../server/errors.js";
2
+ import { browserMutex, getStorageListenerRegistry } from "../runtime/browser.js";
3
+ import { createDeviceClient } from "../factors/device.js";
4
+ import { createInviteManager } from "../runtime/invite.js";
5
+ import { createPasskeyClient } from "../factors/passkey.js";
6
+ import { createProxyHelpers, isRetriableProxyRefreshError, isTransientNetworkError } from "../runtime/proxy.js";
7
+ import { createStorageHelpers } from "../runtime/storage.js";
8
+ import { createTotpClient } from "../factors/totp.js";
9
+ import { Fx } from "@robelest/fx";
2
10
  import { ConvexHttpClient } from "convex/browser";
3
11
  import { ConvexError } from "convex/values";
4
12
 
@@ -6,8 +14,11 @@ import { ConvexError } from "convex/values";
6
14
  const VERIFIER_STORAGE_KEY = "__convexAuthOAuthVerifier";
7
15
  const JWT_STORAGE_KEY = "__convexAuthJWT";
8
16
  const REFRESH_TOKEN_STORAGE_KEY = "__convexAuthRefreshToken";
9
- const RETRY_BACKOFF = [500, 2e3];
10
- const RETRY_JITTER = 100;
17
+ const INVITE_TOKEN_KEY = "__convexAuthPendingInvite";
18
+ const INVITE_EMAIL_KEY = "__convexAuthPendingInviteEmail";
19
+ const RETRY_BASE_MS = 500;
20
+ const RETRY_MAX_RETRIES = 2;
21
+ const AUTH_HANDSHAKE_TIMEOUT_MS = 5e3;
11
22
  /**
12
23
  * Resolve the Convex deployment URL from the client.
13
24
  *
@@ -32,9 +43,10 @@ function resolveUrl(convex, explicit) {
32
43
  * ```ts
33
44
  * import { ConvexClient } from 'convex/browser';
34
45
  * import { client } from '@robelest/convex-auth/client';
46
+ * import { api } from '../convex/_generated/api';
35
47
  *
36
48
  * const convex = new ConvexClient(CONVEX_URL);
37
- * const auth = client({ convex });
49
+ * const auth = client({ convex, api: api.auth });
38
50
  * ```
39
51
  *
40
52
  * ### SSR / proxy mode
@@ -42,8 +54,8 @@ function resolveUrl(convex, explicit) {
42
54
  * ```ts
43
55
  * const auth = client({
44
56
  * convex,
45
- * proxy: '/api/auth',
46
- * token: tokenFromServer, // JWT read from httpOnly cookie during SSR
57
+ * proxyPath: '/api/auth',
58
+ * tokenSeed: tokenFromServer, // JWT read from httpOnly cookie during SSR
47
59
  * });
48
60
  * ```
49
61
  *
@@ -52,50 +64,189 @@ function resolveUrl(convex, explicit) {
52
64
  * holds the JWT in memory only.
53
65
  *
54
66
  * @param options - Client configuration. See {@link ClientOptions}.
55
- * @returns Auth client with `signIn`, `signOut`, `onChange`, `state`, `passkey`, and `totp`.
67
+ * @typeParam Api - An AuthApiRefs type determining which factor helpers are available.
68
+ * @returns Auth client with conditional `passkey`, `totp`, and `device` helpers.
69
+ * @throws {Error} When the Convex deployment URL cannot be determined and `url` is not passed explicitly.
70
+ * @throws {Error} When `proxyPath` is not set and the `api` option is missing.
56
71
  */
57
72
  function client(options) {
58
- const { convex, proxy } = options;
73
+ const { convex, proxyPath, api: apiRefs } = options;
74
+ const proxy = proxyPath;
75
+ function requireApiRefs() {
76
+ if (!apiRefs) throw new Error("The `api` option is required when `proxyPath` is not set. Pass { api: api.auth }.");
77
+ return apiRefs;
78
+ }
59
79
  const storage = options.storage !== void 0 ? options.storage : proxy ? null : typeof window === "undefined" ? null : window.localStorage;
60
- const replaceURL = options.replaceURL ?? ((url$1) => {
80
+ const replaceUrl = options.replaceUrl ?? ((url$1) => {
61
81
  if (typeof window !== "undefined") window.history.replaceState({}, "", url$1);
62
82
  });
83
+ function getLocation() {
84
+ if (typeof options.location === "function") return options.location();
85
+ if (options.location instanceof URL) return options.location;
86
+ if (typeof window !== "undefined") return new URL(window.location.href);
87
+ return null;
88
+ }
89
+ /**
90
+ * SSR-safe URL parameter reader.
91
+ *
92
+ * Uses the `location` option if provided, otherwise falls back to
93
+ * `window.location` (returns `null` during SSR where `window` is unavailable).
94
+ *
95
+ * @param name - The query parameter name.
96
+ * @returns The parameter value, or `null` if not present or in SSR.
97
+ *
98
+ * @example
99
+ * ```ts
100
+ * const workspaceId = auth.param("workspace");
101
+ * const tab = auth.param("tab") ?? "issues";
102
+ * ```
103
+ */
104
+ function param(name) {
105
+ return getLocation()?.searchParams.get(name) ?? null;
106
+ }
107
+ function cleanUrlParams(params) {
108
+ const loc = getLocation();
109
+ if (!loc) return;
110
+ const searchParams = new URLSearchParams(loc.search);
111
+ let changed = false;
112
+ for (const p of params) if (searchParams.has(p)) {
113
+ searchParams.delete(p);
114
+ changed = true;
115
+ }
116
+ if (changed) replaceUrl(searchParams.toString() ? `${loc.pathname}?${searchParams}` : loc.pathname);
117
+ }
63
118
  const url = proxy ? void 0 : resolveUrl(convex, options.url);
64
119
  const escapedNamespace = proxy ? proxy.replace(/[^a-zA-Z0-9]/g, "") : url.replace(/[^a-zA-Z0-9]/g, "");
65
120
  const key = (name) => `${name}_${escapedNamespace}`;
121
+ const { get: storageGet, set: storageSet, remove: storageRemove } = createStorageHelpers({
122
+ storage,
123
+ key
124
+ });
125
+ const { isAbsoluteUrl, proxyFetch, resolveProxyUrl } = createProxyHelpers({ proxy });
66
126
  const subscribers = /* @__PURE__ */ new Set();
127
+ let disposeStorageListener = null;
67
128
  const httpClient = proxy ? null : new ConvexHttpClient(url);
68
- const serverToken = options.token ?? null;
129
+ const serverToken = typeof options.tokenSeed === "string" && options.tokenSeed.trim().length > 0 ? options.tokenSeed : null;
69
130
  const hasServerToken = serverToken !== null;
70
131
  let token = serverToken;
71
132
  let isLoading = !hasServerToken;
133
+ let authConfirmed = hasServerToken;
134
+ let handshakePending = false;
135
+ let authEpoch = 0;
136
+ let destroyed = false;
137
+ const handshakeWaiters = /* @__PURE__ */ new Set();
72
138
  let snapshot = {
139
+ phase: hasServerToken ? "authenticated" : isLoading ? "loading" : "unauthenticated",
73
140
  isLoading,
74
141
  isAuthenticated: hasServerToken,
75
142
  token
76
143
  };
77
144
  let handlingCodeFlow = false;
145
+ const createHandshakeError = (code, context) => {
146
+ return new ConvexError({
147
+ code,
148
+ message: AUTH_ERRORS[code],
149
+ ...context
150
+ });
151
+ };
152
+ const settleHandshakeWaiters = (epoch, outcome) => {
153
+ for (const waiter of Array.from(handshakeWaiters)) {
154
+ if (waiter.epoch !== epoch) continue;
155
+ clearTimeout(waiter.timeoutId);
156
+ handshakeWaiters.delete(waiter);
157
+ if (outcome.type === "resolve") waiter.resolve();
158
+ else waiter.reject(outcome.error);
159
+ }
160
+ };
161
+ const rejectObsoleteHandshakeWaiters = (activeEpoch) => {
162
+ for (const waiter of Array.from(handshakeWaiters)) {
163
+ if (waiter.epoch >= activeEpoch) continue;
164
+ clearTimeout(waiter.timeoutId);
165
+ handshakeWaiters.delete(waiter);
166
+ waiter.reject(createHandshakeError("AUTH_HANDSHAKE_REJECTED", {
167
+ ...waiter.context,
168
+ reason: "token_changed"
169
+ }));
170
+ }
171
+ };
172
+ const waitForAuthHandshake = async (context) => {
173
+ if (token === null) return;
174
+ if (authConfirmed && !handshakePending) return;
175
+ if (!handshakePending) throw createHandshakeError("AUTH_HANDSHAKE_REJECTED", {
176
+ ...context,
177
+ reason: "auth_rejected"
178
+ });
179
+ const epoch = authEpoch;
180
+ await new Promise((resolve, reject) => {
181
+ const waiterRef = { current: null };
182
+ const waiter = {
183
+ epoch,
184
+ context,
185
+ resolve,
186
+ reject,
187
+ timeoutId: setTimeout(() => {
188
+ if (waiterRef.current !== null) handshakeWaiters.delete(waiterRef.current);
189
+ reject(createHandshakeError("AUTH_HANDSHAKE_TIMEOUT", {
190
+ ...context,
191
+ timeoutMs: AUTH_HANDSHAKE_TIMEOUT_MS
192
+ }));
193
+ }, AUTH_HANDSHAKE_TIMEOUT_MS)
194
+ };
195
+ waiterRef.current = waiter;
196
+ handshakeWaiters.add(waiter);
197
+ });
198
+ };
199
+ const handleConvexAuthChange = (isAuthenticated) => {
200
+ if (destroyed) return;
201
+ if (isAuthenticated) {
202
+ authConfirmed = true;
203
+ handshakePending = false;
204
+ settleHandshakeWaiters(authEpoch, { type: "resolve" });
205
+ } else authConfirmed = false;
206
+ if (updateSnapshot()) notify();
207
+ };
78
208
  const notify = () => {
79
209
  for (const cb of subscribers) cb();
80
210
  };
81
211
  const updateSnapshot = () => {
212
+ const phase = {
213
+ handshake: "handshake",
214
+ loading: "loading",
215
+ authenticated: "authenticated",
216
+ unauthenticated: "unauthenticated"
217
+ }[{ tag: token !== null && handshakePending ? "handshake" : isLoading ? "loading" : token !== null && authConfirmed ? "authenticated" : "unauthenticated" }.tag];
82
218
  const next = {
83
- isLoading,
84
- isAuthenticated: token !== null,
219
+ phase,
220
+ isLoading: phase === "loading" || phase === "handshake",
221
+ isAuthenticated: phase === "authenticated",
85
222
  token
86
223
  };
87
- if (snapshot.isLoading === next.isLoading && snapshot.isAuthenticated === next.isAuthenticated && snapshot.token === next.token) return false;
224
+ if (snapshot.phase === next.phase && snapshot.isLoading === next.isLoading && snapshot.isAuthenticated === next.isAuthenticated && snapshot.token === next.token) return false;
88
225
  snapshot = next;
89
226
  return true;
90
227
  };
91
- const storageGet = async (name) => storage ? await storage.getItem(key(name)) ?? null : null;
92
- const storageSet = async (name, value) => {
93
- if (storage) await storage.setItem(key(name), value);
228
+ const finalizeLoadingState = () => {
229
+ if (!isLoading) return;
230
+ isLoading = false;
231
+ if (updateSnapshot()) notify();
94
232
  };
95
- const storageRemove = async (name) => {
96
- if (storage) await storage.removeItem(key(name));
233
+ const inviteManager = createInviteManager({
234
+ param,
235
+ storageGet,
236
+ storageSet,
237
+ storageRemove,
238
+ cleanUrlParams,
239
+ tokenKey: INVITE_TOKEN_KEY,
240
+ emailKey: INVITE_EMAIL_KEY
241
+ });
242
+ const getPendingInvite = () => inviteManager.getPendingInvite();
243
+ const persistInvite = () => inviteManager.persistInvite();
244
+ const acceptInvite = () => inviteManager.acceptInvite();
245
+ const bindConvexAuth = () => {
246
+ convex.setAuth(fetchAccessToken, handleConvexAuthChange);
97
247
  };
98
248
  const setToken = async (args) => {
249
+ const previousToken = token;
99
250
  if (args.tokens === null) {
100
251
  token = null;
101
252
  if (args.shouldStore) {
@@ -109,53 +260,66 @@ function client(options) {
109
260
  await storageSet(REFRESH_TOKEN_STORAGE_KEY, args.tokens.refreshToken);
110
261
  }
111
262
  }
263
+ if (token !== previousToken) {
264
+ authEpoch += 1;
265
+ rejectObsoleteHandshakeWaiters(authEpoch);
266
+ }
267
+ if (token === null) {
268
+ authConfirmed = false;
269
+ handshakePending = false;
270
+ settleHandshakeWaiters(authEpoch, {
271
+ type: "reject",
272
+ error: createHandshakeError("AUTH_HANDSHAKE_REJECTED", { reason: "token_cleared" })
273
+ });
274
+ } else if (args.requireHandshake === true || !authConfirmed) {
275
+ authConfirmed = false;
276
+ handshakePending = true;
277
+ } else handshakePending = false;
112
278
  const hadPendingLoad = isLoading;
113
279
  isLoading = false;
114
280
  const changed = updateSnapshot();
115
- if (hadPendingLoad || changed) {
116
- if (!proxy) convex.setAuth(fetchAccessToken);
117
- notify();
118
- }
281
+ if (args.resyncConvexAuth !== false) bindConvexAuth();
282
+ if (hadPendingLoad || changed) notify();
119
283
  };
120
- const proxyFetch = async (body) => {
121
- const response = await fetch(proxy, {
122
- method: "POST",
123
- headers: { "Content-Type": "application/json" },
124
- credentials: "include",
125
- body: JSON.stringify(body)
284
+ const setTokenAndMaybeWait = async (args) => {
285
+ const { waitForHandshake, context, ...tokenArgs } = args;
286
+ await setToken({
287
+ ...tokenArgs,
288
+ requireHandshake: waitForHandshake
126
289
  });
127
- if (!response.ok) {
128
- const errorBody = await response.json().catch(() => ({}));
129
- if (typeof errorBody === "object" && errorBody !== null && "authError" in errorBody && typeof errorBody.authError === "object") throw new ConvexError(errorBody.authError);
130
- throw new Error(errorBody.error ?? `Proxy request failed: ${response.status}`);
131
- }
132
- return response.json();
290
+ if (tokenArgs.tokens === null) return false;
291
+ if (waitForHandshake) await waitForAuthHandshake(context);
292
+ return true;
133
293
  };
134
294
  const verifyCode = async (args) => {
135
- let lastError;
136
- let retry = 0;
137
- while (retry < RETRY_BACKOFF.length) try {
138
- return await httpClient.action("auth:signIn", "code" in args ? {
295
+ const verifyCodeRetryPolicy = Fx.retry.while(Fx.retry.compose(Fx.retry.jittered(Fx.retry.exponential(RETRY_BASE_MS)), Fx.retry.recurs(RETRY_MAX_RETRIES)), (meta) => isTransientNetworkError(meta.input));
296
+ return Fx.run(Fx.from({
297
+ ok: () => httpClient.action(requireApiRefs().signIn, "code" in args ? {
139
298
  params: { code: args.code },
140
299
  verifier: args.verifier
141
- } : args);
142
- } catch (e) {
143
- lastError = e;
144
- if (!(e instanceof Error && /network/i.test(e.message || ""))) break;
145
- const wait = RETRY_BACKOFF[retry] + RETRY_JITTER * Math.random();
146
- retry++;
147
- await new Promise((resolve) => setTimeout(resolve, wait));
148
- }
149
- throw lastError;
300
+ } : args),
301
+ err: (e) => e
302
+ }).pipe(Fx.retry(verifyCodeRetryPolicy), Fx.recover((e) => Fx.fatal(e))));
150
303
  };
151
- const verifyCodeAndSetToken = async (args) => {
304
+ const verifyCodeAndSetToken = async (args, opts) => {
152
305
  const { tokens } = await verifyCode(args);
153
306
  await setToken({
154
307
  shouldStore: true,
155
- tokens: tokens ?? null
308
+ tokens: tokens ?? null,
309
+ resyncConvexAuth: opts?.resyncConvexAuth
156
310
  });
157
311
  return tokens !== null;
158
312
  };
313
+ const normalizeDeviceCodeResult = (device_code) => {
314
+ return {
315
+ deviceCode: device_code.deviceCode,
316
+ userCode: device_code.userCode,
317
+ verificationUri: device_code.verification_uri ?? device_code.verificationUri,
318
+ verificationUriComplete: device_code.verification_uri_complete ?? device_code.verificationUriComplete,
319
+ expiresIn: device_code.expiresIn,
320
+ interval: device_code.interval
321
+ };
322
+ };
159
323
  /**
160
324
  * Sign in with a provider.
161
325
  *
@@ -164,6 +328,7 @@ function client(options) {
164
328
  * @param args - Provider-specific arguments. Pass a `Record<string, Value>`
165
329
  * or `FormData`. Common fields: `email`, `password`, `code`, `redirectTo`.
166
330
  * @returns A {@link SignInResult} indicating the outcome.
331
+ * @throws {ConvexError} When the server action rejects the sign-in attempt (e.g. invalid credentials, provider error, or rate limiting).
167
332
  *
168
333
  * @example Email magic link
169
334
  * ```ts
@@ -173,8 +338,8 @@ function client(options) {
173
338
  * @example Password
174
339
  * ```ts
175
340
  * const result = await auth.signIn('password', { email, password, flow: 'signIn' });
176
- * if (result.totpRequired) {
177
- * await auth.totp.verify({ code: totpCode, verifier: result.verifier! });
341
+ * if (result.kind === 'totpRequired') {
342
+ * await auth.totp.verify({ code: totpCode, verifier: result.verifier });
178
343
  * }
179
344
  * ```
180
345
  *
@@ -184,77 +349,83 @@ function client(options) {
184
349
  * ```
185
350
  */
186
351
  const signIn = async (provider, args) => {
187
- const params = args instanceof FormData ? Array.from(args.entries()).reduce((acc, [k, v]) => {
188
- acc[k] = v;
189
- return acc;
190
- }, {}) : args ?? {};
191
- if (proxy) {
192
- const result$1 = await proxyFetch({
193
- action: "auth:signIn",
194
- args: {
195
- provider,
196
- params
197
- }
352
+ await persistInvite();
353
+ const params = args instanceof FormData ? (() => {
354
+ const formParams = {};
355
+ args.forEach((value, key$1) => {
356
+ formParams[key$1] = typeof value === "string" ? value : value.name;
198
357
  });
199
- if (result$1.redirect !== void 0) {
200
- const redirectUrl = new URL(result$1.redirect);
201
- if (typeof window !== "undefined") window.location.href = redirectUrl.toString();
202
- return {
203
- signingIn: false,
204
- redirect: redirectUrl
205
- };
206
- }
207
- if (result$1.totpRequired) return {
208
- signingIn: false,
209
- totpRequired: true,
210
- verifier: result$1.verifier
211
- };
212
- if (result$1.deviceCode !== void 0) return {
213
- signingIn: false,
214
- deviceCode: result$1.deviceCode
215
- };
216
- if (result$1.tokens !== void 0) {
217
- await setToken({
218
- shouldStore: false,
219
- tokens: result$1.tokens === null ? null : { token: result$1.tokens.token }
220
- });
221
- return { signingIn: result$1.tokens !== null };
358
+ return formParams;
359
+ })() : args ?? {};
360
+ const flow = typeof params.flow === "string" && params.flow.length > 0 ? params.flow : "signIn";
361
+ const handleSignInActionResult = async (result, options$1) => Fx.run(Fx.match(result, result.kind, {
362
+ redirect: (redirectResult) => Fx.from({
363
+ ok: async () => {
364
+ const redirectUrl = new URL(redirectResult.redirect);
365
+ if (options$1.persistVerifier) await storageSet(VERIFIER_STORAGE_KEY, redirectResult.verifier);
366
+ if (typeof window !== "undefined") window.location.href = redirectUrl.toString();
367
+ return {
368
+ kind: "redirect",
369
+ redirect: redirectUrl,
370
+ verifier: redirectResult.verifier
371
+ };
372
+ },
373
+ err: (e) => e
374
+ }),
375
+ totpRequired: (totpRequiredResult) => Fx.succeed({
376
+ kind: "totpRequired",
377
+ verifier: totpRequiredResult.verifier
378
+ }),
379
+ deviceCode: (deviceCodeResult) => Fx.succeed({
380
+ kind: "deviceCode",
381
+ deviceCode: normalizeDeviceCodeResult(deviceCodeResult.deviceCode)
382
+ }),
383
+ signedIn: (signedInResult) => Fx.from({
384
+ ok: async () => {
385
+ return await setTokenAndMaybeWait(options$1.shouldStore ? {
386
+ shouldStore: true,
387
+ tokens: signedInResult.tokens,
388
+ waitForHandshake: true,
389
+ context: {
390
+ provider,
391
+ flow
392
+ }
393
+ } : {
394
+ shouldStore: false,
395
+ tokens: signedInResult.tokens === null ? null : { token: signedInResult.tokens.token },
396
+ waitForHandshake: true,
397
+ context: {
398
+ provider,
399
+ flow
400
+ }
401
+ }) ? { kind: "signedIn" } : { kind: "started" };
402
+ },
403
+ err: (e) => e
404
+ }),
405
+ started: (_startedResult) => Fx.succeed({ kind: "started" }),
406
+ passkeyOptions: (_passkeyOptionsResult) => Fx.succeed({ kind: "started" }),
407
+ totpSetup: (_totpSetupResult) => Fx.succeed({ kind: "started" })
408
+ }));
409
+ if (proxy) return handleSignInActionResult(await proxyFetch({
410
+ action: "auth:signIn",
411
+ args: {
412
+ provider,
413
+ params
222
414
  }
223
- return { signingIn: false };
224
- }
415
+ }), {
416
+ shouldStore: false,
417
+ persistVerifier: false
418
+ });
225
419
  const verifier = await storageGet(VERIFIER_STORAGE_KEY) ?? void 0;
226
420
  await storageRemove(VERIFIER_STORAGE_KEY);
227
- const result = await convex.action("auth:signIn", {
421
+ return handleSignInActionResult(await convex.action(requireApiRefs().signIn, {
228
422
  provider,
229
423
  params,
230
424
  verifier
425
+ }), {
426
+ shouldStore: true,
427
+ persistVerifier: true
231
428
  });
232
- if (result.redirect !== void 0) {
233
- const redirectUrl = new URL(result.redirect);
234
- await storageSet(VERIFIER_STORAGE_KEY, result.verifier);
235
- if (typeof window !== "undefined") window.location.href = redirectUrl.toString();
236
- return {
237
- signingIn: false,
238
- redirect: redirectUrl
239
- };
240
- }
241
- if (result.totpRequired) return {
242
- signingIn: false,
243
- totpRequired: true,
244
- verifier: result.verifier
245
- };
246
- if (result.deviceCode !== void 0) return {
247
- signingIn: false,
248
- deviceCode: result.deviceCode
249
- };
250
- if (result.tokens !== void 0) {
251
- await setToken({
252
- shouldStore: true,
253
- tokens: result.tokens ?? null
254
- });
255
- return { signingIn: result.tokens !== null };
256
- }
257
- return { signingIn: false };
258
429
  };
259
430
  /**
260
431
  * Sign out the current user.
@@ -265,12 +436,13 @@ function client(options) {
265
436
  */
266
437
  const signOut = async () => {
267
438
  if (proxy) {
268
- try {
269
- await proxyFetch({
439
+ await Fx.run(Fx.from({
440
+ ok: () => proxyFetch({
270
441
  action: "auth:signOut",
271
442
  args: {}
272
- });
273
- } catch {}
443
+ }),
444
+ err: () => void 0
445
+ }).pipe(Fx.recover(() => Fx.succeed(void 0))));
274
446
  await setToken({
275
447
  shouldStore: false,
276
448
  tokens: null
@@ -278,9 +450,10 @@ function client(options) {
278
450
  if (convex.clearAuth) convex.clearAuth();
279
451
  return;
280
452
  }
281
- try {
282
- await convex.action("auth:signOut", {});
283
- } catch {}
453
+ await Fx.run(Fx.from({
454
+ ok: () => convex.action(requireApiRefs().signOut, {}),
455
+ err: () => void 0
456
+ }).pipe(Fx.recover(() => Fx.succeed(void 0))));
284
457
  await setToken({
285
458
  shouldStore: true,
286
459
  tokens: null
@@ -290,28 +463,39 @@ function client(options) {
290
463
  const fetchAccessToken = async ({ forceRefreshToken }) => {
291
464
  if (!forceRefreshToken) return token;
292
465
  if (proxy) {
466
+ const resolvedProxyUrl = await resolveProxyUrl();
467
+ if (typeof window === "undefined" && !await isAbsoluteUrl(resolvedProxyUrl)) {
468
+ finalizeLoadingState();
469
+ return token;
470
+ }
293
471
  const tokenBeforeRefresh = token;
294
472
  return await browserMutex("__convexAuthProxyRefresh", async () => {
295
473
  if (token !== tokenBeforeRefresh) return token;
296
- try {
297
- const result = await proxyFetch({
474
+ const proxyRefreshRetryPolicy = Fx.retry.while(Fx.retry.compose(Fx.retry.jittered(Fx.retry.exponential(RETRY_BASE_MS)), Fx.retry.recurs(RETRY_MAX_RETRIES)), (meta) => isRetriableProxyRefreshError(meta.input));
475
+ await Fx.run(Fx.from({
476
+ ok: () => proxyFetch({
298
477
  action: "auth:signIn",
299
478
  args: { refreshToken: true }
300
- });
301
- if (result.tokens) await setToken({
302
- shouldStore: false,
303
- tokens: { token: result.tokens.token }
304
- });
305
- else await setToken({
306
- shouldStore: false,
307
- tokens: null
308
- });
309
- } catch {
310
- await setToken({
311
- shouldStore: false,
312
- tokens: null
313
- });
314
- }
479
+ }),
480
+ err: (e) => e
481
+ }).pipe(Fx.retry(proxyRefreshRetryPolicy), Fx.chain((result) => Fx.from({
482
+ ok: async () => {
483
+ if (result.tokens) await setToken({
484
+ shouldStore: false,
485
+ tokens: { token: result.tokens.token },
486
+ resyncConvexAuth: false
487
+ });
488
+ else await setToken({
489
+ shouldStore: false,
490
+ tokens: null,
491
+ resyncConvexAuth: false
492
+ });
493
+ },
494
+ err: (e) => e
495
+ })), Fx.inspect((error) => Fx.sync(() => console.error("[convex-auth] Proxy refresh failed:", error))), Fx.recover(() => {
496
+ if (token === null) finalizeLoadingState();
497
+ return Fx.succeed(void 0);
498
+ })));
315
499
  return token;
316
500
  });
317
501
  }
@@ -320,8 +504,11 @@ function client(options) {
320
504
  const tokenAfterLockAcquisition = token;
321
505
  if (tokenAfterLockAcquisition !== tokenBeforeLockAcquisition) return tokenAfterLockAcquisition;
322
506
  const refreshToken = await storageGet(REFRESH_TOKEN_STORAGE_KEY) ?? null;
323
- if (!refreshToken) return null;
324
- await verifyCodeAndSetToken({ refreshToken });
507
+ if (!refreshToken) {
508
+ finalizeLoadingState();
509
+ return null;
510
+ }
511
+ await verifyCodeAndSetToken({ refreshToken }, { resyncConvexAuth: false });
325
512
  return token;
326
513
  });
327
514
  };
@@ -331,14 +518,20 @@ function client(options) {
331
518
  const code = new URLSearchParams(window.location.search).get("code");
332
519
  if (!code) return;
333
520
  handlingCodeFlow = true;
334
- const codeUrl = new URL(window.location.href);
335
- codeUrl.searchParams.delete("code");
336
- try {
337
- await replaceURL(codeUrl.pathname + codeUrl.search + codeUrl.hash);
338
- await signIn(void 0, { code });
339
- } finally {
521
+ await Fx.run(Fx.from({
522
+ ok: async () => {
523
+ await signIn(void 0, { code });
524
+ const codeUrl = new URL(window.location.href);
525
+ codeUrl.searchParams.delete("code");
526
+ await replaceUrl(codeUrl.pathname + codeUrl.search + codeUrl.hash);
527
+ },
528
+ err: (e) => e
529
+ }).pipe(Fx.recover(() => Fx.succeed(void 0)), Fx.tap(() => Fx.sync(() => {
340
530
  handlingCodeFlow = false;
341
- }
531
+ })), Fx.inspect(() => Fx.sync(() => {
532
+ handlingCodeFlow = false;
533
+ }))));
534
+ handlingCodeFlow = false;
342
535
  };
343
536
  const hydrateFromStorage = async () => {
344
537
  const storedToken = await storageGet(JWT_STORAGE_KEY) ?? null;
@@ -367,413 +560,93 @@ function client(options) {
367
560
  };
368
561
  };
369
562
  if (!proxy && typeof window !== "undefined") {
563
+ const registryKey = key(JWT_STORAGE_KEY);
564
+ const registry = getStorageListenerRegistry();
565
+ const existingListener = registry[registryKey];
566
+ if (existingListener !== void 0) window.removeEventListener("storage", existingListener);
370
567
  const onStorage = (event) => {
371
- (async () => {
568
+ Fx.detach(async () => {
372
569
  if (event.key !== key(JWT_STORAGE_KEY)) return;
373
570
  await setToken({
374
571
  shouldStore: false,
375
572
  tokens: event.newValue === null ? null : { token: event.newValue }
376
573
  });
377
- })();
574
+ }, "[convex-auth] Storage event handler failed:");
378
575
  };
379
576
  window.addEventListener("storage", onStorage);
577
+ registry[registryKey] = onStorage;
578
+ disposeStorageListener = () => {
579
+ if (registry[registryKey] === onStorage) delete registry[registryKey];
580
+ window.removeEventListener("storage", onStorage);
581
+ };
380
582
  }
381
- convex.setAuth(fetchAccessToken);
382
- if (typeof window !== "undefined") if (proxy) if (!hasServerToken) fetchAccessToken({ forceRefreshToken: true });
383
- else {
384
- isLoading = false;
385
- updateSnapshot();
386
- }
387
- else hydrateFromStorage().then(() => handleCodeFlow().catch((error) => {
388
- console.error("[convex-auth] Code exchange failed:", error);
389
- }));
390
- /**
391
- * Base64url encode/decode helpers for the WebAuthn credential API.
392
- * These run client-side only (browser context).
393
- */
394
- const base64urlEncode = (buffer) => {
395
- const bytes = new Uint8Array(buffer);
396
- let binary = "";
397
- for (let i = 0; i < bytes.byteLength; i++) binary += String.fromCharCode(bytes[i]);
398
- return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
399
- };
400
- const base64urlDecode = (str) => {
401
- const padded = str.replace(/-/g, "+").replace(/_/g, "/");
402
- const binary = atob(padded);
403
- const bytes = new Uint8Array(binary.length);
404
- for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
405
- return bytes;
406
- };
583
+ bindConvexAuth();
584
+ if (typeof window !== "undefined") if (proxy) {
585
+ if (!hasServerToken) Fx.detach(() => fetchAccessToken({ forceRefreshToken: true }), "[convex-auth] Proxy token refresh failed:");
586
+ } else Fx.detach(async () => {
587
+ await Fx.run(Fx.from({
588
+ ok: async () => {
589
+ await hydrateFromStorage();
590
+ await handleCodeFlow();
591
+ },
592
+ err: (e) => e
593
+ }).pipe(Fx.inspect((error) => Fx.sync(() => console.error("[convex-auth] Client initialization failed:", error))), Fx.recover((_error) => Fx.from({
594
+ ok: () => setToken({
595
+ shouldStore: false,
596
+ tokens: null
597
+ }),
598
+ err: (e) => e
599
+ }).pipe(Fx.recover(() => Fx.succeed(void 0))))));
600
+ }, "[convex-auth] SPA initialization failed:");
407
601
  return {
408
602
  get state() {
409
603
  return snapshot;
410
604
  },
605
+ param,
606
+ get invite() {
607
+ const pendingInvite = getPendingInvite();
608
+ if (!pendingInvite) return null;
609
+ return {
610
+ token: pendingInvite.token,
611
+ email: pendingInvite.email,
612
+ accept: acceptInvite
613
+ };
614
+ },
411
615
  signIn,
412
616
  signOut,
413
617
  onChange,
414
- passkey: {
415
- isSupported: () => {
416
- return typeof window !== "undefined" && typeof window.PublicKeyCredential !== "undefined";
417
- },
418
- isAutofillSupported: async () => {
419
- if (typeof window === "undefined") return false;
420
- if (typeof window.PublicKeyCredential === "undefined") return false;
421
- if (typeof window.PublicKeyCredential.isConditionalMediationAvailable !== "function") return false;
422
- return window.PublicKeyCredential.isConditionalMediationAvailable();
423
- },
424
- register: async (opts) => {
425
- const phase1Params = {
426
- flow: "register-options",
427
- email: opts?.email,
428
- userName: opts?.userName,
429
- userDisplayName: opts?.userDisplayName
430
- };
431
- let phase1Result;
432
- if (proxy) phase1Result = await proxyFetch({
433
- action: "auth:signIn",
434
- args: {
435
- provider: "passkey",
436
- params: phase1Params
437
- }
438
- });
439
- else phase1Result = await convex.action("auth:signIn", {
440
- provider: "passkey",
441
- params: phase1Params
442
- });
443
- if (!phase1Result.options) throw new Error("Server did not return passkey registration options");
444
- const options$1 = phase1Result.options;
445
- const createOptions = { publicKey: {
446
- rp: options$1.rp,
447
- user: {
448
- id: base64urlDecode(options$1.user.id).buffer,
449
- name: options$1.user.name,
450
- displayName: options$1.user.displayName
451
- },
452
- challenge: base64urlDecode(options$1.challenge).buffer,
453
- pubKeyCredParams: options$1.pubKeyCredParams,
454
- timeout: options$1.timeout,
455
- attestation: options$1.attestation,
456
- authenticatorSelection: options$1.authenticatorSelection,
457
- excludeCredentials: (options$1.excludeCredentials ?? []).map((cred) => ({
458
- type: cred.type ?? "public-key",
459
- id: base64urlDecode(cred.id).buffer,
460
- transports: cred.transports
461
- }))
462
- } };
463
- const credential = await navigator.credentials.create(createOptions);
464
- if (!credential) throw new Error("Passkey registration was cancelled");
465
- const response = credential.response;
466
- const transports = typeof response.getTransports === "function" ? response.getTransports() : void 0;
467
- const phase2Params = {
468
- flow: "register-verify",
469
- clientDataJSON: base64urlEncode(response.clientDataJSON),
470
- attestationObject: base64urlEncode(response.attestationObject),
471
- transports,
472
- passkeyName: opts?.name,
473
- email: opts?.email
474
- };
475
- let phase2Result;
476
- if (proxy) phase2Result = await proxyFetch({
477
- action: "auth:signIn",
478
- args: {
479
- provider: "passkey",
480
- params: phase2Params,
481
- verifier: phase1Result.verifier
482
- }
483
- });
484
- else phase2Result = await convex.action("auth:signIn", {
485
- provider: "passkey",
486
- params: phase2Params,
487
- verifier: phase1Result.verifier
488
- });
489
- if (phase2Result.tokens) {
490
- if (proxy) await setToken({
491
- shouldStore: false,
492
- tokens: phase2Result.tokens === null ? null : { token: phase2Result.tokens.token }
493
- });
494
- else await setToken({
495
- shouldStore: true,
496
- tokens: phase2Result.tokens
497
- });
498
- return { signingIn: true };
499
- }
500
- return { signingIn: false };
501
- },
502
- authenticate: async (opts) => {
503
- const phase1Params = {
504
- flow: "auth-options",
505
- email: opts?.email
506
- };
507
- let phase1Result;
508
- if (proxy) phase1Result = await proxyFetch({
509
- action: "auth:signIn",
510
- args: {
511
- provider: "passkey",
512
- params: phase1Params
513
- }
514
- });
515
- else phase1Result = await convex.action("auth:signIn", {
516
- provider: "passkey",
517
- params: phase1Params
518
- });
519
- if (!phase1Result.options) throw new Error("Server did not return passkey authentication options");
520
- const options$1 = phase1Result.options;
521
- const getOptions = {
522
- publicKey: {
523
- challenge: base64urlDecode(options$1.challenge).buffer,
524
- timeout: options$1.timeout,
525
- rpId: options$1.rpId,
526
- userVerification: options$1.userVerification,
527
- allowCredentials: (options$1.allowCredentials ?? []).map((cred) => ({
528
- type: cred.type ?? "public-key",
529
- id: base64urlDecode(cred.id).buffer,
530
- transports: cred.transports
531
- }))
532
- },
533
- ...opts?.autofill ? { mediation: "conditional" } : {}
534
- };
535
- const credential = await navigator.credentials.get(getOptions);
536
- if (!credential) throw new Error("Passkey authentication was cancelled");
537
- const response = credential.response;
538
- const phase2Params = {
539
- flow: "auth-verify",
540
- credentialId: base64urlEncode(credential.rawId),
541
- clientDataJSON: base64urlEncode(response.clientDataJSON),
542
- authenticatorData: base64urlEncode(response.authenticatorData),
543
- signature: base64urlEncode(response.signature)
544
- };
545
- let phase2Result;
546
- if (proxy) phase2Result = await proxyFetch({
547
- action: "auth:signIn",
548
- args: {
549
- provider: "passkey",
550
- params: phase2Params,
551
- verifier: phase1Result.verifier
552
- }
553
- });
554
- else phase2Result = await convex.action("auth:signIn", {
555
- provider: "passkey",
556
- params: phase2Params,
557
- verifier: phase1Result.verifier
558
- });
559
- if (phase2Result.tokens) {
560
- if (proxy) await setToken({
561
- shouldStore: false,
562
- tokens: phase2Result.tokens === null ? null : { token: phase2Result.tokens.token }
563
- });
564
- else await setToken({
565
- shouldStore: true,
566
- tokens: phase2Result.tokens
567
- });
568
- return { signingIn: true };
569
- }
570
- return { signingIn: false };
571
- }
572
- },
573
- totp: {
574
- setup: async (opts) => {
575
- const params = { flow: "setup" };
576
- if (opts?.name) params.name = opts.name;
577
- if (opts?.accountName) params.accountName = opts.accountName;
578
- if (proxy) {
579
- const result$1 = await proxyFetch({
580
- action: "auth:signIn",
581
- args: {
582
- provider: "totp",
583
- params
584
- }
585
- });
586
- return {
587
- uri: result$1.totpSetup.uri,
588
- secret: result$1.totpSetup.secret,
589
- verifier: result$1.verifier,
590
- totpId: result$1.totpSetup.totpId
591
- };
592
- }
593
- const result = await convex.action("auth:signIn", {
594
- provider: "totp",
595
- params
596
- });
597
- return {
598
- uri: result.totpSetup.uri,
599
- secret: result.totpSetup.secret,
600
- verifier: result.verifier,
601
- totpId: result.totpSetup.totpId
602
- };
603
- },
604
- confirm: async (opts) => {
605
- const params = {
606
- flow: "confirm",
607
- code: opts.code,
608
- totpId: opts.totpId
609
- };
610
- if (proxy) {
611
- const result$1 = await proxyFetch({
612
- action: "auth:signIn",
613
- args: {
614
- provider: "totp",
615
- params,
616
- verifier: opts.verifier
617
- }
618
- });
619
- if (result$1.tokens) await setToken({
620
- shouldStore: false,
621
- tokens: result$1.tokens === null ? null : { token: result$1.tokens.token }
622
- });
623
- return;
624
- }
625
- const result = await convex.action("auth:signIn", {
626
- provider: "totp",
627
- params,
628
- verifier: opts.verifier
629
- });
630
- if (result.tokens) await setToken({
631
- shouldStore: true,
632
- tokens: result.tokens ?? null
633
- });
634
- },
635
- verify: async (opts) => {
636
- const params = {
637
- flow: "verify",
638
- code: opts.code
639
- };
640
- if (proxy) {
641
- const result$1 = await proxyFetch({
642
- action: "auth:signIn",
643
- args: {
644
- provider: "totp",
645
- params,
646
- verifier: opts.verifier
647
- }
648
- });
649
- if (result$1.tokens) await setToken({
650
- shouldStore: false,
651
- tokens: result$1.tokens === null ? null : { token: result$1.tokens.token }
652
- });
653
- return;
654
- }
655
- const result = await convex.action("auth:signIn", {
656
- provider: "totp",
657
- params,
658
- verifier: opts.verifier
659
- });
660
- if (result.tokens) await setToken({
661
- shouldStore: true,
662
- tokens: result.tokens ?? null
663
- });
664
- }
665
- },
666
- device: {
667
- poll: async (code) => {
668
- const intervalMs = code.interval * 1e3;
669
- const expiresAt = Date.now() + code.expiresIn * 1e3;
670
- while (Date.now() < expiresAt) {
671
- await new Promise((resolve) => setTimeout(resolve, intervalMs));
672
- try {
673
- let result;
674
- const params = {
675
- flow: "poll",
676
- deviceCode: code.deviceCode
677
- };
678
- if (proxy) result = await proxyFetch({
679
- action: "auth:signIn",
680
- args: {
681
- provider: "device",
682
- params
683
- }
684
- });
685
- else result = await convex.action("auth:signIn", {
686
- provider: "device",
687
- params
688
- });
689
- if (result.tokens) {
690
- if (proxy) await setToken({
691
- shouldStore: false,
692
- tokens: result.tokens === null ? null : { token: result.tokens.token }
693
- });
694
- else await setToken({
695
- shouldStore: true,
696
- tokens: result.tokens ?? null
697
- });
698
- return;
699
- }
700
- } catch (e) {
701
- if (e instanceof ConvexError) {
702
- const code_ = e.data?.code;
703
- if (code_ === "DEVICE_AUTHORIZATION_PENDING") continue;
704
- if (code_ === "DEVICE_SLOW_DOWN") {
705
- await new Promise((resolve) => setTimeout(resolve, intervalMs));
706
- continue;
707
- }
708
- }
709
- throw e;
710
- }
711
- }
712
- throw new Error("Device authorization timed out.");
713
- },
714
- verify: async (userCode) => {
715
- const params = {
716
- flow: "verify",
717
- userCode
718
- };
719
- if (proxy) await proxyFetch({
720
- action: "auth:signIn",
721
- args: {
722
- provider: "device",
723
- params
724
- }
725
- });
726
- else await convex.action("auth:signIn", {
727
- provider: "device",
728
- params
729
- });
730
- }
618
+ passkey: createPasskeyClient({
619
+ proxy,
620
+ convex,
621
+ requireApiRefs,
622
+ proxyFetch,
623
+ setTokenAndMaybeWait
624
+ }),
625
+ totp: createTotpClient({
626
+ proxy,
627
+ convex,
628
+ requireApiRefs,
629
+ proxyFetch,
630
+ setTokenAndMaybeWait
631
+ }),
632
+ device: createDeviceClient({
633
+ proxy,
634
+ convex,
635
+ requireApiRefs,
636
+ proxyFetch,
637
+ setTokenAndMaybeWait
638
+ }),
639
+ destroy: () => {
640
+ destroyed = true;
641
+ settleHandshakeWaiters(authEpoch, {
642
+ type: "reject",
643
+ error: createHandshakeError("AUTH_HANDSHAKE_REJECTED", { reason: "destroyed" })
644
+ });
645
+ disposeStorageListener?.();
646
+ subscribers.clear();
731
647
  }
732
648
  };
733
649
  }
734
- async function browserMutex(key, callback) {
735
- const lockManager = globalThis?.navigator?.locks;
736
- return lockManager !== void 0 ? await lockManager.request(key, callback) : await manualMutex(key, callback);
737
- }
738
- function getMutexValue(key) {
739
- if (globalThis.__convexAuthMutexes === void 0) globalThis.__convexAuthMutexes = {};
740
- let mutex = globalThis.__convexAuthMutexes[key];
741
- if (mutex === void 0) globalThis.__convexAuthMutexes[key] = {
742
- currentlyRunning: null,
743
- waiting: []
744
- };
745
- mutex = globalThis.__convexAuthMutexes[key];
746
- return mutex;
747
- }
748
- function setMutexValue(key, value) {
749
- globalThis.__convexAuthMutexes[key] = value;
750
- }
751
- async function enqueueCallbackForMutex(key, callback) {
752
- const mutex = getMutexValue(key);
753
- if (mutex.currentlyRunning === null) setMutexValue(key, {
754
- currentlyRunning: callback().finally(() => {
755
- const nextCb = getMutexValue(key).waiting.shift();
756
- getMutexValue(key).currentlyRunning = null;
757
- setMutexValue(key, {
758
- ...getMutexValue(key),
759
- currentlyRunning: nextCb === void 0 ? null : enqueueCallbackForMutex(key, nextCb)
760
- });
761
- }),
762
- waiting: []
763
- });
764
- else setMutexValue(key, {
765
- ...mutex,
766
- waiting: [...mutex.waiting, callback]
767
- });
768
- }
769
- async function manualMutex(key, callback) {
770
- return new Promise((resolve, reject) => {
771
- const wrappedCallback = () => {
772
- return callback().then((v) => resolve(v)).catch((e) => reject(e));
773
- };
774
- enqueueCallbackForMutex(key, wrappedCallback);
775
- });
776
- }
777
650
 
778
651
  //#endregion
779
652
  export { AUTH_ERRORS, client, isAuthError, parseAuthError };