@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.
- package/dist/authorization/index.d.ts +1 -1
- package/dist/authorization/index.js +1 -1
- package/dist/authorization/index.js.map +1 -1
- package/dist/client/index.d.ts +1 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +36 -39
- package/dist/client/index.js.map +1 -1
- package/dist/component/client/index.d.ts +1 -2
- package/dist/component/convex.config.d.ts +2 -2
- package/dist/component/convex.config.d.ts.map +1 -1
- package/dist/component/model.d.ts +5 -5
- package/dist/component/model.d.ts.map +1 -1
- package/dist/component/public/enterprise/audit.d.ts.map +1 -1
- package/dist/component/public/enterprise/audit.js.map +1 -1
- package/dist/component/public/enterprise/core.d.ts.map +1 -1
- package/dist/component/public/enterprise/core.js.map +1 -1
- package/dist/component/public/enterprise/domains.d.ts.map +1 -1
- package/dist/component/public/enterprise/domains.js.map +1 -1
- package/dist/component/public/enterprise/scim.d.ts.map +1 -1
- package/dist/component/public/enterprise/scim.js.map +1 -1
- package/dist/component/public/enterprise/secrets.d.ts.map +1 -1
- package/dist/component/public/enterprise/secrets.js.map +1 -1
- package/dist/component/public/enterprise/webhooks.d.ts.map +1 -1
- package/dist/component/public/enterprise/webhooks.js.map +1 -1
- package/dist/component/public/factors/devices.d.ts.map +1 -1
- package/dist/component/public/factors/devices.js.map +1 -1
- package/dist/component/public/factors/passkeys.d.ts.map +1 -1
- package/dist/component/public/factors/passkeys.js.map +1 -1
- package/dist/component/public/factors/totp.d.ts.map +1 -1
- package/dist/component/public/factors/totp.js.map +1 -1
- package/dist/component/public/groups/core.js.map +1 -1
- package/dist/component/public/groups/invites.d.ts.map +1 -1
- package/dist/component/public/groups/invites.js.map +1 -1
- package/dist/component/public/groups/members.d.ts.map +1 -1
- package/dist/component/public/groups/members.js.map +1 -1
- package/dist/component/public/identity/accounts.d.ts.map +1 -1
- package/dist/component/public/identity/accounts.js.map +1 -1
- package/dist/component/public/identity/codes.d.ts.map +1 -1
- package/dist/component/public/identity/codes.js.map +1 -1
- package/dist/component/public/identity/sessions.d.ts.map +1 -1
- package/dist/component/public/identity/sessions.js.map +1 -1
- package/dist/component/public/identity/tokens.d.ts.map +1 -1
- package/dist/component/public/identity/tokens.js.map +1 -1
- package/dist/component/public/identity/users.d.ts.map +1 -1
- package/dist/component/public/identity/users.js.map +1 -1
- package/dist/component/public/identity/verifiers.d.ts.map +1 -1
- package/dist/component/public/identity/verifiers.js.map +1 -1
- package/dist/component/public/security/keys.d.ts.map +1 -1
- package/dist/component/public/security/keys.js.map +1 -1
- package/dist/component/public/security/limits.d.ts.map +1 -1
- package/dist/component/public/security/limits.js.map +1 -1
- package/dist/component/schema.d.ts +39 -39
- package/dist/component/server/auth.d.ts +95 -52
- package/dist/component/server/auth.d.ts.map +1 -1
- package/dist/component/server/auth.js +63 -43
- package/dist/component/server/auth.js.map +1 -1
- package/dist/component/server/core.js +116 -235
- package/dist/component/server/core.js.map +1 -1
- package/dist/component/server/crypto.js +25 -7
- package/dist/component/server/crypto.js.map +1 -1
- package/dist/component/server/device.js +58 -15
- package/dist/component/server/device.js.map +1 -1
- package/dist/component/server/enterprise/domain.js +148 -59
- package/dist/component/server/enterprise/domain.js.map +1 -1
- package/dist/component/server/enterprise/http.js +36 -15
- package/dist/component/server/enterprise/http.js.map +1 -1
- package/dist/component/server/enterprise/oidc.js +1 -1
- package/dist/component/server/http.js +26 -21
- package/dist/component/server/http.js.map +1 -1
- package/dist/component/server/identity.js +5 -2
- package/dist/component/server/identity.js.map +1 -1
- package/dist/component/server/limits.js +21 -30
- package/dist/component/server/limits.js.map +1 -1
- package/dist/component/server/mutations/account.js +12 -10
- package/dist/component/server/mutations/account.js.map +1 -1
- package/dist/component/server/mutations/code.js +5 -2
- package/dist/component/server/mutations/code.js.map +1 -1
- package/dist/component/server/mutations/invalidate.js +1 -1
- package/dist/component/server/mutations/invalidate.js.map +1 -1
- package/dist/component/server/mutations/oauth.js +10 -4
- package/dist/component/server/mutations/oauth.js.map +1 -1
- package/dist/component/server/mutations/refresh.js +2 -2
- package/dist/component/server/mutations/refresh.js.map +1 -1
- package/dist/component/server/mutations/register.js +46 -42
- package/dist/component/server/mutations/register.js.map +1 -1
- package/dist/component/server/mutations/retrieve.js +21 -25
- package/dist/component/server/mutations/retrieve.js.map +1 -1
- package/dist/component/server/mutations/signature.js +10 -4
- package/dist/component/server/mutations/signature.js.map +1 -1
- package/dist/component/server/mutations/signout.js.map +1 -1
- package/dist/component/server/mutations/store.js +9 -24
- package/dist/component/server/mutations/store.js.map +1 -1
- package/dist/component/server/mutations/verifier.js.map +1 -1
- package/dist/component/server/mutations/verify.js +1 -1
- package/dist/component/server/mutations/verify.js.map +1 -1
- package/dist/component/server/oauth.js +53 -16
- package/dist/component/server/oauth.js.map +1 -1
- package/dist/component/server/passkey.js +115 -31
- package/dist/component/server/passkey.js.map +1 -1
- package/dist/component/server/redirects.js +9 -3
- package/dist/component/server/redirects.js.map +1 -1
- package/dist/component/server/refresh.js +10 -7
- package/dist/component/server/refresh.js.map +1 -1
- package/dist/component/server/runtime.d.ts +3 -3
- package/dist/component/server/runtime.d.ts.map +1 -1
- package/dist/component/server/runtime.js +62 -20
- package/dist/component/server/runtime.js.map +1 -1
- package/dist/component/server/signin.js +34 -10
- package/dist/component/server/signin.js.map +1 -1
- package/dist/component/server/totp.js +79 -19
- package/dist/component/server/totp.js.map +1 -1
- package/dist/component/server/types.d.ts +12 -20
- package/dist/component/server/types.d.ts.map +1 -1
- package/dist/component/server/types.js.map +1 -1
- package/dist/component/server/users.js +6 -3
- package/dist/component/server/users.js.map +1 -1
- package/dist/component/server/utils.js +10 -4
- package/dist/component/server/utils.js.map +1 -1
- package/dist/core/types.d.ts +14 -22
- package/dist/core/types.d.ts.map +1 -1
- package/dist/factors/device.js +8 -9
- package/dist/factors/device.js.map +1 -1
- package/dist/factors/passkey.js +18 -21
- package/dist/factors/passkey.js.map +1 -1
- package/dist/providers/password.js +66 -81
- package/dist/providers/password.js.map +1 -1
- package/dist/runtime/invite.js +2 -8
- package/dist/runtime/invite.js.map +1 -1
- package/dist/server/auth.d.ts +95 -52
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +63 -43
- package/dist/server/auth.js.map +1 -1
- package/dist/server/core.d.ts +71 -159
- package/dist/server/core.d.ts.map +1 -1
- package/dist/server/core.js +116 -235
- package/dist/server/core.js.map +1 -1
- package/dist/server/crypto.d.ts.map +1 -1
- package/dist/server/crypto.js +25 -7
- package/dist/server/crypto.js.map +1 -1
- package/dist/server/device.js +58 -15
- package/dist/server/device.js.map +1 -1
- package/dist/server/enterprise/domain.d.ts +0 -8
- package/dist/server/enterprise/domain.d.ts.map +1 -1
- package/dist/server/enterprise/domain.js +148 -59
- package/dist/server/enterprise/domain.js.map +1 -1
- package/dist/server/enterprise/http.d.ts.map +1 -1
- package/dist/server/enterprise/http.js +35 -14
- package/dist/server/enterprise/http.js.map +1 -1
- package/dist/server/http.d.ts +2 -2
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +25 -20
- package/dist/server/http.js.map +1 -1
- package/dist/server/identity.js +5 -2
- package/dist/server/identity.js.map +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/limits.js +21 -30
- package/dist/server/limits.js.map +1 -1
- package/dist/server/mounts.d.ts +26 -64
- package/dist/server/mounts.d.ts.map +1 -1
- package/dist/server/mounts.js +45 -106
- package/dist/server/mounts.js.map +1 -1
- package/dist/server/mutations/account.d.ts +8 -9
- package/dist/server/mutations/account.d.ts.map +1 -1
- package/dist/server/mutations/account.js +11 -9
- package/dist/server/mutations/account.js.map +1 -1
- package/dist/server/mutations/code.d.ts +13 -13
- package/dist/server/mutations/code.d.ts.map +1 -1
- package/dist/server/mutations/code.js +5 -2
- package/dist/server/mutations/code.js.map +1 -1
- package/dist/server/mutations/invalidate.d.ts +4 -4
- package/dist/server/mutations/invalidate.d.ts.map +1 -1
- package/dist/server/mutations/invalidate.js.map +1 -1
- package/dist/server/mutations/oauth.d.ts +12 -10
- package/dist/server/mutations/oauth.d.ts.map +1 -1
- package/dist/server/mutations/oauth.js +9 -3
- package/dist/server/mutations/oauth.js.map +1 -1
- package/dist/server/mutations/refresh.d.ts +3 -3
- package/dist/server/mutations/refresh.d.ts.map +1 -1
- package/dist/server/mutations/refresh.js +1 -1
- package/dist/server/mutations/refresh.js.map +1 -1
- package/dist/server/mutations/register.d.ts +11 -11
- package/dist/server/mutations/register.d.ts.map +1 -1
- package/dist/server/mutations/register.js +45 -41
- package/dist/server/mutations/register.js.map +1 -1
- package/dist/server/mutations/retrieve.d.ts +6 -6
- package/dist/server/mutations/retrieve.d.ts.map +1 -1
- package/dist/server/mutations/retrieve.js +20 -24
- package/dist/server/mutations/retrieve.js.map +1 -1
- package/dist/server/mutations/signature.d.ts +6 -7
- package/dist/server/mutations/signature.d.ts.map +1 -1
- package/dist/server/mutations/signature.js +9 -3
- package/dist/server/mutations/signature.js.map +1 -1
- package/dist/server/mutations/signin.d.ts +5 -5
- package/dist/server/mutations/signin.d.ts.map +1 -1
- package/dist/server/mutations/signout.js.map +1 -1
- package/dist/server/mutations/store.d.ts +97 -97
- package/dist/server/mutations/store.d.ts.map +1 -1
- package/dist/server/mutations/store.js +8 -23
- package/dist/server/mutations/store.js.map +1 -1
- package/dist/server/mutations/verifier.js.map +1 -1
- package/dist/server/mutations/verify.d.ts +10 -10
- package/dist/server/mutations/verify.d.ts.map +1 -1
- package/dist/server/mutations/verify.js.map +1 -1
- package/dist/server/oauth.js +53 -16
- package/dist/server/oauth.js.map +1 -1
- package/dist/server/passkey.d.ts +2 -2
- package/dist/server/passkey.d.ts.map +1 -1
- package/dist/server/passkey.js +114 -30
- package/dist/server/passkey.js.map +1 -1
- package/dist/server/redirects.js +9 -3
- package/dist/server/redirects.js.map +1 -1
- package/dist/server/refresh.js +10 -7
- package/dist/server/refresh.js.map +1 -1
- package/dist/server/runtime.d.ts +14 -14
- package/dist/server/runtime.d.ts.map +1 -1
- package/dist/server/runtime.js +61 -19
- package/dist/server/runtime.js.map +1 -1
- package/dist/server/signin.js +34 -10
- package/dist/server/signin.js.map +1 -1
- package/dist/server/ssr.d.ts.map +1 -1
- package/dist/server/ssr.js +175 -184
- package/dist/server/ssr.js.map +1 -1
- package/dist/server/totp.js +78 -18
- package/dist/server/totp.js.map +1 -1
- package/dist/server/types.d.ts +13 -21
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js.map +1 -1
- package/dist/server/users.js +6 -3
- package/dist/server/users.js.map +1 -1
- package/dist/server/utils.js +10 -4
- package/dist/server/utils.js.map +1 -1
- package/package.json +2 -6
- package/src/authorization/index.ts +1 -1
- package/src/cli/index.ts +1 -1
- package/src/client/core/types.ts +14 -14
- package/src/client/factors/device.ts +10 -12
- package/src/client/factors/passkey.ts +23 -26
- package/src/client/index.ts +54 -64
- package/src/client/runtime/invite.ts +5 -7
- package/src/component/index.ts +1 -0
- package/src/component/public/enterprise/audit.ts +6 -1
- package/src/component/public/enterprise/core.ts +1 -0
- package/src/component/public/enterprise/domains.ts +5 -1
- package/src/component/public/enterprise/scim.ts +1 -0
- package/src/component/public/enterprise/secrets.ts +1 -0
- package/src/component/public/enterprise/webhooks.ts +1 -0
- package/src/component/public/factors/devices.ts +1 -0
- package/src/component/public/factors/passkeys.ts +1 -0
- package/src/component/public/factors/totp.ts +1 -0
- package/src/component/public/groups/core.ts +1 -1
- package/src/component/public/groups/invites.ts +7 -1
- package/src/component/public/groups/members.ts +1 -0
- package/src/component/public/identity/accounts.ts +1 -0
- package/src/component/public/identity/codes.ts +1 -0
- package/src/component/public/identity/sessions.ts +1 -0
- package/src/component/public/identity/tokens.ts +1 -0
- package/src/component/public/identity/users.ts +1 -0
- package/src/component/public/identity/verifiers.ts +1 -0
- package/src/component/public/security/keys.ts +1 -0
- package/src/component/public/security/limits.ts +1 -0
- package/src/providers/password.ts +89 -110
- package/src/server/auth.ts +177 -111
- package/src/server/core.ts +197 -233
- package/src/server/crypto.ts +31 -29
- package/src/server/device.ts +65 -32
- package/src/server/enterprise/domain.ts +158 -170
- package/src/server/enterprise/http.ts +46 -39
- package/src/server/http.ts +36 -30
- package/src/server/identity.ts +5 -5
- package/src/server/index.ts +2 -0
- package/src/server/limits.ts +53 -80
- package/src/server/mounts.ts +47 -74
- package/src/server/mutations/account.ts +22 -36
- package/src/server/mutations/code.ts +6 -6
- package/src/server/mutations/invalidate.ts +1 -1
- package/src/server/mutations/oauth.ts +14 -8
- package/src/server/mutations/refresh.ts +5 -4
- package/src/server/mutations/register.ts +87 -132
- package/src/server/mutations/retrieve.ts +44 -44
- package/src/server/mutations/signature.ts +13 -6
- package/src/server/mutations/signout.ts +1 -1
- package/src/server/mutations/store.ts +16 -31
- package/src/server/mutations/verifier.ts +1 -1
- package/src/server/mutations/verify.ts +3 -5
- package/src/server/oauth.ts +60 -69
- package/src/server/passkey.ts +567 -517
- package/src/server/redirects.ts +10 -6
- package/src/server/refresh.ts +14 -18
- package/src/server/runtime.ts +70 -55
- package/src/server/signin.ts +44 -37
- package/src/server/ssr.ts +390 -407
- package/src/server/totp.ts +85 -35
- package/src/server/types.ts +19 -22
- package/src/server/users.ts +7 -6
- package/src/server/utils.ts +10 -12
- package/dist/component/server/authError.js +0 -34
- package/dist/component/server/authError.js.map +0 -1
- package/dist/component/server/errors.d.ts +0 -1
- package/dist/component/server/errors.js +0 -137
- package/dist/component/server/errors.js.map +0 -1
- package/dist/server/authError.d.ts +0 -46
- package/dist/server/authError.d.ts.map +0 -1
- package/dist/server/authError.js +0 -34
- package/dist/server/authError.js.map +0 -1
- package/dist/server/errors.d.ts +0 -177
- package/dist/server/errors.d.ts.map +0 -1
- package/dist/server/errors.js +0 -212
- package/dist/server/errors.js.map +0 -1
- package/src/server/authError.ts +0 -44
- package/src/server/errors.ts +0 -290
package/src/server/mounts.ts
CHANGED
|
@@ -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
|
|
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
|
|
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)
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
219
|
+
throw Cv.error({
|
|
220
|
+
code: "FORBIDDEN",
|
|
221
|
+
message: "Access denied.",
|
|
222
|
+
});
|
|
216
223
|
}
|
|
217
224
|
const resolved = await resolveMountedEnterpriseTarget(auth, ctx, target);
|
|
218
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
};
|
|
713
|
+
throw Cv.error({
|
|
714
|
+
code: "INVALID_PARAMETERS",
|
|
715
|
+
message: "Webhook endpoint not found.",
|
|
716
|
+
});
|
|
740
717
|
}
|
|
741
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
|
51
|
-
"ACCOUNT_NOT_FOUND",
|
|
52
|
-
`Expected an account to exist for ID "${typedExistingAccountId}"`,
|
|
53
|
-
)
|
|
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
|
-
|
|
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,
|
|
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: () =>
|
|
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
|
-
?
|
|
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:
|
|
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(
|