@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,3 +1,4 @@
1
+ import { Cv } from "@robelest/fx/convex";
1
2
  import { actionGeneric, mutationGeneric, queryGeneric } from "convex/server";
2
3
  import { ConvexError, v } from "convex/values";
3
4
 
@@ -62,11 +63,11 @@ export type EnterpriseAdminAuthorizationInput = {
62
63
  /**
63
64
  * App-defined authorization hook for mounted enterprise admin APIs.
64
65
  *
65
- * Return `void` (or resolve) to allow the operation, or `{ ok: false }` to deny it.
66
+ * Return `void` (or resolve) to allow the operation, or throw to deny it.
66
67
  *
67
68
  * @param ctx - Convex context with `ctx.auth` for identity checks.
68
69
  * @param input - The {@link EnterpriseAdminAuthorizationInput} describing who is doing what.
69
- * @returns `void` to allow, `{ ok: false }` to deny.
70
+ * @returns `void` to allow; throw to deny.
70
71
  *
71
72
  * @example
72
73
  * ```ts
@@ -74,7 +75,7 @@ export type EnterpriseAdminAuthorizationInput = {
74
75
  *
75
76
  * const authorized: EnterpriseAuthorizer = async (ctx, input) => {
76
77
  * const identity = await ctx.auth.getUserIdentity();
77
- * if (!identity) return { ok: false };
78
+ * if (!identity) throw new Error("Forbidden");
78
79
  * // Allow all admin ops for the org owner
79
80
  * };
80
81
  * ```
@@ -82,7 +83,7 @@ export type EnterpriseAdminAuthorizationInput = {
82
83
  export type EnterpriseAuthorizer = (
83
84
  ctx: { auth: import("convex/server").Auth },
84
85
  input: EnterpriseAdminAuthorizationInput,
85
- ) => Promise<void | { ok: false }>;
86
+ ) => Promise<void>;
86
87
 
87
88
  type RoleRef<TRoleId extends string> = { id: TRoleId };
88
89
 
@@ -209,23 +210,26 @@ function createMountedAdminAuthorizer(
209
210
  ) => {
210
211
  const userId = await requireUserId(ctx);
211
212
  if (userId === null) {
212
- return { ok: false as const, code: "NOT_SIGNED_IN" as const };
213
+ throw Cv.error({
214
+ code: "NOT_SIGNED_IN",
215
+ message: "You must be signed in to perform this action.",
216
+ });
213
217
  }
214
218
  if (!options?.admin?.authorized) {
215
- return { ok: false as const, code: "FORBIDDEN" as const };
219
+ throw Cv.error({
220
+ code: "FORBIDDEN",
221
+ message: "Access denied.",
222
+ });
216
223
  }
217
224
  const resolved = await resolveMountedEnterpriseTarget(auth, ctx, target);
218
- const authResult = await options.admin.authorized(ctx, {
225
+ await options.admin.authorized(ctx, {
219
226
  userId,
220
227
  permission,
221
228
  enterpriseId: resolved.enterpriseId,
222
229
  groupId: resolved.groupId,
223
230
  resolvedGroupId: resolved.resolvedGroupId,
224
231
  });
225
- if (authResult && !authResult.ok) {
226
- return { ok: false as const, code: "FORBIDDEN" as const };
227
- }
228
- return { ok: true as const, userId, ...resolved };
232
+ return { userId, ...resolved };
229
233
  };
230
234
  }
231
235
 
@@ -286,8 +290,6 @@ export function sso<
286
290
  const authResult = await authorize(ctx, "sso.connection.create", {
287
291
  groupId: args.groupId,
288
292
  });
289
- if (!authResult.ok)
290
- return { ok: false as const, code: authResult.code };
291
293
  const { userId } = authResult;
292
294
  const createsGroup = args.groupId === undefined;
293
295
  const groupId =
@@ -332,10 +334,9 @@ export function sso<
332
334
  get: queryGeneric({
333
335
  args: { enterpriseId: v.string() },
334
336
  handler: async (ctx, args) => {
335
- const _auth = await authorize(ctx, "sso.connection.read", {
337
+ await authorize(ctx, "sso.connection.read", {
336
338
  enterpriseId: args.enterpriseId,
337
339
  });
338
- if (!_auth.ok) return null;
339
340
  return await auth.sso.admin.connection.get(
340
341
  ctx as never,
341
342
  args.enterpriseId,
@@ -345,10 +346,9 @@ export function sso<
345
346
  getByGroup: queryGeneric({
346
347
  args: { groupId: v.string() },
347
348
  handler: async (ctx, args) => {
348
- const _auth = await authorize(ctx, "sso.connection.read", {
349
+ await authorize(ctx, "sso.connection.read", {
349
350
  groupId: args.groupId,
350
351
  });
351
- if (!_auth.ok) return null;
352
352
  return await auth.sso.admin.connection.getByGroup(
353
353
  ctx as never,
354
354
  args.groupId,
@@ -358,10 +358,9 @@ export function sso<
358
358
  getByDomain: queryGeneric({
359
359
  args: { domain: v.string() },
360
360
  handler: async (ctx, args) => {
361
- const _auth = await authorize(ctx, "sso.connection.read", {
361
+ await authorize(ctx, "sso.connection.read", {
362
362
  domain: args.domain,
363
363
  });
364
- if (!_auth.ok) return null;
365
364
  return await auth.sso.admin.connection.getByDomain(
366
365
  ctx as never,
367
366
  args.domain,
@@ -377,10 +376,9 @@ export function sso<
377
376
  order: v.optional(v.union(v.literal("asc"), v.literal("desc"))),
378
377
  },
379
378
  handler: async (ctx, args) => {
380
- const _auth = await authorize(ctx, "sso.connection.read", {
379
+ await authorize(ctx, "sso.connection.read", {
381
380
  groupId: args.where?.groupId,
382
381
  });
383
- if (!_auth.ok) return null;
384
382
  return await auth.sso.admin.connection.list(
385
383
  ctx as never,
386
384
  args as never,
@@ -397,25 +395,23 @@ export function sso<
397
395
  }),
398
396
  },
399
397
  handler: async (ctx, args) => {
400
- const _auth = await authorize(ctx, "sso.connection.manage", {
398
+ await authorize(ctx, "sso.connection.manage", {
401
399
  enterpriseId: args.enterpriseId,
402
400
  });
403
- if (!_auth.ok) return { ok: false as const, code: _auth.code };
404
401
  await auth.sso.admin.connection.update(
405
402
  ctx as never,
406
403
  args.enterpriseId,
407
404
  args.data,
408
405
  );
409
- return { ok: true as const, enterpriseId: args.enterpriseId };
406
+ return { enterpriseId: args.enterpriseId };
410
407
  },
411
408
  }),
412
409
  delete: mutationGeneric({
413
410
  args: { enterpriseId: v.string() },
414
411
  handler: async (ctx, args) => {
415
- const _auth = await authorize(ctx, "sso.connection.manage", {
412
+ await authorize(ctx, "sso.connection.manage", {
416
413
  enterpriseId: args.enterpriseId,
417
414
  });
418
- if (!_auth.ok) return { ok: false as const, code: _auth.code };
419
415
  return await auth.sso.admin.connection.delete(
420
416
  ctx as never,
421
417
  args.enterpriseId,
@@ -425,10 +421,9 @@ export function sso<
425
421
  status: queryGeneric({
426
422
  args: { enterpriseId: v.string() },
427
423
  handler: async (ctx, args) => {
428
- const _auth = await authorize(ctx, "sso.connection.read", {
424
+ await authorize(ctx, "sso.connection.read", {
429
425
  enterpriseId: args.enterpriseId,
430
426
  });
431
- if (!_auth.ok) return null;
432
427
  return await auth.sso.admin.connection.status(
433
428
  ctx as never,
434
429
  args.enterpriseId,
@@ -439,10 +434,9 @@ export function sso<
439
434
  list: queryGeneric({
440
435
  args: { enterpriseId: v.string() },
441
436
  handler: async (ctx, args) => {
442
- const _auth = await authorize(ctx, "sso.connection.read", {
437
+ await authorize(ctx, "sso.connection.read", {
443
438
  enterpriseId: args.enterpriseId,
444
439
  });
445
- if (!_auth.ok) return null;
446
440
  return await auth.sso.admin.connection.domain.list(
447
441
  ctx as never,
448
442
  args.enterpriseId,
@@ -452,10 +446,9 @@ export function sso<
452
446
  validate: queryGeneric({
453
447
  args: { enterpriseId: v.string() },
454
448
  handler: async (ctx, args) => {
455
- const _auth = await authorize(ctx, "sso.domain.manage", {
449
+ await authorize(ctx, "sso.domain.manage", {
456
450
  enterpriseId: args.enterpriseId,
457
451
  });
458
- if (!_auth.ok) return null;
459
452
  return await auth.sso.admin.connection.domain.validate(
460
453
  ctx as never,
461
454
  args.enterpriseId,
@@ -468,10 +461,9 @@ export function sso<
468
461
  domains: v.array(enterpriseDomainInputValidator),
469
462
  },
470
463
  handler: async (ctx, args) => {
471
- const _auth = await authorize(ctx, "sso.domain.manage", {
464
+ await authorize(ctx, "sso.domain.manage", {
472
465
  enterpriseId: args.enterpriseId,
473
466
  });
474
- if (!_auth.ok) return { ok: false as const, code: _auth.code };
475
467
  return await auth.sso.admin.connection.domain.set(
476
468
  ctx as never,
477
469
  args.enterpriseId,
@@ -483,10 +475,9 @@ export function sso<
483
475
  request: mutationGeneric({
484
476
  args: enterpriseDomainVerificationInputValidator,
485
477
  handler: async (ctx, args) => {
486
- const _auth = await authorize(ctx, "sso.domain.manage", {
478
+ await authorize(ctx, "sso.domain.manage", {
487
479
  enterpriseId: args.enterpriseId,
488
480
  });
489
- if (!_auth.ok) return { ok: false as const, code: _auth.code };
490
481
  return await auth.sso.admin.connection.domain.verification.request(
491
482
  ctx as never,
492
483
  args,
@@ -496,10 +487,9 @@ export function sso<
496
487
  confirm: actionGeneric({
497
488
  args: enterpriseDomainVerificationInputValidator,
498
489
  handler: async (ctx, args) => {
499
- const _auth = await authorize(ctx, "sso.domain.manage", {
490
+ await authorize(ctx, "sso.domain.manage", {
500
491
  enterpriseId: args.enterpriseId,
501
492
  });
502
- if (!_auth.ok) return { ok: false as const, code: _auth.code };
503
493
  return await auth.sso.admin.connection.domain.verification.confirm(
504
494
  ctx as never,
505
495
  args,
@@ -524,20 +514,18 @@ export function sso<
524
514
  extraFields: v.optional(v.record(v.string(), v.string())),
525
515
  },
526
516
  handler: async (ctx, args) => {
527
- const _auth = await authorize(ctx, "sso.protocol.manage", {
517
+ await authorize(ctx, "sso.protocol.manage", {
528
518
  enterpriseId: args.enterpriseId,
529
519
  });
530
- if (!_auth.ok) return { ok: false as const, code: _auth.code };
531
520
  return await auth.sso.admin.oidc.configure(ctx as never, args);
532
521
  },
533
522
  }),
534
523
  get: queryGeneric({
535
524
  args: { enterpriseId: v.string() },
536
525
  handler: async (ctx, args) => {
537
- const _auth = await authorize(ctx, "sso.connection.read", {
526
+ await authorize(ctx, "sso.connection.read", {
538
527
  enterpriseId: args.enterpriseId,
539
528
  });
540
- if (!_auth.ok) return null;
541
529
  return await auth.sso.admin.oidc.get(
542
530
  ctx as never,
543
531
  args.enterpriseId,
@@ -547,10 +535,9 @@ export function sso<
547
535
  validate: actionGeneric({
548
536
  args: { enterpriseId: v.string() },
549
537
  handler: async (ctx, args) => {
550
- const _auth = await authorize(ctx, "sso.protocol.manage", {
538
+ await authorize(ctx, "sso.protocol.manage", {
551
539
  enterpriseId: args.enterpriseId,
552
540
  });
553
- if (!_auth.ok) return { ok: false as const, code: _auth.code };
554
541
  return await auth.sso.admin.oidc.validate(
555
542
  ctx as never,
556
543
  args.enterpriseId,
@@ -572,20 +559,18 @@ export function sso<
572
559
  sp: v.optional(enterpriseSamlSpValidator),
573
560
  },
574
561
  handler: async (ctx, args) => {
575
- const _auth = await authorize(ctx, "sso.protocol.manage", {
562
+ await authorize(ctx, "sso.protocol.manage", {
576
563
  enterpriseId: args.enterpriseId,
577
564
  });
578
- if (!_auth.ok) return { ok: false as const, code: _auth.code };
579
565
  return await auth.sso.admin.saml.configure(ctx as never, args);
580
566
  },
581
567
  }),
582
568
  validate: queryGeneric({
583
569
  args: { enterpriseId: v.string() },
584
570
  handler: async (ctx, args) => {
585
- const _auth = await authorize(ctx, "sso.protocol.manage", {
571
+ await authorize(ctx, "sso.protocol.manage", {
586
572
  enterpriseId: args.enterpriseId,
587
573
  });
588
- if (!_auth.ok) return null;
589
574
  return await auth.sso.admin.saml.validate(
590
575
  ctx as never,
591
576
  args.enterpriseId,
@@ -597,10 +582,9 @@ export function sso<
597
582
  get: queryGeneric({
598
583
  args: { enterpriseId: v.string() },
599
584
  handler: async (ctx, args) => {
600
- const _auth = await authorize(ctx, "sso.connection.read", {
585
+ await authorize(ctx, "sso.connection.read", {
601
586
  enterpriseId: args.enterpriseId,
602
587
  });
603
- if (!_auth.ok) return null;
604
588
  return await auth.sso.admin.policy.get(
605
589
  ctx as never,
606
590
  args.enterpriseId,
@@ -613,10 +597,9 @@ export function sso<
613
597
  patch: enterprisePolicyPatchValidator,
614
598
  },
615
599
  handler: async (ctx, args) => {
616
- const _auth = await authorize(ctx, "sso.policy.manage", {
600
+ await authorize(ctx, "sso.policy.manage", {
617
601
  enterpriseId: args.enterpriseId,
618
602
  });
619
- if (!_auth.ok) return { ok: false as const, code: _auth.code };
620
603
  return await auth.sso.admin.policy.update(
621
604
  ctx as never,
622
605
  args.enterpriseId,
@@ -627,10 +610,9 @@ export function sso<
627
610
  validate: queryGeneric({
628
611
  args: { enterpriseId: v.string() },
629
612
  handler: async (ctx, args) => {
630
- const _auth = await authorize(ctx, "sso.policy.manage", {
613
+ await authorize(ctx, "sso.policy.manage", {
631
614
  enterpriseId: args.enterpriseId,
632
615
  });
633
- if (!_auth.ok) return null;
634
616
  return await auth.sso.admin.policy.validate(
635
617
  ctx as never,
636
618
  args.enterpriseId,
@@ -646,11 +628,10 @@ export function sso<
646
628
  limit: v.optional(v.number()),
647
629
  },
648
630
  handler: async (ctx, args) => {
649
- const _auth = await authorize(ctx, "sso.audit.read", {
631
+ await authorize(ctx, "sso.audit.read", {
650
632
  enterpriseId: args.enterpriseId,
651
633
  groupId: args.groupId,
652
634
  });
653
- if (!_auth.ok) return null;
654
635
  return await auth.sso.admin.audit.list(ctx as never, args);
655
636
  },
656
637
  }),
@@ -663,10 +644,9 @@ export function sso<
663
644
  limit: v.optional(v.number()),
664
645
  },
665
646
  handler: async (ctx, args) => {
666
- const _auth = await authorize(ctx, "sso.webhook.manage", {
647
+ await authorize(ctx, "sso.webhook.manage", {
667
648
  enterpriseId: args.enterpriseId,
668
649
  });
669
- if (!_auth.ok) return null;
670
650
  return await (auth.sso.admin.webhook as any).delivery.list(
671
651
  ctx as never,
672
652
  args,
@@ -687,8 +667,6 @@ export function sso<
687
667
  const authResult = await authorize(ctx, "sso.webhook.manage", {
688
668
  enterpriseId: args.enterpriseId,
689
669
  });
690
- if (!authResult.ok)
691
- return { ok: false as const, code: authResult.code };
692
670
  const { userId } = authResult;
693
671
  const result = await auth.sso.admin.webhook.endpoint.create(
694
672
  ctx as never,
@@ -711,10 +689,9 @@ export function sso<
711
689
  list: queryGeneric({
712
690
  args: { enterpriseId: v.string() },
713
691
  handler: async (ctx, args) => {
714
- const _auth = await authorize(ctx, "sso.webhook.manage", {
692
+ await authorize(ctx, "sso.webhook.manage", {
715
693
  enterpriseId: args.enterpriseId,
716
694
  });
717
- if (!_auth.ok) return null;
718
695
  const endpoints = await auth.sso.admin.webhook.endpoint.list(
719
696
  ctx as never,
720
697
  args.enterpriseId,
@@ -733,16 +710,15 @@ export function sso<
733
710
  args.endpointId,
734
711
  );
735
712
  if (!endpoint) {
736
- return {
737
- ok: false as const,
738
- code: "INVALID_PARAMETERS" as const,
739
- };
713
+ throw Cv.error({
714
+ code: "INVALID_PARAMETERS",
715
+ message: "Webhook endpoint not found.",
716
+ });
740
717
  }
741
- const _auth = await authorize(ctx, "sso.webhook.manage", {
718
+ await authorize(ctx, "sso.webhook.manage", {
742
719
  enterpriseId: endpoint.enterpriseId,
743
720
  groupId: endpoint.groupId,
744
721
  });
745
- if (!_auth.ok) return { ok: false as const, code: _auth.code };
746
722
  return await auth.sso.admin.webhook.endpoint.disable(
747
723
  ctx as never,
748
724
  args.endpointId,
@@ -825,30 +801,27 @@ export function scim<
825
801
  status: v.optional(enterpriseStatusValidator),
826
802
  },
827
803
  handler: async (ctx, args) => {
828
- const _auth = await authorize(ctx, "scim.manage", {
804
+ await authorize(ctx, "scim.manage", {
829
805
  enterpriseId: args.enterpriseId,
830
806
  });
831
- if (!_auth.ok) return { ok: false as const, code: _auth.code };
832
807
  return await auth.scim.admin.configure(ctx as never, args);
833
808
  },
834
809
  }),
835
810
  get: queryGeneric({
836
811
  args: { enterpriseId: v.string() },
837
812
  handler: async (ctx, args) => {
838
- const _auth = await authorize(ctx, "scim.manage", {
813
+ await authorize(ctx, "scim.manage", {
839
814
  enterpriseId: args.enterpriseId,
840
815
  });
841
- if (!_auth.ok) return null;
842
816
  return await auth.scim.admin.get(ctx as never, args.enterpriseId);
843
817
  },
844
818
  }),
845
819
  validate: queryGeneric({
846
820
  args: { enterpriseId: v.string() },
847
821
  handler: async (ctx, args) => {
848
- const _auth = await authorize(ctx, "scim.manage", {
822
+ await authorize(ctx, "scim.manage", {
849
823
  enterpriseId: args.enterpriseId,
850
824
  });
851
- if (!_auth.ok) return null;
852
825
  return await auth.scim.admin.validate(
853
826
  ctx as never,
854
827
  args.enterpriseId,
@@ -1,11 +1,11 @@
1
1
  import { Fx } from "@robelest/fx";
2
+ import { Cv } from "@robelest/fx/convex";
2
3
  import type { GenericActionCtx, GenericDataModel } from "convex/server";
3
- import { Infer, v } from "convex/values";
4
+ import { ConvexError, Infer, v } from "convex/values";
4
5
 
5
- import { authDb } from "../db";
6
- import { AuthError } from "../authError";
7
6
  import { GetProviderOrThrowFunc, hash } from "../crypto";
8
7
  import * as Provider from "../crypto";
8
+ import { authDb } from "../db";
9
9
  import { MutationCtx } from "../types";
10
10
  import { LOG_LEVELS, logWithLevel, maybeRedact } from "../utils";
11
11
  import { AUTH_STORE_REF } from "./store/refs";
@@ -20,7 +20,7 @@ export function modifyAccountImpl(
20
20
  args: Infer<typeof modifyAccountArgs>,
21
21
  getProviderOrThrow: GetProviderOrThrowFunc,
22
22
  config: Provider.Config,
23
- ): Fx<void, AuthError> {
23
+ ): Fx<void, ConvexError<any>> {
24
24
  const { provider, account } = args;
25
25
  const db = authDb(ctx, config);
26
26
 
@@ -29,38 +29,24 @@ export function modifyAccountImpl(
29
29
  account: { id: account.id, secret: maybeRedact(account.secret ?? "") },
30
30
  });
31
31
 
32
- return Fx.from({
33
- ok: () => db.accounts.get(provider, account.id),
34
- err: () =>
35
- new AuthError(
36
- "ACCOUNT_NOT_FOUND",
37
- `Cannot modify account with ID ${account.id} because it does not exist`,
38
- ),
39
- }).pipe(
40
- Fx.chain((doc) =>
41
- doc === null
42
- ? Fx.fail(
43
- new AuthError(
44
- "ACCOUNT_NOT_FOUND",
45
- `Cannot modify account with ID ${account.id} because it does not exist`,
46
- ),
47
- )
48
- : Fx.succeed(doc),
49
- ),
50
- Fx.chain((existingAccount) =>
51
- hash(getProviderOrThrow(provider), account.secret).pipe(
52
- Fx.chain((hashedSecret) =>
53
- Fx.from({
54
- ok: () =>
55
- db.accounts.patch(existingAccount._id, { secret: hashedSecret }),
56
- err: () =>
57
- new AuthError("INTERNAL_ERROR", "Failed to patch account"),
58
- }),
59
- ),
60
- ),
61
- ),
62
- Fx.map(() => undefined),
63
- );
32
+ return Fx.gen(function* () {
33
+ const existingAccount = yield* Fx.promise(() =>
34
+ db.accounts.get(provider, account.id),
35
+ );
36
+ if (existingAccount === null) {
37
+ return yield* Cv.fail({
38
+ code: "ACCOUNT_NOT_FOUND",
39
+ message: `Cannot modify account with ID ${account.id} because it does not exist`,
40
+ });
41
+ }
42
+ const hashedSecret = yield* hash(
43
+ getProviderOrThrow(provider),
44
+ account.secret,
45
+ );
46
+ yield* Fx.promise(() =>
47
+ db.accounts.patch(existingAccount._id, { secret: hashedSecret }),
48
+ );
49
+ });
64
50
  }
65
51
 
66
52
  export const callModifyAccount = async <DataModel extends GenericDataModel>(
@@ -1,9 +1,9 @@
1
+ import { Cv } from "@robelest/fx/convex";
1
2
  import type { GenericActionCtx, GenericDataModel } from "convex/server";
2
3
  import { GenericId, Infer, v } from "convex/values";
3
4
 
4
- import { authDb } from "../db";
5
- import { AuthError } from "../authError";
6
5
  import * as Provider from "../crypto";
6
+ import { authDb } from "../db";
7
7
  import { getAuthSessionId } from "../sessions";
8
8
  import { MutationCtx } from "../types";
9
9
  import { EmailConfig, PhoneConfig } from "../types";
@@ -47,10 +47,10 @@ export async function createVerificationCodeImpl(
47
47
  typedExistingAccountId !== undefined
48
48
  ? ((await db.accounts.getById(typedExistingAccountId)) ??
49
49
  (() => {
50
- throw new AuthError(
51
- "ACCOUNT_NOT_FOUND",
52
- `Expected an account to exist for ID "${typedExistingAccountId}"`,
53
- ).toConvexError();
50
+ throw Cv.error({
51
+ code: "ACCOUNT_NOT_FOUND",
52
+ message: `Expected an account to exist for ID "${typedExistingAccountId}"`,
53
+ });
54
54
  })())
55
55
  : await db.accounts.get(providerId, email ?? phone!);
56
56
 
@@ -2,8 +2,8 @@ import { Fx } from "@robelest/fx";
2
2
  import type { GenericActionCtx, GenericDataModel } from "convex/server";
3
3
  import { GenericId, Infer, v } from "convex/values";
4
4
 
5
- import { authDb } from "../db";
6
5
  import * as Provider from "../crypto";
6
+ import { authDb } from "../db";
7
7
  import { deleteSession } from "../sessions";
8
8
  import { Doc, MutationCtx } from "../types";
9
9
  import { LOG_LEVELS, logWithLevel } from "../utils";
@@ -1,13 +1,12 @@
1
1
  import { Fx } from "@robelest/fx";
2
+ import { Cv } from "@robelest/fx/convex";
2
3
  import type { GenericActionCtx, GenericDataModel } from "convex/server";
4
+ import type { ConvexError } from "convex/values";
3
5
  import { Infer, v } from "convex/values";
4
6
 
5
- import { authDb } from "../db";
6
- import { AuthError } from "../authError";
7
7
  import * as Provider from "../crypto";
8
- import {
9
- createSyntheticOAuthMaterializedConfig,
10
- } from "../enterprise/oidc";
8
+ import { authDb } from "../db";
9
+ import { createSyntheticOAuthMaterializedConfig } from "../enterprise/oidc";
11
10
  import { normalizeEnterprisePolicy } from "../enterprise/policy";
12
11
  import {
13
12
  ENTERPRISE_OIDC_PROVIDER_PREFIX,
@@ -81,7 +80,7 @@ export function userOAuthImpl(
81
80
  args: Infer<typeof userOAuthArgs>,
82
81
  getProviderOrThrow: Provider.GetProviderOrThrowFunc,
83
82
  config: Provider.Config,
84
- ): Fx<ReturnType, AuthError> {
83
+ ): Fx<ReturnType, ConvexError<{ code: string; message: string }>> {
85
84
  return Fx.gen(function* () {
86
85
  logWithLevel("DEBUG", "userOAuthImpl args:", args);
87
86
  const { profile, provider, providerAccountId, signature, accountExtend } =
@@ -129,11 +128,18 @@ export function userOAuthImpl(
129
128
 
130
129
  const verifier = yield* Fx.from({
131
130
  ok: () => db.verifiers.getBySignature(signature),
132
- err: () => new AuthError("OAUTH_INVALID_STATE"),
131
+ err: () =>
132
+ Cv.error({
133
+ code: "OAUTH_INVALID_STATE",
134
+ message: "Invalid OAuth state. Please try signing in again.",
135
+ }),
133
136
  }).pipe(
134
137
  Fx.chain((doc) =>
135
138
  doc === null
136
- ? Fx.fail(new AuthError("OAUTH_INVALID_STATE"))
139
+ ? Cv.fail({
140
+ code: "OAUTH_INVALID_STATE",
141
+ message: "Invalid OAuth state. Please try signing in again.",
142
+ })
137
143
  : Fx.succeed(doc),
138
144
  ),
139
145
  );
@@ -1,10 +1,9 @@
1
1
  import { Fx } from "@robelest/fx";
2
2
  import type { GenericActionCtx, GenericDataModel } from "convex/server";
3
- import { Infer, v } from "convex/values";
3
+ import { ConvexError, Infer, v } from "convex/values";
4
4
 
5
- import { authDb } from "../db";
6
- import { AuthError } from "../authError";
7
5
  import * as Provider from "../crypto";
6
+ import { authDb } from "../db";
8
7
  import {
9
8
  invalidateRefreshTokensInSubtree,
10
9
  parseRefreshToken,
@@ -50,7 +49,9 @@ export async function refreshSessionImpl(
50
49
 
51
50
  return Fx.run(
52
51
  parseRefreshToken(refreshToken).pipe(
53
- Fx.recover((err: AuthError) => Fx.fail(new RefreshFailure(err.message))),
52
+ Fx.recover((err: ConvexError<any>) =>
53
+ Fx.fail(new RefreshFailure(err.data.message)),
54
+ ),
54
55
  Fx.tap(({ refreshTokenId, sessionId: tokenSessionId }) =>
55
56
  Fx.sync(() =>
56
57
  logWithLevel(