@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
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { AuthError } from "../authError.js";
|
|
2
1
|
import { LOG_LEVELS, logWithLevel, maybeRedact } from "../utils.js";
|
|
3
|
-
import { authDb } from "../db.js";
|
|
4
2
|
import { hash, verify } from "../crypto.js";
|
|
3
|
+
import { authDb } from "../db.js";
|
|
5
4
|
import { AUTH_STORE_REF } from "./store/refs.js";
|
|
6
5
|
import { getAuthSessionId } from "../sessions.js";
|
|
7
6
|
import { upsertUserAndAccount } from "../users.js";
|
|
8
7
|
import { Fx } from "@robelest/fx";
|
|
8
|
+
import { Cv } from "@robelest/fx/convex";
|
|
9
9
|
import { v } from "convex/values";
|
|
10
10
|
|
|
11
11
|
//#region src/server/mutations/register.ts
|
|
@@ -30,46 +30,50 @@ async function createAccountFromCredentialsImpl(ctx, args, getProviderOrThrow, c
|
|
|
30
30
|
const { provider: providerId, account, profile, shouldLinkViaEmail, shouldLinkViaPhone } = args;
|
|
31
31
|
const db = authDb(ctx, config);
|
|
32
32
|
const provider = getProviderOrThrow(providerId);
|
|
33
|
-
return Fx.run(Fx.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
user
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
providerAccountId: account.id,
|
|
47
|
-
secret
|
|
48
|
-
}, {
|
|
49
|
-
type: "credentials",
|
|
50
|
-
provider,
|
|
51
|
-
profile,
|
|
52
|
-
shouldLinkViaEmail,
|
|
53
|
-
shouldLinkViaPhone
|
|
54
|
-
}, config),
|
|
55
|
-
err: () => new AuthError("INTERNAL_ERROR")
|
|
56
|
-
})), Fx.chain((result) => {
|
|
57
|
-
const { userId, accountId } = result;
|
|
58
|
-
return Fx.zip(Fx.from({
|
|
59
|
-
ok: () => db.accounts.getById(accountId),
|
|
60
|
-
err: () => new AuthError("INTERNAL_ERROR")
|
|
61
|
-
}), Fx.from({
|
|
62
|
-
ok: () => db.users.getById(userId),
|
|
63
|
-
err: () => new AuthError("INTERNAL_ERROR")
|
|
64
|
-
}));
|
|
65
|
-
}), Fx.chain((pair) => {
|
|
66
|
-
const [createdAccount, createdUser] = pair;
|
|
67
|
-
return createdAccount === null ? Fx.fail(new AuthError("ACCOUNT_NOT_FOUND", `Created account was not found.`)) : createdUser === null ? Fx.fail(new AuthError("USER_UPDATE_FAILED", `Created user was not found.`)) : Fx.succeed({
|
|
68
|
-
account: createdAccount,
|
|
69
|
-
user: createdUser
|
|
33
|
+
return Fx.run(Fx.gen(function* () {
|
|
34
|
+
const existingAccount = yield* Fx.promise(() => db.accounts.get(provider.id, account.id));
|
|
35
|
+
if (existingAccount !== null) {
|
|
36
|
+
if (account.secret !== void 0) {
|
|
37
|
+
if (!(yield* verify(provider, account.secret, existingAccount.secret ?? ""))) return yield* Cv.fail({
|
|
38
|
+
code: "ACCOUNT_ALREADY_EXISTS",
|
|
39
|
+
message: `Account ${account.id} already exists`
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
const user = yield* Fx.promise(() => db.users.getById(existingAccount.userId));
|
|
43
|
+
if (user === null) return yield* Cv.fail({
|
|
44
|
+
code: "ACCOUNT_NOT_FOUND",
|
|
45
|
+
message: `Linked user for account ${account.id} was not found.`
|
|
70
46
|
});
|
|
71
|
-
|
|
72
|
-
|
|
47
|
+
return {
|
|
48
|
+
account: existingAccount,
|
|
49
|
+
user
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const secret = account.secret !== void 0 ? yield* hash(provider, account.secret) : void 0;
|
|
53
|
+
const { userId, accountId } = yield* Fx.promise(async () => upsertUserAndAccount(ctx, await getAuthSessionId(ctx), {
|
|
54
|
+
providerAccountId: account.id,
|
|
55
|
+
secret
|
|
56
|
+
}, {
|
|
57
|
+
type: "credentials",
|
|
58
|
+
provider,
|
|
59
|
+
profile,
|
|
60
|
+
shouldLinkViaEmail,
|
|
61
|
+
shouldLinkViaPhone
|
|
62
|
+
}, config));
|
|
63
|
+
const [createdAccount, createdUser] = yield* Fx.zip(Fx.promise(() => db.accounts.getById(accountId)), Fx.promise(() => db.users.getById(userId)));
|
|
64
|
+
if (createdAccount === null) return yield* Cv.fail({
|
|
65
|
+
code: "ACCOUNT_NOT_FOUND",
|
|
66
|
+
message: `Created account was not found.`
|
|
67
|
+
});
|
|
68
|
+
if (createdUser === null) return yield* Cv.fail({
|
|
69
|
+
code: "USER_UPDATE_FAILED",
|
|
70
|
+
message: `Created user was not found.`
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
account: createdAccount,
|
|
74
|
+
user: createdUser
|
|
75
|
+
};
|
|
76
|
+
}));
|
|
73
77
|
}
|
|
74
78
|
const callCreateAccountFromCredentials = async (ctx, args) => {
|
|
75
79
|
return ctx.runMutation(AUTH_STORE_REF, { args: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","names":["Provider.verify","Provider.hash"],"sources":["../../../src/server/mutations/register.ts"],"sourcesContent":["import { Fx } from \"@robelest/fx\";\nimport type { GenericActionCtx, GenericDataModel } from \"convex/server\";\nimport { Infer, v } from \"convex/values\";\n\nimport
|
|
1
|
+
{"version":3,"file":"register.js","names":["Provider.verify","Provider.hash"],"sources":["../../../src/server/mutations/register.ts"],"sourcesContent":["import { Fx } from \"@robelest/fx\";\nimport { Cv } from \"@robelest/fx/convex\";\nimport type { GenericActionCtx, GenericDataModel } from \"convex/server\";\nimport { Infer, v } from \"convex/values\";\n\nimport * as Provider from \"../crypto\";\nimport { authDb } from \"../db\";\nimport { getAuthSessionId } from \"../sessions\";\nimport { Doc, MutationCtx } from \"../types\";\nimport { ConvexCredentialsConfig } from \"../types\";\nimport { upsertUserAndAccount } from \"../users\";\nimport { LOG_LEVELS, logWithLevel, maybeRedact } from \"../utils\";\nimport { AUTH_STORE_REF } from \"./store/refs\";\n\nexport const createAccountFromCredentialsArgs = v.object({\n provider: v.string(),\n account: v.object({ id: v.string(), secret: v.optional(v.string()) }),\n profile: v.any(),\n shouldLinkViaEmail: v.optional(v.boolean()),\n shouldLinkViaPhone: v.optional(v.boolean()),\n});\n\ntype ReturnType = { account: Doc<\"Account\">; user: Doc<\"User\"> };\n\nexport async function createAccountFromCredentialsImpl(\n ctx: MutationCtx,\n args: Infer<typeof createAccountFromCredentialsArgs>,\n getProviderOrThrow: Provider.GetProviderOrThrowFunc,\n config: Provider.Config,\n): Promise<ReturnType> {\n logWithLevel(LOG_LEVELS.DEBUG, \"createAccountFromCredentialsImpl args:\", {\n provider: args.provider,\n account: {\n id: args.account.id,\n secret: maybeRedact(args.account.secret ?? \"\"),\n },\n });\n\n const {\n provider: providerId,\n account,\n profile,\n shouldLinkViaEmail,\n shouldLinkViaPhone,\n } = args;\n const db = authDb(ctx, config);\n const provider = getProviderOrThrow(providerId) as ConvexCredentialsConfig;\n\n return Fx.run(\n Fx.gen(function* () {\n const existingAccount = yield* Fx.promise(\n () =>\n db.accounts.get(\n provider.id,\n account.id,\n ) as Promise<Doc<\"Account\"> | null>,\n );\n\n if (existingAccount !== null) {\n if (account.secret !== undefined) {\n const valid = yield* Provider.verify(\n provider,\n account.secret,\n existingAccount.secret ?? \"\",\n );\n if (!valid) {\n return yield* Cv.fail({\n code: \"ACCOUNT_ALREADY_EXISTS\",\n message: `Account ${account.id} already exists`,\n });\n }\n }\n\n const user = yield* Fx.promise(\n () =>\n db.users.getById(\n existingAccount.userId,\n ) as Promise<Doc<\"User\"> | null>,\n );\n if (user === null) {\n return yield* Cv.fail({\n code: \"ACCOUNT_NOT_FOUND\",\n message: `Linked user for account ${account.id} was not found.`,\n });\n }\n\n return { account: existingAccount, user };\n }\n\n const secret =\n account.secret !== undefined\n ? yield* Provider.hash(provider, account.secret)\n : undefined;\n\n const result = yield* Fx.promise(async () =>\n upsertUserAndAccount(\n ctx,\n await getAuthSessionId(ctx),\n { providerAccountId: account.id, secret },\n {\n type: \"credentials\",\n provider,\n profile,\n shouldLinkViaEmail,\n shouldLinkViaPhone,\n },\n config,\n ),\n );\n\n const { userId, accountId } = result as {\n userId: string;\n accountId: string;\n };\n const [createdAccount, createdUser] = yield* Fx.zip(\n Fx.promise(\n () =>\n db.accounts.getById(accountId) as Promise<Doc<\"Account\"> | null>,\n ),\n Fx.promise(\n () => db.users.getById(userId) as Promise<Doc<\"User\"> | null>,\n ),\n );\n\n if (createdAccount === null) {\n return yield* Cv.fail({\n code: \"ACCOUNT_NOT_FOUND\",\n message: `Created account was not found.`,\n });\n }\n if (createdUser === null) {\n return yield* Cv.fail({\n code: \"USER_UPDATE_FAILED\",\n message: `Created user was not found.`,\n });\n }\n\n return { account: createdAccount, user: createdUser };\n }),\n ) as Promise<ReturnType>;\n}\n\nexport const callCreateAccountFromCredentials = async <\n DataModel extends GenericDataModel,\n>(\n ctx: GenericActionCtx<DataModel>,\n args: Infer<typeof createAccountFromCredentialsArgs>,\n): Promise<ReturnType> => {\n return ctx.runMutation(AUTH_STORE_REF, {\n args: {\n type: \"createAccountFromCredentials\",\n ...args,\n },\n });\n};\n"],"mappings":";;;;;;;;;;;AAcA,MAAa,mCAAmC,EAAE,OAAO;CACvD,UAAU,EAAE,QAAQ;CACpB,SAAS,EAAE,OAAO;EAAE,IAAI,EAAE,QAAQ;EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;EAAE,CAAC;CACrE,SAAS,EAAE,KAAK;CAChB,oBAAoB,EAAE,SAAS,EAAE,SAAS,CAAC;CAC3C,oBAAoB,EAAE,SAAS,EAAE,SAAS,CAAC;CAC5C,CAAC;AAIF,eAAsB,iCACpB,KACA,MACA,oBACA,QACqB;AACrB,cAAa,WAAW,OAAO,0CAA0C;EACvE,UAAU,KAAK;EACf,SAAS;GACP,IAAI,KAAK,QAAQ;GACjB,QAAQ,YAAY,KAAK,QAAQ,UAAU,GAAG;GAC/C;EACF,CAAC;CAEF,MAAM,EACJ,UAAU,YACV,SACA,SACA,oBACA,uBACE;CACJ,MAAM,KAAK,OAAO,KAAK,OAAO;CAC9B,MAAM,WAAW,mBAAmB,WAAW;AAE/C,QAAO,GAAG,IACR,GAAG,IAAI,aAAa;EAClB,MAAM,kBAAkB,OAAO,GAAG,cAE9B,GAAG,SAAS,IACV,SAAS,IACT,QAAQ,GACT,CACJ;AAED,MAAI,oBAAoB,MAAM;AAC5B,OAAI,QAAQ,WAAW,QAMrB;QAAI,EALU,OAAOA,OACnB,UACA,QAAQ,QACR,gBAAgB,UAAU,GAC3B,EAEC,QAAO,OAAO,GAAG,KAAK;KACpB,MAAM;KACN,SAAS,WAAW,QAAQ,GAAG;KAChC,CAAC;;GAIN,MAAM,OAAO,OAAO,GAAG,cAEnB,GAAG,MAAM,QACP,gBAAgB,OACjB,CACJ;AACD,OAAI,SAAS,KACX,QAAO,OAAO,GAAG,KAAK;IACpB,MAAM;IACN,SAAS,2BAA2B,QAAQ,GAAG;IAChD,CAAC;AAGJ,UAAO;IAAE,SAAS;IAAiB;IAAM;;EAG3C,MAAM,SACJ,QAAQ,WAAW,SACf,OAAOC,KAAc,UAAU,QAAQ,OAAO,GAC9C;EAkBN,MAAM,EAAE,QAAQ,cAhBD,OAAO,GAAG,QAAQ,YAC/B,qBACE,KACA,MAAM,iBAAiB,IAAI,EAC3B;GAAE,mBAAmB,QAAQ;GAAI;GAAQ,EACzC;GACE,MAAM;GACN;GACA;GACA;GACA;GACD,EACD,OACD,CACF;EAMD,MAAM,CAAC,gBAAgB,eAAe,OAAO,GAAG,IAC9C,GAAG,cAEC,GAAG,SAAS,QAAQ,UAAU,CACjC,EACD,GAAG,cACK,GAAG,MAAM,QAAQ,OAAO,CAC/B,CACF;AAED,MAAI,mBAAmB,KACrB,QAAO,OAAO,GAAG,KAAK;GACpB,MAAM;GACN,SAAS;GACV,CAAC;AAEJ,MAAI,gBAAgB,KAClB,QAAO,OAAO,GAAG,KAAK;GACpB,MAAM;GACN,SAAS;GACV,CAAC;AAGJ,SAAO;GAAE,SAAS;GAAgB,MAAM;GAAa;GACrD,CACH;;AAGH,MAAa,mCAAmC,OAG9C,KACA,SACwB;AACxB,QAAO,IAAI,YAAY,gBAAgB,EACrC,MAAM;EACJ,MAAM;EACN,GAAG;EACJ,EACF,CAAC"}
|
|
@@ -2,24 +2,24 @@ import { Doc, MutationCtx } from "../types.js";
|
|
|
2
2
|
import { Config, GetProviderOrThrowFunc } from "../crypto.js";
|
|
3
3
|
import { Fx } from "@robelest/fx";
|
|
4
4
|
import { GenericActionCtx, GenericDataModel } from "convex/server";
|
|
5
|
-
import * as
|
|
5
|
+
import * as convex_values108 from "convex/values";
|
|
6
6
|
import { Infer } from "convex/values";
|
|
7
7
|
|
|
8
8
|
//#region src/server/mutations/retrieve.d.ts
|
|
9
|
-
declare const retrieveAccountWithCredentialsArgs:
|
|
9
|
+
declare const retrieveAccountWithCredentialsArgs: convex_values108.VObject<{
|
|
10
10
|
provider: string;
|
|
11
11
|
account: {
|
|
12
12
|
secret?: string | undefined;
|
|
13
13
|
id: string;
|
|
14
14
|
};
|
|
15
15
|
}, {
|
|
16
|
-
provider:
|
|
17
|
-
account:
|
|
16
|
+
provider: convex_values108.VString<string, "required">;
|
|
17
|
+
account: convex_values108.VObject<{
|
|
18
18
|
secret?: string | undefined;
|
|
19
19
|
id: string;
|
|
20
20
|
}, {
|
|
21
|
-
id:
|
|
22
|
-
secret:
|
|
21
|
+
id: convex_values108.VString<string, "required">;
|
|
22
|
+
secret: convex_values108.VString<string | undefined, "optional">;
|
|
23
23
|
}, "required", "id" | "secret">;
|
|
24
24
|
}, "required", "provider" | "account" | "account.id" | "account.secret">;
|
|
25
25
|
type ReturnType = "InvalidAccountId" | "TooManyFailedAttempts" | "InvalidSecret" | {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrieve.d.ts","names":[],"sources":["../../../src/server/mutations/retrieve.ts"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"retrieve.d.ts","names":[],"sources":["../../../src/server/mutations/retrieve.ts"],"mappings":";;;;;;;;cAea,kCAAA,mBAAkC,OAAA;;;;;;;YAG7C,gBAAA,CAAA,OAAA;;;;;;;;;KAEG,UAAA;EAIC,OAAA,EAAS,GAAA;EAAgB,IAAA,EAAM,GAAA;AAAA;AAAA,iBAErB,kCAAA,CACd,GAAA,EAAK,WAAA,EACL,IAAA,EAAM,KAAA,QAAa,kCAAA,GACnB,kBAAA,EAAoB,sBAAA,EACpB,MAAA,EAAQ,MAAA,GACP,EAAA,CAAG,UAAA;AAAA,cAiEO,kCAAA,qBACO,gBAAA,EAElB,GAAA,EAAK,gBAAA,CAAiB,SAAA,GACtB,IAAA,EAAM,KAAA,QAAa,kCAAA,MAClB,OAAA,CAAQ,UAAA"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { AuthError } from "../authError.js";
|
|
2
1
|
import { LOG_LEVELS, logWithLevel, maybeRedact } from "../utils.js";
|
|
3
|
-
import { authDb } from "../db.js";
|
|
4
2
|
import { verify } from "../crypto.js";
|
|
3
|
+
import { authDb } from "../db.js";
|
|
5
4
|
import { AUTH_STORE_REF } from "./store/refs.js";
|
|
6
5
|
import { isSignInRateLimited, recordFailedSignIn, resetSignInRateLimit } from "../limits.js";
|
|
7
6
|
import { Fx } from "@robelest/fx";
|
|
@@ -25,29 +24,26 @@ function retrieveAccountWithCredentialsImpl(ctx, args, getProviderOrThrow, confi
|
|
|
25
24
|
secret: maybeRedact(account.secret ?? "")
|
|
26
25
|
}
|
|
27
26
|
});
|
|
28
|
-
return Fx.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if (
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
return "InvalidSecret";
|
|
37
|
-
}
|
|
38
|
-
await Fx.run(resetSignInRateLimit(ctx, existingAccount._id, config));
|
|
39
|
-
}
|
|
40
|
-
const user = await db.users.getById(existingAccount.userId);
|
|
41
|
-
if (user === null) {
|
|
42
|
-
logWithLevel(LOG_LEVELS.ERROR, `Account ${existingAccount._id} is linked to missing user ${existingAccount.userId}`);
|
|
43
|
-
return "InvalidAccountId";
|
|
27
|
+
return Fx.gen(function* () {
|
|
28
|
+
const existingAccount = yield* Fx.promise(() => db.accounts.get(providerId, account.id));
|
|
29
|
+
if (existingAccount === null) return "InvalidAccountId";
|
|
30
|
+
if (account.secret !== void 0) {
|
|
31
|
+
if (yield* isSignInRateLimited(ctx, existingAccount._id, config)) return "TooManyFailedAttempts";
|
|
32
|
+
if (!(yield* verify(getProviderOrThrow(providerId), account.secret, existingAccount.secret ?? ""))) {
|
|
33
|
+
yield* recordFailedSignIn(ctx, existingAccount._id, config);
|
|
34
|
+
return "InvalidSecret";
|
|
44
35
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
36
|
+
yield* resetSignInRateLimit(ctx, existingAccount._id, config);
|
|
37
|
+
}
|
|
38
|
+
const user = yield* Fx.promise(() => db.users.getById(existingAccount.userId));
|
|
39
|
+
if (user === null) {
|
|
40
|
+
logWithLevel(LOG_LEVELS.ERROR, `Account ${existingAccount._id} is linked to missing user ${existingAccount.userId}`);
|
|
41
|
+
return "InvalidAccountId";
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
account: existingAccount,
|
|
45
|
+
user
|
|
46
|
+
};
|
|
51
47
|
}).pipe(Fx.fold({
|
|
52
48
|
ok: (v$1) => v$1,
|
|
53
49
|
err: () => "InvalidAccountId"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrieve.js","names":["Provider.verify","v"],"sources":["../../../src/server/mutations/retrieve.ts"],"sourcesContent":["import { Fx } from \"@robelest/fx\";\nimport type { GenericActionCtx, GenericDataModel } from \"convex/server\";\nimport { Infer, v } from \"convex/values\";\n\nimport
|
|
1
|
+
{"version":3,"file":"retrieve.js","names":["Provider.verify","v"],"sources":["../../../src/server/mutations/retrieve.ts"],"sourcesContent":["import { Fx } from \"@robelest/fx\";\nimport type { GenericActionCtx, GenericDataModel } from \"convex/server\";\nimport { Infer, v } from \"convex/values\";\n\nimport * as Provider from \"../crypto\";\nimport { authDb } from \"../db\";\nimport {\n isSignInRateLimited,\n recordFailedSignIn,\n resetSignInRateLimit,\n} from \"../limits\";\nimport { Doc, MutationCtx } from \"../types\";\nimport { LOG_LEVELS, logWithLevel, maybeRedact } from \"../utils\";\nimport { AUTH_STORE_REF } from \"./store/refs\";\n\nexport const retrieveAccountWithCredentialsArgs = v.object({\n provider: v.string(),\n account: v.object({ id: v.string(), secret: v.optional(v.string()) }),\n});\n\ntype ReturnType =\n | \"InvalidAccountId\"\n | \"TooManyFailedAttempts\"\n | \"InvalidSecret\"\n | { account: Doc<\"Account\">; user: Doc<\"User\"> };\n\nexport function retrieveAccountWithCredentialsImpl(\n ctx: MutationCtx,\n args: Infer<typeof retrieveAccountWithCredentialsArgs>,\n getProviderOrThrow: Provider.GetProviderOrThrowFunc,\n config: Provider.Config,\n): Fx<ReturnType> {\n const { provider: providerId, account } = args;\n const db = authDb(ctx, config);\n\n logWithLevel(LOG_LEVELS.DEBUG, \"retrieveAccountWithCredentialsImpl args:\", {\n provider: providerId,\n account: { id: account.id, secret: maybeRedact(account.secret ?? \"\") },\n });\n\n return Fx.gen(function* () {\n const existingAccount = yield* Fx.promise(\n () =>\n db.accounts.get(\n providerId,\n account.id,\n ) as Promise<Doc<\"Account\"> | null>,\n );\n if (existingAccount === null) {\n return \"InvalidAccountId\" as const;\n }\n\n if (account.secret !== undefined) {\n const limited = yield* isSignInRateLimited(\n ctx,\n existingAccount._id,\n config,\n );\n if (limited) {\n return \"TooManyFailedAttempts\" as const;\n }\n\n const valid = yield* Provider.verify(\n getProviderOrThrow(providerId),\n account.secret,\n existingAccount.secret ?? \"\",\n );\n if (!valid) {\n yield* recordFailedSignIn(ctx, existingAccount._id, config);\n return \"InvalidSecret\" as const;\n }\n\n yield* resetSignInRateLimit(ctx, existingAccount._id, config);\n }\n\n const user = yield* Fx.promise(\n () =>\n db.users.getById(existingAccount.userId) as Promise<Doc<\"User\"> | null>,\n );\n if (user === null) {\n logWithLevel(\n LOG_LEVELS.ERROR,\n `Account ${existingAccount._id} is linked to missing user ${existingAccount.userId}`,\n );\n return \"InvalidAccountId\" as const;\n }\n\n return { account: existingAccount, user } as ReturnType;\n }).pipe(\n Fx.fold({\n ok: (v) => v as ReturnType,\n err: () => \"InvalidAccountId\" as ReturnType,\n }),\n );\n}\n\nexport const callRetrieveAccountWithCredentials = async <\n DataModel extends GenericDataModel,\n>(\n ctx: GenericActionCtx<DataModel>,\n args: Infer<typeof retrieveAccountWithCredentialsArgs>,\n): Promise<ReturnType> => {\n return ctx.runMutation(AUTH_STORE_REF, {\n args: {\n type: \"retrieveAccountWithCredentials\",\n ...args,\n },\n });\n};\n"],"mappings":";;;;;;;;;AAeA,MAAa,qCAAqC,EAAE,OAAO;CACzD,UAAU,EAAE,QAAQ;CACpB,SAAS,EAAE,OAAO;EAAE,IAAI,EAAE,QAAQ;EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;EAAE,CAAC;CACtE,CAAC;AAQF,SAAgB,mCACd,KACA,MACA,oBACA,QACgB;CAChB,MAAM,EAAE,UAAU,YAAY,YAAY;CAC1C,MAAM,KAAK,OAAO,KAAK,OAAO;AAE9B,cAAa,WAAW,OAAO,4CAA4C;EACzE,UAAU;EACV,SAAS;GAAE,IAAI,QAAQ;GAAI,QAAQ,YAAY,QAAQ,UAAU,GAAG;GAAE;EACvE,CAAC;AAEF,QAAO,GAAG,IAAI,aAAa;EACzB,MAAM,kBAAkB,OAAO,GAAG,cAE9B,GAAG,SAAS,IACV,YACA,QAAQ,GACT,CACJ;AACD,MAAI,oBAAoB,KACtB,QAAO;AAGT,MAAI,QAAQ,WAAW,QAAW;AAMhC,OALgB,OAAO,oBACrB,KACA,gBAAgB,KAChB,OACD,CAEC,QAAO;AAQT,OAAI,EALU,OAAOA,OACnB,mBAAmB,WAAW,EAC9B,QAAQ,QACR,gBAAgB,UAAU,GAC3B,GACW;AACV,WAAO,mBAAmB,KAAK,gBAAgB,KAAK,OAAO;AAC3D,WAAO;;AAGT,UAAO,qBAAqB,KAAK,gBAAgB,KAAK,OAAO;;EAG/D,MAAM,OAAO,OAAO,GAAG,cAEnB,GAAG,MAAM,QAAQ,gBAAgB,OAAO,CAC3C;AACD,MAAI,SAAS,MAAM;AACjB,gBACE,WAAW,OACX,WAAW,gBAAgB,IAAI,6BAA6B,gBAAgB,SAC7E;AACD,UAAO;;AAGT,SAAO;GAAE,SAAS;GAAiB;GAAM;GACzC,CAAC,KACD,GAAG,KAAK;EACN,KAAK,QAAMC;EACX,WAAW;EACZ,CAAC,CACH;;AAGH,MAAa,qCAAqC,OAGhD,KACA,SACwB;AACxB,QAAO,IAAI,YAAY,gBAAgB,EACrC,MAAM;EACJ,MAAM;EACN,GAAG;EACJ,EACF,CAAC"}
|
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
import { MutationCtx } from "../types.js";
|
|
2
|
-
import { AuthError } from "../authError.js";
|
|
3
2
|
import { Config } from "../crypto.js";
|
|
4
3
|
import { Fx } from "@robelest/fx";
|
|
5
4
|
import { GenericActionCtx, GenericDataModel } from "convex/server";
|
|
6
|
-
import * as
|
|
7
|
-
import { Infer } from "convex/values";
|
|
5
|
+
import * as convex_values97 from "convex/values";
|
|
6
|
+
import { ConvexError, Infer } from "convex/values";
|
|
8
7
|
|
|
9
8
|
//#region src/server/mutations/signature.d.ts
|
|
10
|
-
declare const verifierSignatureArgs:
|
|
9
|
+
declare const verifierSignatureArgs: convex_values97.VObject<{
|
|
11
10
|
verifier: string;
|
|
12
11
|
signature: string;
|
|
13
12
|
}, {
|
|
14
|
-
verifier:
|
|
15
|
-
signature:
|
|
13
|
+
verifier: convex_values97.VString<string, "required">;
|
|
14
|
+
signature: convex_values97.VString<string, "required">;
|
|
16
15
|
}, "required", "verifier" | "signature">;
|
|
17
16
|
type ReturnType = void;
|
|
18
|
-
declare function verifierSignatureImpl(ctx: MutationCtx, args: Infer<typeof verifierSignatureArgs>, config: Config): Fx<ReturnType,
|
|
17
|
+
declare function verifierSignatureImpl(ctx: MutationCtx, args: Infer<typeof verifierSignatureArgs>, config: Config): Fx<ReturnType, ConvexError<any>>;
|
|
19
18
|
declare const callVerifierSignature: <DataModel extends GenericDataModel>(ctx: GenericActionCtx<DataModel>, args: Infer<typeof verifierSignatureArgs>) => Promise<void>;
|
|
20
19
|
//#endregion
|
|
21
20
|
export { callVerifierSignature, verifierSignatureArgs, verifierSignatureImpl };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signature.d.ts","names":[],"sources":["../../../src/server/mutations/signature.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"signature.d.ts","names":[],"sources":["../../../src/server/mutations/signature.ts"],"mappings":";;;;;;;;cAUa,qBAAA,kBAAqB,OAAA;;;;YAGhC,eAAA,CAAA,OAAA;;;KAEG,UAAA;AAAA,iBAEW,qBAAA,CACd,GAAA,EAAK,WAAA,EACL,IAAA,EAAM,KAAA,QAAa,qBAAA,GACnB,MAAA,EAAQ,MAAA,GACP,EAAA,CAAG,UAAA,EAAY,WAAA;AAAA,cAyBL,qBAAA,qBAAiD,gBAAA,EAC5D,GAAA,EAAK,gBAAA,CAAiB,SAAA,GACtB,IAAA,EAAM,KAAA,QAAa,qBAAA,MAClB,OAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AuthError } from "../authError.js";
|
|
2
1
|
import { authDb } from "../db.js";
|
|
3
2
|
import { AUTH_STORE_REF } from "./store/refs.js";
|
|
4
3
|
import { Fx } from "@robelest/fx";
|
|
4
|
+
import { Cv } from "@robelest/fx/convex";
|
|
5
5
|
import { v } from "convex/values";
|
|
6
6
|
|
|
7
7
|
//#region src/server/mutations/signature.ts
|
|
@@ -15,8 +15,14 @@ function verifierSignatureImpl(ctx, args, config) {
|
|
|
15
15
|
const db = authDb(ctx, config);
|
|
16
16
|
const verifierDoc = yield* Fx.from({
|
|
17
17
|
ok: () => db.verifiers.getById(verifier),
|
|
18
|
-
err: () =>
|
|
19
|
-
|
|
18
|
+
err: () => Cv.error({
|
|
19
|
+
code: "INVALID_VERIFIER",
|
|
20
|
+
message: "Invalid or expired verifier."
|
|
21
|
+
})
|
|
22
|
+
}).pipe(Fx.chain((doc) => doc === null ? Cv.fail({
|
|
23
|
+
code: "INVALID_VERIFIER",
|
|
24
|
+
message: "Invalid or expired verifier."
|
|
25
|
+
}) : Fx.succeed(doc)));
|
|
20
26
|
yield* Fx.promise(() => db.verifiers.patch(verifierDoc._id, { signature }));
|
|
21
27
|
});
|
|
22
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signature.js","names":[],"sources":["../../../src/server/mutations/signature.ts"],"sourcesContent":["import { Fx } from \"@robelest/fx\";\nimport type { GenericActionCtx, GenericDataModel } from \"convex/server\";\nimport { GenericId, Infer, v } from \"convex/values\";\n\nimport
|
|
1
|
+
{"version":3,"file":"signature.js","names":[],"sources":["../../../src/server/mutations/signature.ts"],"sourcesContent":["import { Fx } from \"@robelest/fx\";\nimport { Cv } from \"@robelest/fx/convex\";\nimport type { GenericActionCtx, GenericDataModel } from \"convex/server\";\nimport { ConvexError, GenericId, Infer, v } from \"convex/values\";\n\nimport * as Provider from \"../crypto\";\nimport { authDb } from \"../db\";\nimport { MutationCtx } from \"../types\";\nimport { AUTH_STORE_REF } from \"./store/refs\";\n\nexport const verifierSignatureArgs = v.object({\n verifier: v.string(),\n signature: v.string(),\n});\n\ntype ReturnType = void;\n\nexport function verifierSignatureImpl(\n ctx: MutationCtx,\n args: Infer<typeof verifierSignatureArgs>,\n config: Provider.Config,\n): Fx<ReturnType, ConvexError<any>> {\n return Fx.gen(function* () {\n const { verifier, signature } = args;\n const db = authDb(ctx, config);\n const verifierDoc = yield* Fx.from({\n ok: () => db.verifiers.getById(verifier as GenericId<\"AuthVerifier\">),\n err: () =>\n Cv.error({\n code: \"INVALID_VERIFIER\",\n message: \"Invalid or expired verifier.\",\n }),\n }).pipe(\n Fx.chain((doc) =>\n doc === null\n ? Cv.fail({\n code: \"INVALID_VERIFIER\",\n message: \"Invalid or expired verifier.\",\n })\n : Fx.succeed(doc),\n ),\n );\n yield* Fx.promise(() => db.verifiers.patch(verifierDoc._id, { signature }));\n });\n}\n\nexport const callVerifierSignature = async <DataModel extends GenericDataModel>(\n ctx: GenericActionCtx<DataModel>,\n args: Infer<typeof verifierSignatureArgs>,\n): Promise<void> => {\n return ctx.runMutation(AUTH_STORE_REF, {\n args: {\n type: \"verifierSignature\",\n ...args,\n },\n });\n};\n"],"mappings":";;;;;;;AAUA,MAAa,wBAAwB,EAAE,OAAO;CAC5C,UAAU,EAAE,QAAQ;CACpB,WAAW,EAAE,QAAQ;CACtB,CAAC;AAIF,SAAgB,sBACd,KACA,MACA,QACkC;AAClC,QAAO,GAAG,IAAI,aAAa;EACzB,MAAM,EAAE,UAAU,cAAc;EAChC,MAAM,KAAK,OAAO,KAAK,OAAO;EAC9B,MAAM,cAAc,OAAO,GAAG,KAAK;GACjC,UAAU,GAAG,UAAU,QAAQ,SAAsC;GACrE,WACE,GAAG,MAAM;IACP,MAAM;IACN,SAAS;IACV,CAAC;GACL,CAAC,CAAC,KACD,GAAG,OAAO,QACR,QAAQ,OACJ,GAAG,KAAK;GACN,MAAM;GACN,SAAS;GACV,CAAC,GACF,GAAG,QAAQ,IAAI,CACpB,CACF;AACD,SAAO,GAAG,cAAc,GAAG,UAAU,MAAM,YAAY,KAAK,EAAE,WAAW,CAAC,CAAC;GAC3E;;AAGJ,MAAa,wBAAwB,OACnC,KACA,SACkB;AAClB,QAAO,IAAI,YAAY,gBAAgB,EACrC,MAAM;EACJ,MAAM;EACN,GAAG;EACJ,EACF,CAAC"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { MutationCtx, SessionInfo } from "../types.js";
|
|
2
2
|
import { Config } from "../crypto.js";
|
|
3
3
|
import { GenericActionCtx, GenericDataModel } from "convex/server";
|
|
4
|
-
import * as
|
|
4
|
+
import * as convex_values104 from "convex/values";
|
|
5
5
|
import { Infer } from "convex/values";
|
|
6
6
|
|
|
7
7
|
//#region src/server/mutations/signin.d.ts
|
|
8
|
-
declare const signInArgs:
|
|
8
|
+
declare const signInArgs: convex_values104.VObject<{
|
|
9
9
|
sessionId?: string | undefined;
|
|
10
10
|
userId: string;
|
|
11
11
|
generateTokens: boolean;
|
|
12
12
|
}, {
|
|
13
|
-
userId:
|
|
14
|
-
sessionId:
|
|
15
|
-
generateTokens:
|
|
13
|
+
userId: convex_values104.VString<string, "required">;
|
|
14
|
+
sessionId: convex_values104.VString<string | undefined, "optional">;
|
|
15
|
+
generateTokens: convex_values104.VBoolean<boolean, "required">;
|
|
16
16
|
}, "required", "userId" | "sessionId" | "generateTokens">;
|
|
17
17
|
type ReturnType = SessionInfo;
|
|
18
18
|
declare function signInImpl(ctx: MutationCtx, args: Infer<typeof signInArgs>, config: Config): Promise<ReturnType>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signin.d.ts","names":[],"sources":["../../../src/server/mutations/signin.ts"],"mappings":";;;;;;;cAYa,UAAA,
|
|
1
|
+
{"version":3,"file":"signin.d.ts","names":[],"sources":["../../../src/server/mutations/signin.ts"],"mappings":";;;;;;;cAYa,UAAA,mBAAU,OAAA;;;;;UAIrB,gBAAA,CAAA,OAAA;;;;KAEG,UAAA,GAAa,WAAA;AAAA,iBAEI,UAAA,CACpB,GAAA,EAAK,WAAA,EACL,IAAA,EAAM,KAAA,QAAa,UAAA,GACnB,MAAA,EAAQ,MAAA,GACP,OAAA,CAAQ,UAAA;AAAA,cAmBE,UAAA,qBAAsC,gBAAA,EACjD,GAAA,EAAK,gBAAA,CAAiB,SAAA,GACtB,IAAA,EAAM,KAAA,QAAa,UAAA,MAClB,OAAA,CAAQ,UAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signout.js","names":[],"sources":["../../../src/server/mutations/signout.ts"],"sourcesContent":["import { Fx } from \"@robelest/fx\";\nimport type { GenericActionCtx, GenericDataModel } from \"convex/server\";\nimport { GenericId } from \"convex/values\";\n\nimport
|
|
1
|
+
{"version":3,"file":"signout.js","names":[],"sources":["../../../src/server/mutations/signout.ts"],"sourcesContent":["import { Fx } from \"@robelest/fx\";\nimport type { GenericActionCtx, GenericDataModel } from \"convex/server\";\nimport { GenericId } from \"convex/values\";\n\nimport * as Provider from \"../crypto\";\nimport { authDb } from \"../db\";\nimport { deleteSession, getAuthSessionId } from \"../sessions\";\nimport { MutationCtx } from \"../types\";\nimport { AUTH_STORE_REF } from \"./store/refs\";\n\ntype ReturnType = {\n userId: GenericId<\"User\">;\n sessionId: GenericId<\"Session\">;\n} | null;\n\nexport function signOutImpl(\n ctx: MutationCtx,\n config: Provider.Config,\n): Fx<ReturnType, never> {\n return Fx.gen(function* () {\n const db = authDb(ctx, config);\n const sessionId = yield* Fx.promise(() => getAuthSessionId(ctx));\n if (sessionId === null) {\n return null;\n }\n const session = yield* Fx.promise(() => db.sessions.getById(sessionId));\n if (session === null) {\n return null;\n }\n yield* Fx.promise(() => deleteSession(ctx, session, config));\n return { userId: session.userId, sessionId: session._id };\n });\n}\n\nexport const callSignOut = async <DataModel extends GenericDataModel>(\n ctx: GenericActionCtx<DataModel>,\n): Promise<void> => {\n return ctx.runMutation(AUTH_STORE_REF, {\n args: {\n type: \"signOut\",\n },\n });\n};\n"],"mappings":";;;;;;AAeA,SAAgB,YACd,KACA,QACuB;AACvB,QAAO,GAAG,IAAI,aAAa;EACzB,MAAM,KAAK,OAAO,KAAK,OAAO;EAC9B,MAAM,YAAY,OAAO,GAAG,cAAc,iBAAiB,IAAI,CAAC;AAChE,MAAI,cAAc,KAChB,QAAO;EAET,MAAM,UAAU,OAAO,GAAG,cAAc,GAAG,SAAS,QAAQ,UAAU,CAAC;AACvE,MAAI,YAAY,KACd,QAAO;AAET,SAAO,GAAG,cAAc,cAAc,KAAK,SAAS,OAAO,CAAC;AAC5D,SAAO;GAAE,QAAQ,QAAQ;GAAQ,WAAW,QAAQ;GAAK;GACzD;;AAGJ,MAAa,cAAc,OACzB,QACkB;AAClB,QAAO,IAAI,YAAY,gBAAgB,EACrC,MAAM,EACJ,MAAM,WACP,EACF,CAAC"}
|