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

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 (310) hide show
  1. package/dist/authorization/index.d.ts +1 -1
  2. package/dist/authorization/index.js +1 -1
  3. package/dist/authorization/index.js.map +1 -1
  4. package/dist/client/index.d.ts +1 -2
  5. package/dist/client/index.d.ts.map +1 -1
  6. package/dist/client/index.js +36 -39
  7. package/dist/client/index.js.map +1 -1
  8. package/dist/component/client/index.d.ts +1 -2
  9. package/dist/component/convex.config.d.ts +2 -2
  10. package/dist/component/convex.config.d.ts.map +1 -1
  11. package/dist/component/model.d.ts +5 -5
  12. package/dist/component/model.d.ts.map +1 -1
  13. package/dist/component/public/enterprise/audit.d.ts.map +1 -1
  14. package/dist/component/public/enterprise/audit.js.map +1 -1
  15. package/dist/component/public/enterprise/core.d.ts.map +1 -1
  16. package/dist/component/public/enterprise/core.js.map +1 -1
  17. package/dist/component/public/enterprise/domains.d.ts.map +1 -1
  18. package/dist/component/public/enterprise/domains.js.map +1 -1
  19. package/dist/component/public/enterprise/scim.d.ts.map +1 -1
  20. package/dist/component/public/enterprise/scim.js.map +1 -1
  21. package/dist/component/public/enterprise/secrets.d.ts.map +1 -1
  22. package/dist/component/public/enterprise/secrets.js.map +1 -1
  23. package/dist/component/public/enterprise/webhooks.d.ts.map +1 -1
  24. package/dist/component/public/enterprise/webhooks.js.map +1 -1
  25. package/dist/component/public/factors/devices.d.ts.map +1 -1
  26. package/dist/component/public/factors/devices.js.map +1 -1
  27. package/dist/component/public/factors/passkeys.d.ts.map +1 -1
  28. package/dist/component/public/factors/passkeys.js.map +1 -1
  29. package/dist/component/public/factors/totp.d.ts.map +1 -1
  30. package/dist/component/public/factors/totp.js.map +1 -1
  31. package/dist/component/public/groups/core.js.map +1 -1
  32. package/dist/component/public/groups/invites.d.ts.map +1 -1
  33. package/dist/component/public/groups/invites.js.map +1 -1
  34. package/dist/component/public/groups/members.d.ts.map +1 -1
  35. package/dist/component/public/groups/members.js.map +1 -1
  36. package/dist/component/public/identity/accounts.d.ts.map +1 -1
  37. package/dist/component/public/identity/accounts.js.map +1 -1
  38. package/dist/component/public/identity/codes.d.ts.map +1 -1
  39. package/dist/component/public/identity/codes.js.map +1 -1
  40. package/dist/component/public/identity/sessions.d.ts.map +1 -1
  41. package/dist/component/public/identity/sessions.js.map +1 -1
  42. package/dist/component/public/identity/tokens.d.ts.map +1 -1
  43. package/dist/component/public/identity/tokens.js.map +1 -1
  44. package/dist/component/public/identity/users.d.ts.map +1 -1
  45. package/dist/component/public/identity/users.js.map +1 -1
  46. package/dist/component/public/identity/verifiers.d.ts.map +1 -1
  47. package/dist/component/public/identity/verifiers.js.map +1 -1
  48. package/dist/component/public/security/keys.d.ts.map +1 -1
  49. package/dist/component/public/security/keys.js.map +1 -1
  50. package/dist/component/public/security/limits.d.ts.map +1 -1
  51. package/dist/component/public/security/limits.js.map +1 -1
  52. package/dist/component/schema.d.ts +39 -39
  53. package/dist/component/server/auth.d.ts +95 -52
  54. package/dist/component/server/auth.d.ts.map +1 -1
  55. package/dist/component/server/auth.js +63 -43
  56. package/dist/component/server/auth.js.map +1 -1
  57. package/dist/component/server/core.js +116 -235
  58. package/dist/component/server/core.js.map +1 -1
  59. package/dist/component/server/crypto.js +25 -7
  60. package/dist/component/server/crypto.js.map +1 -1
  61. package/dist/component/server/device.js +58 -15
  62. package/dist/component/server/device.js.map +1 -1
  63. package/dist/component/server/enterprise/domain.js +148 -59
  64. package/dist/component/server/enterprise/domain.js.map +1 -1
  65. package/dist/component/server/enterprise/http.js +36 -15
  66. package/dist/component/server/enterprise/http.js.map +1 -1
  67. package/dist/component/server/enterprise/oidc.js +1 -1
  68. package/dist/component/server/http.js +26 -21
  69. package/dist/component/server/http.js.map +1 -1
  70. package/dist/component/server/identity.js +5 -2
  71. package/dist/component/server/identity.js.map +1 -1
  72. package/dist/component/server/limits.js +21 -30
  73. package/dist/component/server/limits.js.map +1 -1
  74. package/dist/component/server/mutations/account.js +12 -10
  75. package/dist/component/server/mutations/account.js.map +1 -1
  76. package/dist/component/server/mutations/code.js +5 -2
  77. package/dist/component/server/mutations/code.js.map +1 -1
  78. package/dist/component/server/mutations/invalidate.js +1 -1
  79. package/dist/component/server/mutations/invalidate.js.map +1 -1
  80. package/dist/component/server/mutations/oauth.js +10 -4
  81. package/dist/component/server/mutations/oauth.js.map +1 -1
  82. package/dist/component/server/mutations/refresh.js +2 -2
  83. package/dist/component/server/mutations/refresh.js.map +1 -1
  84. package/dist/component/server/mutations/register.js +46 -42
  85. package/dist/component/server/mutations/register.js.map +1 -1
  86. package/dist/component/server/mutations/retrieve.js +21 -25
  87. package/dist/component/server/mutations/retrieve.js.map +1 -1
  88. package/dist/component/server/mutations/signature.js +10 -4
  89. package/dist/component/server/mutations/signature.js.map +1 -1
  90. package/dist/component/server/mutations/signout.js.map +1 -1
  91. package/dist/component/server/mutations/store.js +9 -24
  92. package/dist/component/server/mutations/store.js.map +1 -1
  93. package/dist/component/server/mutations/verifier.js.map +1 -1
  94. package/dist/component/server/mutations/verify.js +1 -1
  95. package/dist/component/server/mutations/verify.js.map +1 -1
  96. package/dist/component/server/oauth.js +53 -16
  97. package/dist/component/server/oauth.js.map +1 -1
  98. package/dist/component/server/passkey.js +115 -31
  99. package/dist/component/server/passkey.js.map +1 -1
  100. package/dist/component/server/redirects.js +9 -3
  101. package/dist/component/server/redirects.js.map +1 -1
  102. package/dist/component/server/refresh.js +10 -7
  103. package/dist/component/server/refresh.js.map +1 -1
  104. package/dist/component/server/runtime.d.ts +3 -3
  105. package/dist/component/server/runtime.d.ts.map +1 -1
  106. package/dist/component/server/runtime.js +62 -20
  107. package/dist/component/server/runtime.js.map +1 -1
  108. package/dist/component/server/signin.js +34 -10
  109. package/dist/component/server/signin.js.map +1 -1
  110. package/dist/component/server/totp.js +79 -19
  111. package/dist/component/server/totp.js.map +1 -1
  112. package/dist/component/server/types.d.ts +12 -20
  113. package/dist/component/server/types.d.ts.map +1 -1
  114. package/dist/component/server/types.js.map +1 -1
  115. package/dist/component/server/users.js +6 -3
  116. package/dist/component/server/users.js.map +1 -1
  117. package/dist/component/server/utils.js +10 -4
  118. package/dist/component/server/utils.js.map +1 -1
  119. package/dist/core/types.d.ts +14 -22
  120. package/dist/core/types.d.ts.map +1 -1
  121. package/dist/factors/device.js +8 -9
  122. package/dist/factors/device.js.map +1 -1
  123. package/dist/factors/passkey.js +18 -21
  124. package/dist/factors/passkey.js.map +1 -1
  125. package/dist/providers/password.js +66 -81
  126. package/dist/providers/password.js.map +1 -1
  127. package/dist/runtime/invite.js +2 -8
  128. package/dist/runtime/invite.js.map +1 -1
  129. package/dist/server/auth.d.ts +95 -52
  130. package/dist/server/auth.d.ts.map +1 -1
  131. package/dist/server/auth.js +63 -43
  132. package/dist/server/auth.js.map +1 -1
  133. package/dist/server/core.d.ts +71 -159
  134. package/dist/server/core.d.ts.map +1 -1
  135. package/dist/server/core.js +116 -235
  136. package/dist/server/core.js.map +1 -1
  137. package/dist/server/crypto.d.ts.map +1 -1
  138. package/dist/server/crypto.js +25 -7
  139. package/dist/server/crypto.js.map +1 -1
  140. package/dist/server/device.js +58 -15
  141. package/dist/server/device.js.map +1 -1
  142. package/dist/server/enterprise/domain.d.ts +0 -8
  143. package/dist/server/enterprise/domain.d.ts.map +1 -1
  144. package/dist/server/enterprise/domain.js +148 -59
  145. package/dist/server/enterprise/domain.js.map +1 -1
  146. package/dist/server/enterprise/http.d.ts.map +1 -1
  147. package/dist/server/enterprise/http.js +35 -14
  148. package/dist/server/enterprise/http.js.map +1 -1
  149. package/dist/server/http.d.ts +2 -2
  150. package/dist/server/http.d.ts.map +1 -1
  151. package/dist/server/http.js +25 -20
  152. package/dist/server/http.js.map +1 -1
  153. package/dist/server/identity.js +5 -2
  154. package/dist/server/identity.js.map +1 -1
  155. package/dist/server/index.d.ts +2 -2
  156. package/dist/server/limits.js +21 -30
  157. package/dist/server/limits.js.map +1 -1
  158. package/dist/server/mounts.d.ts +26 -64
  159. package/dist/server/mounts.d.ts.map +1 -1
  160. package/dist/server/mounts.js +45 -106
  161. package/dist/server/mounts.js.map +1 -1
  162. package/dist/server/mutations/account.d.ts +8 -9
  163. package/dist/server/mutations/account.d.ts.map +1 -1
  164. package/dist/server/mutations/account.js +11 -9
  165. package/dist/server/mutations/account.js.map +1 -1
  166. package/dist/server/mutations/code.d.ts +13 -13
  167. package/dist/server/mutations/code.d.ts.map +1 -1
  168. package/dist/server/mutations/code.js +5 -2
  169. package/dist/server/mutations/code.js.map +1 -1
  170. package/dist/server/mutations/invalidate.d.ts +4 -4
  171. package/dist/server/mutations/invalidate.d.ts.map +1 -1
  172. package/dist/server/mutations/invalidate.js.map +1 -1
  173. package/dist/server/mutations/oauth.d.ts +12 -10
  174. package/dist/server/mutations/oauth.d.ts.map +1 -1
  175. package/dist/server/mutations/oauth.js +9 -3
  176. package/dist/server/mutations/oauth.js.map +1 -1
  177. package/dist/server/mutations/refresh.d.ts +3 -3
  178. package/dist/server/mutations/refresh.d.ts.map +1 -1
  179. package/dist/server/mutations/refresh.js +1 -1
  180. package/dist/server/mutations/refresh.js.map +1 -1
  181. package/dist/server/mutations/register.d.ts +11 -11
  182. package/dist/server/mutations/register.d.ts.map +1 -1
  183. package/dist/server/mutations/register.js +45 -41
  184. package/dist/server/mutations/register.js.map +1 -1
  185. package/dist/server/mutations/retrieve.d.ts +6 -6
  186. package/dist/server/mutations/retrieve.d.ts.map +1 -1
  187. package/dist/server/mutations/retrieve.js +20 -24
  188. package/dist/server/mutations/retrieve.js.map +1 -1
  189. package/dist/server/mutations/signature.d.ts +6 -7
  190. package/dist/server/mutations/signature.d.ts.map +1 -1
  191. package/dist/server/mutations/signature.js +9 -3
  192. package/dist/server/mutations/signature.js.map +1 -1
  193. package/dist/server/mutations/signin.d.ts +5 -5
  194. package/dist/server/mutations/signin.d.ts.map +1 -1
  195. package/dist/server/mutations/signout.js.map +1 -1
  196. package/dist/server/mutations/store.d.ts +97 -97
  197. package/dist/server/mutations/store.d.ts.map +1 -1
  198. package/dist/server/mutations/store.js +8 -23
  199. package/dist/server/mutations/store.js.map +1 -1
  200. package/dist/server/mutations/verifier.js.map +1 -1
  201. package/dist/server/mutations/verify.d.ts +10 -10
  202. package/dist/server/mutations/verify.d.ts.map +1 -1
  203. package/dist/server/mutations/verify.js.map +1 -1
  204. package/dist/server/oauth.js +53 -16
  205. package/dist/server/oauth.js.map +1 -1
  206. package/dist/server/passkey.d.ts +2 -2
  207. package/dist/server/passkey.d.ts.map +1 -1
  208. package/dist/server/passkey.js +114 -30
  209. package/dist/server/passkey.js.map +1 -1
  210. package/dist/server/redirects.js +9 -3
  211. package/dist/server/redirects.js.map +1 -1
  212. package/dist/server/refresh.js +10 -7
  213. package/dist/server/refresh.js.map +1 -1
  214. package/dist/server/runtime.d.ts +14 -14
  215. package/dist/server/runtime.d.ts.map +1 -1
  216. package/dist/server/runtime.js +61 -19
  217. package/dist/server/runtime.js.map +1 -1
  218. package/dist/server/signin.js +34 -10
  219. package/dist/server/signin.js.map +1 -1
  220. package/dist/server/ssr.d.ts.map +1 -1
  221. package/dist/server/ssr.js +175 -184
  222. package/dist/server/ssr.js.map +1 -1
  223. package/dist/server/totp.js +78 -18
  224. package/dist/server/totp.js.map +1 -1
  225. package/dist/server/types.d.ts +13 -21
  226. package/dist/server/types.d.ts.map +1 -1
  227. package/dist/server/types.js.map +1 -1
  228. package/dist/server/users.js +6 -3
  229. package/dist/server/users.js.map +1 -1
  230. package/dist/server/utils.js +10 -4
  231. package/dist/server/utils.js.map +1 -1
  232. package/package.json +2 -6
  233. package/src/authorization/index.ts +1 -1
  234. package/src/cli/index.ts +1 -1
  235. package/src/client/core/types.ts +14 -14
  236. package/src/client/factors/device.ts +10 -12
  237. package/src/client/factors/passkey.ts +23 -26
  238. package/src/client/index.ts +54 -64
  239. package/src/client/runtime/invite.ts +5 -7
  240. package/src/component/index.ts +1 -0
  241. package/src/component/public/enterprise/audit.ts +6 -1
  242. package/src/component/public/enterprise/core.ts +1 -0
  243. package/src/component/public/enterprise/domains.ts +5 -1
  244. package/src/component/public/enterprise/scim.ts +1 -0
  245. package/src/component/public/enterprise/secrets.ts +1 -0
  246. package/src/component/public/enterprise/webhooks.ts +1 -0
  247. package/src/component/public/factors/devices.ts +1 -0
  248. package/src/component/public/factors/passkeys.ts +1 -0
  249. package/src/component/public/factors/totp.ts +1 -0
  250. package/src/component/public/groups/core.ts +1 -1
  251. package/src/component/public/groups/invites.ts +7 -1
  252. package/src/component/public/groups/members.ts +1 -0
  253. package/src/component/public/identity/accounts.ts +1 -0
  254. package/src/component/public/identity/codes.ts +1 -0
  255. package/src/component/public/identity/sessions.ts +1 -0
  256. package/src/component/public/identity/tokens.ts +1 -0
  257. package/src/component/public/identity/users.ts +1 -0
  258. package/src/component/public/identity/verifiers.ts +1 -0
  259. package/src/component/public/security/keys.ts +1 -0
  260. package/src/component/public/security/limits.ts +1 -0
  261. package/src/providers/password.ts +89 -110
  262. package/src/server/auth.ts +177 -111
  263. package/src/server/core.ts +197 -233
  264. package/src/server/crypto.ts +31 -29
  265. package/src/server/device.ts +65 -32
  266. package/src/server/enterprise/domain.ts +158 -170
  267. package/src/server/enterprise/http.ts +46 -39
  268. package/src/server/http.ts +36 -30
  269. package/src/server/identity.ts +5 -5
  270. package/src/server/index.ts +2 -0
  271. package/src/server/limits.ts +53 -80
  272. package/src/server/mounts.ts +47 -74
  273. package/src/server/mutations/account.ts +22 -36
  274. package/src/server/mutations/code.ts +6 -6
  275. package/src/server/mutations/invalidate.ts +1 -1
  276. package/src/server/mutations/oauth.ts +14 -8
  277. package/src/server/mutations/refresh.ts +5 -4
  278. package/src/server/mutations/register.ts +87 -132
  279. package/src/server/mutations/retrieve.ts +44 -44
  280. package/src/server/mutations/signature.ts +13 -6
  281. package/src/server/mutations/signout.ts +1 -1
  282. package/src/server/mutations/store.ts +16 -31
  283. package/src/server/mutations/verifier.ts +1 -1
  284. package/src/server/mutations/verify.ts +3 -5
  285. package/src/server/oauth.ts +60 -69
  286. package/src/server/passkey.ts +567 -517
  287. package/src/server/redirects.ts +10 -6
  288. package/src/server/refresh.ts +14 -18
  289. package/src/server/runtime.ts +70 -55
  290. package/src/server/signin.ts +44 -37
  291. package/src/server/ssr.ts +390 -407
  292. package/src/server/totp.ts +85 -35
  293. package/src/server/types.ts +19 -22
  294. package/src/server/users.ts +7 -6
  295. package/src/server/utils.ts +10 -12
  296. package/dist/component/server/authError.js +0 -34
  297. package/dist/component/server/authError.js.map +0 -1
  298. package/dist/component/server/errors.d.ts +0 -1
  299. package/dist/component/server/errors.js +0 -137
  300. package/dist/component/server/errors.js.map +0 -1
  301. package/dist/server/authError.d.ts +0 -46
  302. package/dist/server/authError.d.ts.map +0 -1
  303. package/dist/server/authError.js +0 -34
  304. package/dist/server/authError.js.map +0 -1
  305. package/dist/server/errors.d.ts +0 -177
  306. package/dist/server/errors.d.ts.map +0 -1
  307. package/dist/server/errors.js +0 -212
  308. package/dist/server/errors.js.map +0 -1
  309. package/src/server/authError.ts +0 -44
  310. package/src/server/errors.ts +0 -290
@@ -1,6 +1,7 @@
1
1
  import { Fx } from "@robelest/fx";
2
+ import { Cv } from "@robelest/fx/convex";
3
+ import { ConvexError } from "convex/values";
2
4
 
3
- import { AuthError } from "./authError";
4
5
  import { AuthProviderMaterializedConfig } from "./types";
5
6
  import { ConvexAuthMaterializedConfig } from "./types";
6
7
  import { errorMessage } from "./utils";
@@ -12,33 +13,35 @@ import { errorMessage } from "./utils";
12
13
  * required crypto function, returning typed errors through the Fx channel.
13
14
  */
14
15
  /** @internal */
15
- export const hash = (provider: any, secret: string): Fx<string, AuthError> =>
16
+ export const hash = (
17
+ provider: any,
18
+ secret: string,
19
+ ): Fx<string, ConvexError<any>> =>
16
20
  Fx.gen(function* () {
17
21
  if (provider.type !== "credentials") {
18
- return yield* Fx.fail(
19
- new AuthError(
20
- "INVALID_CREDENTIALS_PROVIDER",
21
- `Provider ${provider.id} is not a credentials provider`,
22
- ),
23
- );
22
+ return yield* Cv.fail({
23
+ code: "INVALID_CREDENTIALS_PROVIDER",
24
+ message: `Provider ${provider.id} is not a credentials provider`,
25
+ });
24
26
  }
25
27
 
26
28
  const hashSecretFn = provider.crypto?.hashSecret as
27
29
  | ((s: string) => Promise<string>)
28
30
  | undefined;
29
31
  if (!hashSecretFn) {
30
- return yield* Fx.fail(
31
- new AuthError(
32
- "MISSING_CRYPTO_FUNCTION",
33
- `Provider ${provider.id} does not have a \`crypto.hashSecret\` function`,
34
- ),
35
- );
32
+ return yield* Cv.fail({
33
+ code: "MISSING_CRYPTO_FUNCTION",
34
+ message: `Provider ${provider.id} does not have a \`crypto.hashSecret\` function`,
35
+ });
36
36
  }
37
37
 
38
38
  return yield* Fx.from({
39
39
  ok: () => hashSecretFn(secret),
40
40
  err: (e) =>
41
- new AuthError("INTERNAL_ERROR", `Hash failed: ${errorMessage(e)}`),
41
+ Cv.error({
42
+ code: "INTERNAL_ERROR",
43
+ message: `Hash failed: ${errorMessage(e)}`,
44
+ }),
42
45
  });
43
46
  });
44
47
 
@@ -50,33 +53,32 @@ export const verify = (
50
53
  provider: AuthProviderMaterializedConfig,
51
54
  secret: string,
52
55
  hashValue: string,
53
- ): Fx<boolean, AuthError> =>
56
+ ): Fx<boolean, ConvexError<any>> =>
54
57
  Fx.gen(function* () {
55
58
  if (provider.type !== "credentials") {
56
- return yield* Fx.fail(
57
- new AuthError(
58
- "INVALID_CREDENTIALS_PROVIDER",
59
- `Provider ${provider.id} is not a credentials provider`,
60
- ),
61
- );
59
+ return yield* Cv.fail({
60
+ code: "INVALID_CREDENTIALS_PROVIDER",
61
+ message: `Provider ${provider.id} is not a credentials provider`,
62
+ });
62
63
  }
63
64
 
64
65
  const verifySecretFn = (provider as any).crypto?.verifySecret as
65
66
  | ((s: string, h: string) => Promise<boolean>)
66
67
  | undefined;
67
68
  if (!verifySecretFn) {
68
- return yield* Fx.fail(
69
- new AuthError(
70
- "MISSING_CRYPTO_FUNCTION",
71
- `Provider ${provider.id} does not have a \`crypto.verifySecret\` function`,
72
- ),
73
- );
69
+ return yield* Cv.fail({
70
+ code: "MISSING_CRYPTO_FUNCTION",
71
+ message: `Provider ${provider.id} does not have a \`crypto.verifySecret\` function`,
72
+ });
74
73
  }
75
74
 
76
75
  return yield* Fx.from({
77
76
  ok: () => verifySecretFn(secret, hashValue),
78
77
  err: (e) =>
79
- new AuthError("INTERNAL_ERROR", `Verify failed: ${errorMessage(e)}`),
78
+ Cv.error({
79
+ code: "INTERNAL_ERROR",
80
+ message: `Verify failed: ${errorMessage(e)}`,
81
+ }),
80
82
  });
81
83
  });
82
84
 
@@ -11,8 +11,9 @@
11
11
  */
12
12
 
13
13
  import { Fx } from "@robelest/fx";
14
+ import { Cv } from "@robelest/fx/convex";
15
+ import { ConvexError } from "convex/values";
14
16
 
15
- import { AuthError } from "./authError";
16
17
  import { userIdFromIdentitySubject } from "./identity";
17
18
  import { callSignIn } from "./mutations/index";
18
19
  import { DeviceProviderConfig, GenericActionCtxWithAuthConfig } from "./types";
@@ -69,7 +70,7 @@ export const handleDevice = (
69
70
  ctx: EnrichedActionCtx,
70
71
  provider: DeviceProviderConfig,
71
72
  args: { params?: Record<string, any> },
72
- ): Fx<DeviceResult, AuthError> =>
73
+ ): Fx<DeviceResult, ConvexError<any>> =>
73
74
  Fx.from({
74
75
  ok: async () => {
75
76
  const params = (args.params ?? {}) as Record<string, unknown>;
@@ -79,10 +80,11 @@ export const handleDevice = (
79
80
  | "verify";
80
81
 
81
82
  if (!DEVICE_FLOWS.some((candidate) => candidate === flow)) {
82
- throw new AuthError(
83
- "DEVICE_MISSING_FLOW",
84
- "Missing `flow` parameter. Expected one of: create, poll, verify",
85
- );
83
+ throw Cv.error({
84
+ code: "DEVICE_MISSING_FLOW",
85
+ message:
86
+ "Missing `flow` parameter. Expected one of: create, poll, verify",
87
+ });
86
88
  }
87
89
 
88
90
  if (flow === "create") {
@@ -126,43 +128,61 @@ export const handleDevice = (
126
128
 
127
129
  if (flow === "poll") {
128
130
  if (typeof params.deviceCode !== "string") {
129
- throw new AuthError(
130
- "DEVICE_MISSING_FLOW",
131
- "Missing `deviceCode` parameter for poll flow.",
132
- );
131
+ throw Cv.error({
132
+ code: "DEVICE_MISSING_FLOW",
133
+ message: "Missing `deviceCode` parameter for poll flow.",
134
+ });
133
135
  }
134
136
 
135
137
  const hash = await sha256(params.deviceCode);
136
138
  const doc = await queryDeviceByCodeHash(ctx, hash);
137
139
  if (doc === null) {
138
- throw new AuthError("DEVICE_CODE_EXPIRED");
140
+ throw Cv.error({
141
+ code: "DEVICE_CODE_EXPIRED",
142
+ message:
143
+ "The device code has expired. Please start a new authorization request.",
144
+ });
139
145
  }
140
146
  if (Date.now() > doc.expiresAt) {
141
147
  await mutateDeviceDelete(ctx, doc._id);
142
- throw new AuthError("DEVICE_CODE_EXPIRED");
148
+ throw Cv.error({
149
+ code: "DEVICE_CODE_EXPIRED",
150
+ message:
151
+ "The device code has expired. Please start a new authorization request.",
152
+ });
143
153
  }
144
154
  if (
145
155
  doc.lastPolledAt !== undefined &&
146
156
  (Date.now() - doc.lastPolledAt) / 1000 < doc.interval
147
157
  ) {
148
- throw new AuthError("DEVICE_SLOW_DOWN");
158
+ throw Cv.error({
159
+ code: "DEVICE_SLOW_DOWN",
160
+ message:
161
+ "Polling too frequently. Increase the interval between requests.",
162
+ });
149
163
  }
150
164
 
151
165
  await mutateDeviceUpdateLastPolled(ctx, doc._id, Date.now());
152
166
 
153
167
  if (doc.status === "pending") {
154
- throw new AuthError("DEVICE_AUTHORIZATION_PENDING");
168
+ throw Cv.error({
169
+ code: "DEVICE_AUTHORIZATION_PENDING",
170
+ message: "The user has not yet authorized this device.",
171
+ });
155
172
  }
156
173
  if (doc.status === "denied") {
157
174
  await mutateDeviceDelete(ctx, doc._id);
158
- throw new AuthError("DEVICE_CODE_DENIED");
175
+ throw Cv.error({
176
+ code: "DEVICE_CODE_DENIED",
177
+ message: "The authorization request was denied.",
178
+ });
159
179
  }
160
180
 
161
181
  if (!doc.userId || !doc.sessionId) {
162
- throw new AuthError(
163
- "INTERNAL_ERROR",
164
- "Authorized device code missing userId or sessionId",
165
- );
182
+ throw Cv.error({
183
+ code: "INTERNAL_ERROR",
184
+ message: "Authorized device code missing userId or sessionId",
185
+ });
166
186
  }
167
187
 
168
188
  await mutateDeviceDelete(ctx, doc._id);
@@ -175,31 +195,41 @@ export const handleDevice = (
175
195
  }
176
196
 
177
197
  if (typeof params.userCode !== "string") {
178
- throw new AuthError(
179
- "DEVICE_INVALID_USER_CODE",
180
- "Missing `userCode` parameter for verify flow.",
181
- );
198
+ throw Cv.error({
199
+ code: "DEVICE_INVALID_USER_CODE",
200
+ message: "Missing `userCode` parameter for verify flow.",
201
+ });
182
202
  }
183
203
 
184
204
  const identity = await ctx.auth.getUserIdentity();
185
205
  if (identity === null) {
186
- throw new AuthError(
187
- "NOT_SIGNED_IN",
188
- "You must be signed in to authorize a device.",
189
- );
206
+ throw Cv.error({
207
+ code: "NOT_SIGNED_IN",
208
+ message: "You must be signed in to authorize a device.",
209
+ });
190
210
  }
191
211
 
192
212
  const userId = userIdFromIdentitySubject(identity.subject);
193
213
  const doc = await queryDeviceByUserCode(ctx, params.userCode);
194
214
  if (doc === null) {
195
- throw new AuthError("DEVICE_INVALID_USER_CODE");
215
+ throw Cv.error({
216
+ code: "DEVICE_INVALID_USER_CODE",
217
+ message: "Invalid or expired user code.",
218
+ });
196
219
  }
197
220
  if (Date.now() > doc.expiresAt) {
198
221
  await mutateDeviceDelete(ctx, doc._id);
199
- throw new AuthError("DEVICE_CODE_EXPIRED");
222
+ throw Cv.error({
223
+ code: "DEVICE_CODE_EXPIRED",
224
+ message:
225
+ "The device code has expired. Please start a new authorization request.",
226
+ });
200
227
  }
201
228
  if (doc.status !== "pending") {
202
- throw new AuthError("DEVICE_ALREADY_AUTHORIZED");
229
+ throw Cv.error({
230
+ code: "DEVICE_ALREADY_AUTHORIZED",
231
+ message: "This device code has already been authorized.",
232
+ });
203
233
  }
204
234
 
205
235
  const signInResult = await callSignIn(ctx, {
@@ -215,7 +245,10 @@ export const handleDevice = (
215
245
  return { kind: "signedIn" as const, signedIn: null };
216
246
  },
217
247
  err: (e) =>
218
- e instanceof AuthError
248
+ e instanceof ConvexError
219
249
  ? e
220
- : new AuthError("INTERNAL_ERROR", `Device flow failed: ${String(e)}`),
250
+ : Cv.error({
251
+ code: "INTERNAL_ERROR",
252
+ message: `Device flow failed: ${String(e)}`,
253
+ }),
221
254
  });