@estifanos-sh/convex-auth 0.0.2 → 0.0.3
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/README.md +5 -5
- package/dist/_generated/component.d.ts +130 -61
- package/dist/_generated/component.d.ts.map +1 -1
- package/dist/_generated/dataModel.d.ts +28 -0
- package/dist/_generated/dataModel.d.ts.map +1 -0
- package/dist/bin.js +1 -2
- package/dist/browser/index.d.ts +2 -2
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/client/core/types.d.ts +40 -79
- package/dist/client/core/types.d.ts.map +1 -1
- package/dist/client/core/types.js.map +1 -1
- package/dist/client/errors.d.ts +15 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +8 -1
- package/dist/client/errors.js.map +1 -1
- package/dist/client/index.d.ts +6 -3
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -2
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/component.d.ts +130 -61
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/_generated/dataModel.d.ts +1 -1
- package/dist/component/_generated/server.d.ts +1 -1
- package/dist/component/account.d.ts +43 -37
- package/dist/component/account.d.ts.map +1 -1
- package/dist/component/account.js +14 -16
- package/dist/component/account.js.map +1 -1
- package/dist/component/connection/audit.d.ts +29 -29
- package/dist/component/connection/audit.d.ts.map +1 -1
- package/dist/component/connection/audit.js +2 -1
- package/dist/component/connection/audit.js.map +1 -1
- package/dist/component/connection/cache.d.ts +6 -6
- package/dist/component/connection/domain/verification.d.ts +19 -19
- package/dist/component/connection/domain.d.ts +20 -20
- package/dist/component/connection/saml/assertion.d.ts +4 -4
- package/dist/component/connection/saml/request.d.ts +9 -9
- package/dist/component/connection/saml/request.d.ts.map +1 -1
- package/dist/component/connection/scim/config.d.ts +13 -13
- package/dist/component/connection/scim/identity.d.ts +102 -59
- package/dist/component/connection/scim/identity.d.ts.map +1 -1
- package/dist/component/connection/scim/identity.js +357 -56
- package/dist/component/connection/scim/identity.js.map +1 -1
- package/dist/component/connection/secret.d.ts +15 -15
- package/dist/component/connection/secret.d.ts.map +1 -1
- package/dist/component/connection/webhook/delivery.d.ts +69 -53
- package/dist/component/connection/webhook/delivery.d.ts.map +1 -1
- package/dist/component/connection/webhook/delivery.js +127 -170
- package/dist/component/connection/webhook/delivery.js.map +1 -1
- package/dist/component/connection/webhook/endpoint.d.ts +21 -21
- package/dist/component/connection/webhook/events.d.ts +26 -0
- package/dist/component/connection/webhook/events.d.ts.map +1 -0
- package/dist/component/connection/webhook/events.js +39 -0
- package/dist/component/connection/webhook/events.js.map +1 -0
- package/dist/component/connection.d.ts +38 -38
- package/dist/component/connection.d.ts.map +1 -1
- package/dist/component/context.d.ts +115 -0
- package/dist/component/context.d.ts.map +1 -0
- package/dist/component/context.js +50 -0
- package/dist/component/context.js.map +1 -0
- package/dist/component/convex.config.d.ts +2 -2
- package/dist/component/crons.d.ts +2 -2
- package/dist/component/event.d.ts +134 -138
- package/dist/component/event.d.ts.map +1 -1
- package/dist/component/event.js +88 -117
- package/dist/component/event.js.map +1 -1
- package/dist/component/eventstream.d.ts +30 -0
- package/dist/component/eventstream.d.ts.map +1 -0
- package/dist/component/eventstream.js +51 -0
- package/dist/component/eventstream.js.map +1 -0
- package/dist/component/factor/device.d.ts +25 -24
- package/dist/component/factor/device.d.ts.map +1 -1
- package/dist/component/factor/device.js +5 -2
- package/dist/component/factor/device.js.map +1 -1
- package/dist/component/factor/passkey.d.ts +84 -75
- package/dist/component/factor/passkey.d.ts.map +1 -1
- package/dist/component/factor/passkey.js +6 -6
- package/dist/component/factor/passkey.js.map +1 -1
- package/dist/component/factor/totp.d.ts +54 -49
- package/dist/component/factor/totp.d.ts.map +1 -1
- package/dist/component/factor/totp.js +3 -3
- package/dist/component/factor/totp.js.map +1 -1
- package/dist/component/group/active.d.ts +326 -22
- package/dist/component/group/active.d.ts.map +1 -1
- package/dist/component/group/active.js +21 -11
- package/dist/component/group/active.js.map +1 -1
- package/dist/component/group/invite.d.ts +28 -28
- package/dist/component/group/invite.d.ts.map +1 -1
- package/dist/component/group/member.d.ts +34 -34
- package/dist/component/group.d.ts +47 -62
- package/dist/component/group.d.ts.map +1 -1
- package/dist/component/http.d.ts +2 -2
- package/dist/component/limits.d.ts +4 -4
- package/dist/component/maintenance.d.ts +2 -2
- package/dist/component/model.d.ts +1362 -1027
- package/dist/component/model.d.ts.map +1 -1
- package/dist/component/model.js +23 -6
- package/dist/component/model.js.map +1 -1
- package/dist/component/modules.d.ts +8 -2
- package/dist/component/modules.d.ts.map +1 -1
- package/dist/component/modules.js +3 -0
- package/dist/component/modules.js.map +1 -1
- package/dist/component/oauth/client.d.ts +20 -20
- package/dist/component/oauth/code.d.ts +14 -14
- package/dist/component/oauth/refresh.d.ts +19 -19
- package/dist/component/schema.d.ts +1100 -611
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +17 -4
- package/dist/component/schema.js.map +1 -1
- package/dist/component/session.d.ts +72 -32
- package/dist/component/session.d.ts.map +1 -1
- package/dist/component/session.js +120 -32
- package/dist/component/session.js.map +1 -1
- package/dist/component/token/continuation.d.ts +40 -18
- package/dist/component/token/continuation.d.ts.map +1 -1
- package/dist/component/token/continuation.js +57 -11
- package/dist/component/token/continuation.js.map +1 -1
- package/dist/component/token/pkce.d.ts +22 -22
- package/dist/component/token/pkce.d.ts.map +1 -1
- package/dist/component/token/refresh.d.ts +39 -35
- package/dist/component/token/refresh.d.ts.map +1 -1
- package/dist/component/token/refresh.js +11 -6
- package/dist/component/token/refresh.js.map +1 -1
- package/dist/component/token/verification.d.ts +36 -32
- package/dist/component/token/verification.d.ts.map +1 -1
- package/dist/component/token/verification.js +3 -3
- package/dist/component/token/verification.js.map +1 -1
- package/dist/component/user/email.d.ts +21 -21
- package/dist/component/user/key.d.ts +35 -35
- package/dist/component/user/key.d.ts.map +1 -1
- package/dist/component/user.d.ts +51 -45
- package/dist/component/user.d.ts.map +1 -1
- package/dist/core/index.d.ts +54 -90
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -4
- package/dist/core/index.js.map +1 -1
- package/dist/expo/index.d.ts +3 -3
- package/dist/expo/index.d.ts.map +1 -1
- package/dist/expo/index.js.map +1 -1
- package/dist/model.js.map +1 -1
- package/dist/providers/anonymous.d.ts +11 -5
- package/dist/providers/anonymous.d.ts.map +1 -1
- package/dist/providers/anonymous.js +4 -1
- package/dist/providers/anonymous.js.map +1 -1
- package/dist/providers/apple.d.ts +1 -1
- package/dist/providers/credentials.d.ts +21 -13
- package/dist/providers/credentials.d.ts.map +1 -1
- package/dist/providers/credentials.js +2 -0
- package/dist/providers/credentials.js.map +1 -1
- package/dist/providers/custom.d.ts +3 -3
- package/dist/providers/custom.d.ts.map +1 -1
- package/dist/providers/custom.js.map +1 -1
- package/dist/providers/email.d.ts +3 -3
- package/dist/providers/email.d.ts.map +1 -1
- package/dist/providers/email.js.map +1 -1
- package/dist/providers/github.d.ts +1 -1
- package/dist/providers/google.d.ts +1 -1
- package/dist/providers/microsoft.d.ts +1 -1
- package/dist/providers/password.d.ts +103 -8
- package/dist/providers/password.d.ts.map +1 -1
- package/dist/providers/password.js +71 -26
- package/dist/providers/password.js.map +1 -1
- package/dist/providers/phone.d.ts +4 -3
- package/dist/providers/phone.d.ts.map +1 -1
- package/dist/providers/phone.js.map +1 -1
- package/dist/react/index.d.ts +40 -41
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +27 -52
- package/dist/react/index.js.map +1 -1
- package/dist/server/auth.d.ts +157 -117
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +41 -22
- package/dist/server/auth.js.map +1 -1
- package/dist/server/component/factor/db.js +4 -4
- package/dist/server/component/factor/db.js.map +1 -1
- package/dist/server/config.d.ts +2 -1
- package/dist/server/connection/domain.d.ts +4 -66
- package/dist/server/connection/domain.d.ts.map +1 -1
- package/dist/server/connection/domain.js +22 -4
- package/dist/server/connection/domain.js.map +1 -1
- package/dist/server/connection/group/service.js +6 -4
- package/dist/server/connection/group/service.js.map +1 -1
- package/dist/server/connection/http.js +94 -261
- package/dist/server/connection/http.js.map +1 -1
- package/dist/server/connection/oidc.js +8 -17
- package/dist/server/connection/oidc.js.map +1 -1
- package/dist/server/connection/policy/domain.js +4 -1
- package/dist/server/connection/policy/domain.js.map +1 -1
- package/dist/server/connection/policy.js +14 -13
- package/dist/server/connection/policy.js.map +1 -1
- package/dist/server/connection/provision.js +5 -19
- package/dist/server/connection/provision.js.map +1 -1
- package/dist/server/connection/webhook.js +4 -36
- package/dist/server/connection/webhook.js.map +1 -1
- package/dist/server/context.d.ts +2 -2
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +35 -24
- package/dist/server/context.js.map +1 -1
- package/dist/server/contract.d.ts.map +1 -1
- package/dist/server/contract.js +6 -14
- package/dist/server/contract.js.map +1 -1
- package/dist/server/core.js +6 -0
- package/dist/server/core.js.map +1 -1
- package/dist/server/cors.d.ts +2 -2
- package/dist/server/cors.d.ts.map +1 -1
- package/dist/server/crypto.js.map +1 -1
- package/dist/server/db.js +2 -1
- package/dist/server/db.js.map +1 -1
- package/dist/server/domains/context.js +34 -0
- package/dist/server/domains/context.js.map +1 -0
- package/dist/server/domains/factor.d.ts +3 -2
- package/dist/server/domains/factor.d.ts.map +1 -1
- package/dist/server/domains/factor.js.map +1 -1
- package/dist/server/domains/group.js.map +1 -1
- package/dist/server/domains/invite.js.map +1 -1
- package/dist/server/domains/key.js.map +1 -1
- package/dist/server/domains/member.js.map +1 -1
- package/dist/server/domains/session.js.map +1 -1
- package/dist/server/domains/user.js.map +1 -1
- package/dist/server/env.js +2 -22
- package/dist/server/env.js.map +1 -1
- package/dist/server/events.d.ts +0 -1
- package/dist/server/events.d.ts.map +1 -1
- package/dist/server/events.js +6 -6
- package/dist/server/events.js.map +1 -1
- package/dist/server/http.d.ts +1 -0
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +4 -4
- package/dist/server/http.js.map +1 -1
- package/dist/server/identity/claims.js +1 -1
- package/dist/server/identity/convex.d.ts +2 -0
- package/dist/server/identity/convex.d.ts.map +1 -1
- package/dist/server/index.d.ts +2 -3
- package/dist/server/index.js +1 -2
- package/dist/server/limits.js +21 -1
- package/dist/server/limits.js.map +1 -1
- package/dist/server/mutations/credentials/signin.js +6 -3
- package/dist/server/mutations/credentials/signin.js.map +1 -1
- package/dist/server/mutations/invalidate.js +5 -10
- package/dist/server/mutations/invalidate.js.map +1 -1
- package/dist/server/mutations/oauth.js +1 -1
- package/dist/server/mutations/oauth.js.map +1 -1
- package/dist/server/mutations/retrieve.js +4 -1
- package/dist/server/mutations/retrieve.js.map +1 -1
- package/dist/server/mutations/signin.js +2 -2
- package/dist/server/mutations/signin.js.map +1 -1
- package/dist/server/mutations/verify.js +4 -3
- package/dist/server/mutations/verify.js.map +1 -1
- package/dist/server/oauth/factory.js.map +1 -1
- package/dist/server/runtime.d.ts +107 -127
- package/dist/server/runtime.d.ts.map +1 -1
- package/dist/server/runtime.js +43 -28
- package/dist/server/runtime.js.map +1 -1
- package/dist/server/session/lifecycle.d.ts.map +1 -1
- package/dist/server/session/lifecycle.js +18 -3
- package/dist/server/session/lifecycle.js.map +1 -1
- package/dist/server/signin/flow.js +1 -1
- package/dist/server/signin/flow.js.map +1 -1
- package/dist/server/tokens.js +1 -0
- package/dist/server/tokens.js.map +1 -1
- package/dist/server/totp.js +3 -3
- package/dist/server/totp.js.map +1 -1
- package/dist/server/types.d.ts +63 -43
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/user/account.js +0 -1
- package/dist/server/user/account.js.map +1 -1
- package/dist/server/validators.d.ts +874 -917
- package/dist/server/validators.d.ts.map +1 -1
- package/dist/server/validators.js +33 -32
- package/dist/server/validators.js.map +1 -1
- package/dist/server/webauthn.js +4 -4
- package/dist/server/webauthn.js.map +1 -1
- package/dist/shared/brand.d.ts +3 -7
- package/dist/shared/brand.d.ts.map +1 -1
- package/dist/shared/params.d.ts +78 -0
- package/dist/shared/params.d.ts.map +1 -0
- package/dist/shared/results.d.ts +7 -1
- package/dist/shared/results.d.ts.map +1 -1
- package/dist/svelte/context.svelte.d.ts +23 -12
- package/dist/svelte/context.svelte.d.ts.map +1 -1
- package/dist/svelte/context.svelte.js +20 -13
- package/dist/svelte/index.d.ts +1 -4
- package/dist/svelte/index.d.ts.map +1 -1
- package/dist/svelte/index.js +1 -4
- package/dist/test.d.ts +1105 -611
- package/dist/test.d.ts.map +1 -1
- package/package.json +2 -1
- package/dist/server/env.d.ts +0 -28
- package/dist/server/env.d.ts.map +0 -1
- package/dist/svelte/AuthLoading.svelte +0 -13
- package/dist/svelte/AuthLoading.svelte.d.ts +0 -8
- package/dist/svelte/AuthLoading.svelte.d.ts.map +0 -1
- package/dist/svelte/SignedIn.svelte +0 -14
- package/dist/svelte/SignedIn.svelte.d.ts +0 -8
- package/dist/svelte/SignedIn.svelte.d.ts.map +0 -1
- package/dist/svelte/SignedOut.svelte +0 -13
- package/dist/svelte/SignedOut.svelte.d.ts +0 -8
- package/dist/svelte/SignedOut.svelte.d.ts.map +0 -1
|
@@ -1,67 +1,73 @@
|
|
|
1
1
|
import { SessionRows } from "./session.js";
|
|
2
|
-
import * as
|
|
3
|
-
import * as
|
|
2
|
+
import * as convex_values2031 from "convex/values";
|
|
3
|
+
import * as convex_server105 from "convex/server";
|
|
4
4
|
|
|
5
5
|
//#region src/component/account.d.ts
|
|
6
6
|
declare namespace account_d_exports {
|
|
7
7
|
export { beginCredentialsSignIn, completeCredentialsSignIn, create, get, list, remove, update };
|
|
8
8
|
}
|
|
9
|
-
type AcceptedCredentialsSignIn = SessionRows & {
|
|
9
|
+
type AcceptedCredentialsSignIn = Omit<SessionRows, "epoch"> & {
|
|
10
10
|
status: "accepted";
|
|
11
11
|
};
|
|
12
12
|
/** Reserve a password attempt and load all sign-in state in one transaction. */
|
|
13
|
-
declare const beginCredentialsSignIn:
|
|
13
|
+
declare const beginCredentialsSignIn: convex_server105.RegisteredMutation<"public", {
|
|
14
14
|
provider: string;
|
|
15
15
|
providerAccountId: string;
|
|
16
|
+
limitIdentifier: string;
|
|
16
17
|
maxAttemptsPerHour: number;
|
|
17
18
|
reserveAttempt: boolean;
|
|
18
19
|
includeTotp: boolean;
|
|
19
20
|
}, Promise<{
|
|
20
|
-
status: "
|
|
21
|
+
status: "limited";
|
|
21
22
|
account?: undefined;
|
|
22
23
|
user?: undefined;
|
|
23
24
|
hasTotp?: undefined;
|
|
24
25
|
} | {
|
|
25
|
-
status: "
|
|
26
|
+
status: "invalid";
|
|
26
27
|
account?: undefined;
|
|
27
28
|
user?: undefined;
|
|
28
29
|
hasTotp?: undefined;
|
|
29
30
|
} | {
|
|
30
31
|
status: "ready";
|
|
31
32
|
account: {
|
|
32
|
-
_id:
|
|
33
|
+
_id: convex_values2031.GenericId<"Account">;
|
|
33
34
|
_creationTime: number;
|
|
34
|
-
emailVerified?: string | undefined;
|
|
35
35
|
extend?: any;
|
|
36
36
|
secret?: string | undefined;
|
|
37
|
+
emailVerified?: string | undefined;
|
|
37
38
|
phoneVerified?: string | undefined;
|
|
38
|
-
userId: convex_values2561.GenericId<"User">;
|
|
39
39
|
provider: string;
|
|
40
|
+
userId: convex_values2031.GenericId<"User">;
|
|
40
41
|
providerAccountId: string;
|
|
41
42
|
};
|
|
42
43
|
user: {
|
|
43
|
-
_id:
|
|
44
|
+
_id: convex_values2031.GenericId<"User">;
|
|
44
45
|
_creationTime: number;
|
|
45
|
-
name?: string | undefined;
|
|
46
46
|
email?: string | undefined;
|
|
47
|
-
|
|
47
|
+
extend?: any;
|
|
48
48
|
phone?: string | undefined;
|
|
49
|
+
name?: string | undefined;
|
|
49
50
|
firstName?: string | undefined;
|
|
50
51
|
lastName?: string | undefined;
|
|
52
|
+
image?: string | undefined;
|
|
51
53
|
emailVerificationTime?: number | undefined;
|
|
52
54
|
phoneVerificationTime?: number | undefined;
|
|
53
55
|
isAnonymous?: boolean | undefined;
|
|
54
|
-
lastActiveGroup?:
|
|
55
|
-
|
|
56
|
+
lastActiveGroup?: convex_values2031.GenericId<"Group"> | undefined;
|
|
57
|
+
sessionEpoch?: number | undefined;
|
|
56
58
|
};
|
|
57
59
|
hasTotp: boolean;
|
|
58
60
|
}>>;
|
|
59
61
|
/** Refund a verified password attempt and optionally issue its session atomically. */
|
|
60
|
-
declare const completeCredentialsSignIn:
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
declare const completeCredentialsSignIn: convex_server105.RegisteredMutation<"public", {
|
|
63
|
+
replaceSession?: {
|
|
64
|
+
sessionId: convex_values2031.GenericId<"Session">;
|
|
65
|
+
authenticatedUserId: convex_values2031.GenericId<"User">;
|
|
66
|
+
} | undefined;
|
|
67
|
+
accountId: convex_values2031.GenericId<"Account">;
|
|
63
68
|
sessionExpirationTime: number;
|
|
64
69
|
refreshTokenExpirationTime: number;
|
|
70
|
+
limitIdentifier: string;
|
|
65
71
|
issueSession: boolean;
|
|
66
72
|
generateTokens: boolean;
|
|
67
73
|
}, Promise<AcceptedCredentialsSignIn | {
|
|
@@ -73,53 +79,53 @@ declare const completeCredentialsSignIn: convex_server109.RegisteredMutation<"pu
|
|
|
73
79
|
* Read an account by id, or by `{ provider, providerAccountId }` when both
|
|
74
80
|
* are given. Returns `null` when no selector matches.
|
|
75
81
|
*/
|
|
76
|
-
declare const get:
|
|
77
|
-
id?:
|
|
82
|
+
declare const get: convex_server105.RegisteredQuery<"public", {
|
|
83
|
+
id?: convex_values2031.GenericId<"Account"> | undefined;
|
|
78
84
|
provider?: string | undefined;
|
|
79
85
|
providerAccountId?: string | undefined;
|
|
80
86
|
}, Promise<{
|
|
81
|
-
_id:
|
|
87
|
+
_id: convex_values2031.GenericId<"Account">;
|
|
82
88
|
_creationTime: number;
|
|
83
|
-
emailVerified?: string | undefined;
|
|
84
89
|
extend?: any;
|
|
85
90
|
secret?: string | undefined;
|
|
91
|
+
emailVerified?: string | undefined;
|
|
86
92
|
phoneVerified?: string | undefined;
|
|
87
|
-
userId: convex_values2561.GenericId<"User">;
|
|
88
93
|
provider: string;
|
|
94
|
+
userId: convex_values2031.GenericId<"User">;
|
|
89
95
|
providerAccountId: string;
|
|
90
96
|
} | null>>;
|
|
91
97
|
/** List the accounts owned by a user. */
|
|
92
|
-
declare const list:
|
|
93
|
-
userId:
|
|
98
|
+
declare const list: convex_server105.RegisteredQuery<"public", {
|
|
99
|
+
userId: convex_values2031.GenericId<"User">;
|
|
94
100
|
}, Promise<{
|
|
95
|
-
_id:
|
|
101
|
+
_id: convex_values2031.GenericId<"Account">;
|
|
96
102
|
_creationTime: number;
|
|
97
|
-
emailVerified?: string | undefined;
|
|
98
103
|
extend?: any;
|
|
99
104
|
secret?: string | undefined;
|
|
105
|
+
emailVerified?: string | undefined;
|
|
100
106
|
phoneVerified?: string | undefined;
|
|
101
|
-
userId: convex_values2561.GenericId<"User">;
|
|
102
107
|
provider: string;
|
|
108
|
+
userId: convex_values2031.GenericId<"User">;
|
|
103
109
|
providerAccountId: string;
|
|
104
110
|
}[]>>;
|
|
105
111
|
/** Insert a new account. */
|
|
106
|
-
declare const create:
|
|
112
|
+
declare const create: convex_server105.RegisteredMutation<"public", {
|
|
107
113
|
extend?: any;
|
|
108
114
|
secret?: string | undefined;
|
|
109
|
-
userId: convex_values2561.GenericId<"User">;
|
|
110
115
|
provider: string;
|
|
116
|
+
userId: convex_values2031.GenericId<"User">;
|
|
111
117
|
providerAccountId: string;
|
|
112
|
-
}, Promise<
|
|
118
|
+
}, Promise<convex_values2031.GenericId<"Account">>>;
|
|
113
119
|
/** Patch fields on an account. */
|
|
114
|
-
declare const update:
|
|
115
|
-
id:
|
|
120
|
+
declare const update: convex_server105.RegisteredMutation<"public", {
|
|
121
|
+
id: convex_values2031.GenericId<"Account">;
|
|
116
122
|
patch: {
|
|
117
|
-
emailVerified?: string | undefined;
|
|
118
123
|
extend?: any;
|
|
119
|
-
userId?: convex_values2561.GenericId<"User"> | undefined;
|
|
120
124
|
provider?: string | undefined;
|
|
125
|
+
userId?: convex_values2031.GenericId<"User"> | undefined;
|
|
121
126
|
providerAccountId?: string | undefined;
|
|
122
127
|
secret?: string | undefined;
|
|
128
|
+
emailVerified?: string | undefined;
|
|
123
129
|
phoneVerified?: string | undefined;
|
|
124
130
|
};
|
|
125
131
|
}, Promise<null>>;
|
|
@@ -127,10 +133,10 @@ declare const update: convex_server109.RegisteredMutation<"public", {
|
|
|
127
133
|
* Delete an account. When `requireOtherAccount` is set, refuses to delete the
|
|
128
134
|
* user's last remaining account so they are never left with none.
|
|
129
135
|
*/
|
|
130
|
-
declare const remove:
|
|
131
|
-
userId?:
|
|
136
|
+
declare const remove: convex_server105.RegisteredMutation<"public", {
|
|
137
|
+
userId?: convex_values2031.GenericId<"User"> | undefined;
|
|
132
138
|
requireOtherAccount?: boolean | undefined;
|
|
133
|
-
id:
|
|
139
|
+
id: convex_values2031.GenericId<"Account">;
|
|
134
140
|
}, Promise<null>>;
|
|
135
141
|
//#endregion
|
|
136
142
|
export { account_d_exports };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.d.ts","names":[],"sources":["../../src/component/account.ts"],"mappings":";;;;;;;;KAmBK,yBAAA,GAA4B,WAAA;
|
|
1
|
+
{"version":3,"file":"account.d.ts","names":[],"sources":["../../src/component/account.ts"],"mappings":";;;;;;;;KAmBK,yBAAA,GAA4B,IAAA,CAAK,WAAA;EAA0B,MAAA;AAAA;;cAGnD,sBAAA,mBAAsB,kBAAA;;;;;;;;;;;;;;;;;;;;SAuDjC,iBAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAGW,yBAAA,mBAAyB,kBAAA;;eA6CpC,iBAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;cAMW,GAAA,mBAAG,eAAA;OAmBd,iBAAA,CAAA,SAAA;;;;;;;;;;;;;;;cAGW,IAAA,mBAAI,eAAA;UASf,iBAAA,CAAA,SAAA;AAAA;;;;;;;;;;;;cAGW,MAAA,mBAAM,kBAAA;;;;UAqCjB,iBAAA,CAAA,SAAA;;;;cAGW,MAAA,mBAAM,kBAAA;MAkBjB,iBAAA,CAAA,SAAA;;;;;;;;;;;;;;;cAMI,MAAA,mBAAM,kBAAA;WAmCV,iBAAA,CAAA,SAAA"}
|
|
@@ -3,7 +3,7 @@ import { vAccountDoc, vUserDoc } from "./model.js";
|
|
|
3
3
|
import { mutation, query } from "./_generated/server.js";
|
|
4
4
|
import "./functions.js";
|
|
5
5
|
import { recordSignInLimit, resetSignInLimit } from "./limits.js";
|
|
6
|
-
import { createSessionRows } from "./session.js";
|
|
6
|
+
import { createSessionRows, vSessionReplacement } from "./session.js";
|
|
7
7
|
import { ConvexError, v } from "convex/values";
|
|
8
8
|
|
|
9
9
|
//#region src/component/account.ts
|
|
@@ -21,6 +21,7 @@ const beginCredentialsSignIn = mutation({
|
|
|
21
21
|
args: {
|
|
22
22
|
provider: v.string(),
|
|
23
23
|
providerAccountId: v.string(),
|
|
24
|
+
limitIdentifier: v.string(),
|
|
24
25
|
maxAttemptsPerHour: v.number(),
|
|
25
26
|
reserveAttempt: v.boolean(),
|
|
26
27
|
includeTotp: v.boolean()
|
|
@@ -32,20 +33,16 @@ const beginCredentialsSignIn = mutation({
|
|
|
32
33
|
hasTotp: v.boolean()
|
|
33
34
|
})),
|
|
34
35
|
handler: async (ctx, args) => {
|
|
36
|
+
if (!(args.reserveAttempt ? await recordSignInLimit(ctx, {
|
|
37
|
+
identifier: args.limitIdentifier,
|
|
38
|
+
maxAttemptsPerHour: args.maxAttemptsPerHour
|
|
39
|
+
}) : {
|
|
40
|
+
ok: true,
|
|
41
|
+
retryAfter: void 0
|
|
42
|
+
}).ok) return { status: "limited" };
|
|
35
43
|
const account = await ctx.db.query("Account").withIndex("provider_account_id", (q) => q.eq("provider", args.provider).eq("providerAccountId", args.providerAccountId)).unique();
|
|
36
44
|
if (account === null) return { status: "invalid" };
|
|
37
|
-
const [user, totp
|
|
38
|
-
ctx.db.get("User", account.userId),
|
|
39
|
-
args.includeTotp ? ctx.db.query("TotpFactor").withIndex("user_id_verified", (q) => q.eq("userId", account.userId).eq("verified", true)).first() : Promise.resolve(null),
|
|
40
|
-
args.reserveAttempt ? recordSignInLimit(ctx, {
|
|
41
|
-
identifier: account._id,
|
|
42
|
-
maxAttemptsPerHour: args.maxAttemptsPerHour
|
|
43
|
-
}) : Promise.resolve({
|
|
44
|
-
ok: true,
|
|
45
|
-
retryAfter: void 0
|
|
46
|
-
})
|
|
47
|
-
]);
|
|
48
|
-
if (!limit.ok) return { status: "limited" };
|
|
45
|
+
const [user, totp] = await Promise.all([ctx.db.get("User", account.userId), args.includeTotp ? ctx.db.query("TotpFactor").withIndex("user_id_verified", (q) => q.eq("userId", account.userId).eq("verified", true)).first() : Promise.resolve(null)]);
|
|
49
46
|
if (user === null) return { status: "invalid" };
|
|
50
47
|
return {
|
|
51
48
|
status: "ready",
|
|
@@ -59,9 +56,10 @@ const beginCredentialsSignIn = mutation({
|
|
|
59
56
|
const completeCredentialsSignIn = mutation({
|
|
60
57
|
args: {
|
|
61
58
|
accountId: v.id("Account"),
|
|
59
|
+
limitIdentifier: v.string(),
|
|
62
60
|
issueSession: v.boolean(),
|
|
63
61
|
generateTokens: v.boolean(),
|
|
64
|
-
|
|
62
|
+
replaceSession: v.optional(vSessionReplacement),
|
|
65
63
|
sessionExpirationTime: v.number(),
|
|
66
64
|
refreshTokenExpirationTime: v.number()
|
|
67
65
|
},
|
|
@@ -75,11 +73,11 @@ const completeCredentialsSignIn = mutation({
|
|
|
75
73
|
handler: async (ctx, args) => {
|
|
76
74
|
const account = await ctx.db.get("Account", args.accountId);
|
|
77
75
|
if (account === null) return { status: "rejected" };
|
|
78
|
-
await resetSignInLimit(ctx,
|
|
76
|
+
await resetSignInLimit(ctx, args.limitIdentifier);
|
|
79
77
|
if (!args.issueSession) return { status: "reset" };
|
|
80
78
|
const created = await createSessionRows(ctx, {
|
|
81
79
|
userId: account.userId,
|
|
82
|
-
|
|
80
|
+
replaceSession: args.replaceSession,
|
|
83
81
|
sessionExpirationTime: args.sessionExpirationTime,
|
|
84
82
|
refreshTokenExpirationTime: args.generateTokens ? args.refreshTokenExpirationTime : void 0
|
|
85
83
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.js","names":[],"sources":["../../src/component/account.ts"],"sourcesContent":["/**\n * `component.account.*` — provider-linked auth accounts.\n *\n * Reads collapse into one overloaded `get`; `list`\n * takes the owning `userId`.\n *\n * @module\n */\n\nimport { ConvexError, v } from \"convex/values\";\nimport { ErrorCode } from \"../shared/codes\";\n\nimport { recordSignInLimit, resetSignInLimit } from \"./limits\";\nimport { mutation, query } from \"./functions\";\nimport { vAccountDoc, vUserDoc } from \"./model\";\nimport { createSessionRows, type SessionRows } from \"./session\";\n\nconst ACCOUNT_LIST_BATCH = 128;\n\ntype AcceptedCredentialsSignIn = SessionRows & { status: \"accepted\" };\n\n/** Reserve a password attempt and load all sign-in state in one transaction. */\nexport const beginCredentialsSignIn = mutation({\n args: {\n provider: v.string(),\n providerAccountId: v.string(),\n maxAttemptsPerHour: v.number(),\n reserveAttempt: v.boolean(),\n includeTotp: v.boolean(),\n },\n returns: v.union(\n v.object({ status: v.literal(\"invalid\") }),\n v.object({ status: v.literal(\"limited\") }),\n v.object({\n status: v.literal(\"ready\"),\n account: vAccountDoc,\n user: vUserDoc,\n hasTotp: v.boolean(),\n }),\n ),\n handler: async (ctx, args) => {\n const account = await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider).eq(\"providerAccountId\", args.providerAccountId),\n )\n .unique();\n if (account === null) return { status: \"invalid\" as const };\n\n const [user, totp, limit] = await Promise.all([\n ctx.db.get(\"User\", account.userId),\n args.includeTotp\n ? ctx.db\n .query(\"TotpFactor\")\n .withIndex(\"user_id_verified\", (q) =>\n q.eq(\"userId\", account.userId).eq(\"verified\", true),\n )\n .first()\n : Promise.resolve(null),\n args.reserveAttempt\n ? recordSignInLimit(ctx, {\n identifier: account._id,\n maxAttemptsPerHour: args.maxAttemptsPerHour,\n })\n : Promise.resolve({ ok: true as const, retryAfter: undefined }),\n ]);\n if (!limit.ok) return { status: \"limited\" as const };\n if (user === null) return { status: \"invalid\" as const };\n return {\n status: \"ready\" as const,\n account,\n user,\n hasTotp: totp !== null,\n };\n },\n});\n\n/** Refund a verified password attempt and optionally issue its session atomically. */\nexport const completeCredentialsSignIn = mutation({\n args: {\n accountId: v.id(\"Account\"),\n issueSession: v.boolean(),\n generateTokens: v.boolean(),\n replaceSessionId: v.optional(v.id(\"Session\")),\n sessionExpirationTime: v.number(),\n refreshTokenExpirationTime: v.number(),\n },\n returns: v.union(\n v.object({ status: v.literal(\"rejected\") }),\n v.object({ status: v.literal(\"reset\") }),\n v.object({\n status: v.literal(\"accepted\"),\n user: vUserDoc,\n sessionId: v.id(\"Session\"),\n refreshTokenId: v.optional(v.id(\"RefreshToken\")),\n replacedSessionId: v.optional(v.id(\"Session\")),\n }),\n ),\n handler: async (ctx, args) => {\n const account = await ctx.db.get(\"Account\", args.accountId);\n if (account === null) return { status: \"rejected\" as const };\n await resetSignInLimit(ctx, account._id);\n if (!args.issueSession) return { status: \"reset\" as const };\n\n const created = await createSessionRows(ctx, {\n userId: account.userId,\n replaceSessionId: args.replaceSessionId,\n sessionExpirationTime: args.sessionExpirationTime,\n refreshTokenExpirationTime: args.generateTokens ? args.refreshTokenExpirationTime : undefined,\n });\n if (created === null) return { status: \"rejected\" as const };\n const result: AcceptedCredentialsSignIn = {\n status: \"accepted\" as const,\n user: created.user,\n sessionId: created.sessionId,\n };\n if (created.refreshTokenId !== undefined) result.refreshTokenId = created.refreshTokenId;\n if (created.replacedSessionId !== undefined) {\n result.replacedSessionId = created.replacedSessionId;\n }\n return result;\n },\n});\n\n/**\n * Read an account by id, or by `{ provider, providerAccountId }` when both\n * are given. Returns `null` when no selector matches.\n */\nexport const get = query({\n args: {\n id: v.optional(v.id(\"Account\")),\n provider: v.optional(v.string()),\n providerAccountId: v.optional(v.string()),\n },\n returns: v.union(vAccountDoc, v.null()),\n handler: async (ctx, args) => {\n if (args.provider !== undefined && args.providerAccountId !== undefined) {\n return await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider!).eq(\"providerAccountId\", args.providerAccountId!),\n )\n .unique();\n }\n if (args.id === undefined) return null;\n return await ctx.db.get(\"Account\", args.id);\n },\n});\n\n/** List the accounts owned by a user. */\nexport const list = query({\n args: { userId: v.id(\"User\") },\n returns: v.array(vAccountDoc),\n handler: async (ctx, { userId }) => {\n return await ctx.db\n .query(\"Account\")\n .withIndex(\"user_id_provider\", (q) => q.eq(\"userId\", userId))\n .take(ACCOUNT_LIST_BATCH);\n },\n});\n\n/** Insert a new account. */\nexport const create = mutation({\n args: {\n userId: v.id(\"User\"),\n provider: v.string(),\n providerAccountId: v.string(),\n secret: v.optional(v.string()),\n extend: v.optional(v.any()),\n },\n returns: v.id(\"Account\"),\n handler: async (ctx, args) => {\n // Dedup on the (provider, providerAccountId) identity. A bare insert let two\n // concurrent or retried provisioning ceremonies — SCIM POST retries, a\n // passkey double-submit — create duplicate Account rows, which then made\n // `account.get(...).unique()` throw on every future lookup (a permanent\n // sign-in lockout / rogue credential attribution). The index-range read plus\n // insert in this single mutation is OCC-atomic: a racing insert into the same\n // range conflicts and retries, then observes the winner's row below.\n const existing = await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider).eq(\"providerAccountId\", args.providerAccountId),\n )\n .first();\n if (existing !== null) {\n if (existing.userId !== args.userId) {\n // Already linked to a different user — reject rather than silently\n // attribute the identity (e.g. an attacker registering a passkey\n // credentialId that already belongs to a victim).\n throw new ConvexError({\n code: ErrorCode.ACCOUNT_ALREADY_LINKED,\n message: \"This account is already linked to another user.\",\n });\n }\n return existing._id;\n }\n return await ctx.db.insert(\"Account\", args);\n },\n});\n\n/** Patch fields on an account. */\nexport const update = mutation({\n args: {\n id: v.id(\"Account\"),\n patch: v.object({\n userId: v.optional(v.id(\"User\")),\n provider: v.optional(v.string()),\n providerAccountId: v.optional(v.string()),\n secret: v.optional(v.string()),\n emailVerified: v.optional(v.string()),\n phoneVerified: v.optional(v.string()),\n extend: v.optional(v.any()),\n }),\n },\n returns: v.null(),\n handler: async (ctx, { id: accountId, patch }) => {\n await ctx.db.patch(\"Account\", accountId, patch);\n return null;\n },\n});\n\n/**\n * Delete an account. When `requireOtherAccount` is set, refuses to delete the\n * user's last remaining account so they are never left with none.\n */\nconst remove = mutation({\n args: {\n id: v.id(\"Account\"),\n userId: v.optional(v.id(\"User\")),\n requireOtherAccount: v.optional(v.boolean()),\n },\n returns: v.null(),\n handler: async (ctx, { id: accountId, userId, requireOtherAccount }) => {\n const doc = await ctx.db.get(\"Account\", accountId);\n if (doc === null || (userId !== undefined && doc.userId !== userId)) {\n throw new ConvexError({\n code: ErrorCode.ACCOUNT_NOT_FOUND,\n message: \"Account not found.\",\n });\n }\n if (requireOtherAccount === true) {\n let otherFound = false;\n for await (const sibling of ctx.db\n .query(\"Account\")\n .withIndex(\"user_id_provider\", (q) => q.eq(\"userId\", doc.userId))) {\n if (sibling._id !== accountId) {\n otherFound = true;\n break;\n }\n }\n if (!otherFound) {\n throw new ConvexError({\n code: ErrorCode.INVALID_PARAMETERS,\n message: \"The provided parameters are invalid.\",\n });\n }\n }\n await ctx.db.delete(\"Account\", accountId);\n return null;\n },\n});\n\nexport { remove };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"account.js","names":[],"sources":["../../src/component/account.ts"],"sourcesContent":["/**\n * `component.account.*` — provider-linked auth accounts.\n *\n * Reads collapse into one overloaded `get`; `list`\n * takes the owning `userId`.\n *\n * @module\n */\n\nimport { ConvexError, v } from \"convex/values\";\nimport { ErrorCode } from \"../shared/codes\";\n\nimport { recordSignInLimit, resetSignInLimit } from \"./limits\";\nimport { mutation, query } from \"./functions\";\nimport { vAccountDoc, vUserDoc } from \"./model\";\nimport { createSessionRows, type SessionRows, vSessionReplacement } from \"./session\";\n\nconst ACCOUNT_LIST_BATCH = 128;\n\ntype AcceptedCredentialsSignIn = Omit<SessionRows, \"epoch\"> & { status: \"accepted\" };\n\n/** Reserve a password attempt and load all sign-in state in one transaction. */\nexport const beginCredentialsSignIn = mutation({\n args: {\n provider: v.string(),\n providerAccountId: v.string(),\n limitIdentifier: v.string(),\n maxAttemptsPerHour: v.number(),\n reserveAttempt: v.boolean(),\n includeTotp: v.boolean(),\n },\n returns: v.union(\n v.object({ status: v.literal(\"invalid\") }),\n v.object({ status: v.literal(\"limited\") }),\n v.object({\n status: v.literal(\"ready\"),\n account: vAccountDoc,\n user: vUserDoc,\n hasTotp: v.boolean(),\n }),\n ),\n handler: async (ctx, args) => {\n const limit = args.reserveAttempt\n ? await recordSignInLimit(ctx, {\n identifier: args.limitIdentifier,\n maxAttemptsPerHour: args.maxAttemptsPerHour,\n })\n : { ok: true as const, retryAfter: undefined };\n if (!limit.ok) return { status: \"limited\" as const };\n\n const account = await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider).eq(\"providerAccountId\", args.providerAccountId),\n )\n .unique();\n if (account === null) return { status: \"invalid\" as const };\n\n const [user, totp] = await Promise.all([\n ctx.db.get(\"User\", account.userId),\n args.includeTotp\n ? ctx.db\n .query(\"TotpFactor\")\n .withIndex(\"user_id_verified\", (q) =>\n q.eq(\"userId\", account.userId).eq(\"verified\", true),\n )\n .first()\n : Promise.resolve(null),\n ]);\n if (user === null) return { status: \"invalid\" as const };\n return {\n status: \"ready\" as const,\n account,\n user,\n hasTotp: totp !== null,\n };\n },\n});\n\n/** Refund a verified password attempt and optionally issue its session atomically. */\nexport const completeCredentialsSignIn = mutation({\n args: {\n accountId: v.id(\"Account\"),\n limitIdentifier: v.string(),\n issueSession: v.boolean(),\n generateTokens: v.boolean(),\n replaceSession: v.optional(vSessionReplacement),\n sessionExpirationTime: v.number(),\n refreshTokenExpirationTime: v.number(),\n },\n returns: v.union(\n v.object({ status: v.literal(\"rejected\") }),\n v.object({ status: v.literal(\"reset\") }),\n v.object({\n status: v.literal(\"accepted\"),\n user: vUserDoc,\n sessionId: v.id(\"Session\"),\n refreshTokenId: v.optional(v.id(\"RefreshToken\")),\n replacedSessionId: v.optional(v.id(\"Session\")),\n }),\n ),\n handler: async (ctx, args) => {\n const account = await ctx.db.get(\"Account\", args.accountId);\n if (account === null) return { status: \"rejected\" as const };\n await resetSignInLimit(ctx, args.limitIdentifier);\n if (!args.issueSession) return { status: \"reset\" as const };\n\n const created = await createSessionRows(ctx, {\n userId: account.userId,\n replaceSession: args.replaceSession,\n sessionExpirationTime: args.sessionExpirationTime,\n refreshTokenExpirationTime: args.generateTokens ? args.refreshTokenExpirationTime : undefined,\n });\n if (created === null) return { status: \"rejected\" as const };\n const result: AcceptedCredentialsSignIn = {\n status: \"accepted\" as const,\n user: created.user,\n sessionId: created.sessionId,\n };\n if (created.refreshTokenId !== undefined) result.refreshTokenId = created.refreshTokenId;\n if (created.replacedSessionId !== undefined) {\n result.replacedSessionId = created.replacedSessionId;\n }\n return result;\n },\n});\n\n/**\n * Read an account by id, or by `{ provider, providerAccountId }` when both\n * are given. Returns `null` when no selector matches.\n */\nexport const get = query({\n args: {\n id: v.optional(v.id(\"Account\")),\n provider: v.optional(v.string()),\n providerAccountId: v.optional(v.string()),\n },\n returns: v.union(vAccountDoc, v.null()),\n handler: async (ctx, args) => {\n if (args.provider !== undefined && args.providerAccountId !== undefined) {\n return await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider!).eq(\"providerAccountId\", args.providerAccountId!),\n )\n .unique();\n }\n if (args.id === undefined) return null;\n return await ctx.db.get(\"Account\", args.id);\n },\n});\n\n/** List the accounts owned by a user. */\nexport const list = query({\n args: { userId: v.id(\"User\") },\n returns: v.array(vAccountDoc),\n handler: async (ctx, { userId }) => {\n return await ctx.db\n .query(\"Account\")\n .withIndex(\"user_id_provider\", (q) => q.eq(\"userId\", userId))\n .take(ACCOUNT_LIST_BATCH);\n },\n});\n\n/** Insert a new account. */\nexport const create = mutation({\n args: {\n userId: v.id(\"User\"),\n provider: v.string(),\n providerAccountId: v.string(),\n secret: v.optional(v.string()),\n extend: v.optional(v.any()),\n },\n returns: v.id(\"Account\"),\n handler: async (ctx, args) => {\n // Dedup on the (provider, providerAccountId) identity. A bare insert let two\n // concurrent or retried provisioning ceremonies — SCIM POST retries, a\n // passkey double-submit — create duplicate Account rows, which then made\n // `account.get(...).unique()` throw on every future lookup (a permanent\n // sign-in lockout / rogue credential attribution). The index-range read plus\n // insert in this single mutation is OCC-atomic: a racing insert into the same\n // range conflicts and retries, then observes the winner's row below.\n const existing = await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider).eq(\"providerAccountId\", args.providerAccountId),\n )\n .first();\n if (existing !== null) {\n if (existing.userId !== args.userId) {\n // Already linked to a different user — reject rather than silently\n // attribute the identity (e.g. an attacker registering a passkey\n // credentialId that already belongs to a victim).\n throw new ConvexError({\n code: ErrorCode.ACCOUNT_ALREADY_LINKED,\n message: \"This account is already linked to another user.\",\n });\n }\n return existing._id;\n }\n return await ctx.db.insert(\"Account\", args);\n },\n});\n\n/** Patch fields on an account. */\nexport const update = mutation({\n args: {\n id: v.id(\"Account\"),\n patch: v.object({\n userId: v.optional(v.id(\"User\")),\n provider: v.optional(v.string()),\n providerAccountId: v.optional(v.string()),\n secret: v.optional(v.string()),\n emailVerified: v.optional(v.string()),\n phoneVerified: v.optional(v.string()),\n extend: v.optional(v.any()),\n }),\n },\n returns: v.null(),\n handler: async (ctx, { id: accountId, patch }) => {\n await ctx.db.patch(\"Account\", accountId, patch);\n return null;\n },\n});\n\n/**\n * Delete an account. When `requireOtherAccount` is set, refuses to delete the\n * user's last remaining account so they are never left with none.\n */\nconst remove = mutation({\n args: {\n id: v.id(\"Account\"),\n userId: v.optional(v.id(\"User\")),\n requireOtherAccount: v.optional(v.boolean()),\n },\n returns: v.null(),\n handler: async (ctx, { id: accountId, userId, requireOtherAccount }) => {\n const doc = await ctx.db.get(\"Account\", accountId);\n if (doc === null || (userId !== undefined && doc.userId !== userId)) {\n throw new ConvexError({\n code: ErrorCode.ACCOUNT_NOT_FOUND,\n message: \"Account not found.\",\n });\n }\n if (requireOtherAccount === true) {\n let otherFound = false;\n for await (const sibling of ctx.db\n .query(\"Account\")\n .withIndex(\"user_id_provider\", (q) => q.eq(\"userId\", doc.userId))) {\n if (sibling._id !== accountId) {\n otherFound = true;\n break;\n }\n }\n if (!otherFound) {\n throw new ConvexError({\n code: ErrorCode.INVALID_PARAMETERS,\n message: \"The provided parameters are invalid.\",\n });\n }\n }\n await ctx.db.delete(\"Account\", accountId);\n return null;\n },\n});\n\nexport { remove };\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import * as
|
|
1
|
+
import * as convex_values3277 from "convex/values";
|
|
2
|
+
import * as convex_server212 from "convex/server";
|
|
3
3
|
|
|
4
4
|
//#region src/component/connection/audit.d.ts
|
|
5
5
|
declare namespace audit_d_exports {
|
|
@@ -16,9 +16,9 @@ declare namespace audit_d_exports {
|
|
|
16
16
|
* an allowlist). Requires exactly one of `connectionId` or `groupId` — passing
|
|
17
17
|
* neither throws rather than scanning the entire audit log.
|
|
18
18
|
*/
|
|
19
|
-
declare const list:
|
|
20
|
-
connectionId?:
|
|
21
|
-
groupId?:
|
|
19
|
+
declare const list: convex_server212.RegisteredQuery<"public", {
|
|
20
|
+
connectionId?: convex_values3277.GenericId<"GroupConnection"> | undefined;
|
|
21
|
+
groupId?: convex_values3277.GenericId<"Group"> | undefined;
|
|
22
22
|
paginationOpts: {
|
|
23
23
|
id?: number;
|
|
24
24
|
endCursor?: string | null;
|
|
@@ -29,55 +29,55 @@ declare const list: convex_server207.RegisteredQuery<"public", {
|
|
|
29
29
|
};
|
|
30
30
|
}, Promise<{
|
|
31
31
|
page: {
|
|
32
|
-
_id:
|
|
32
|
+
_id: convex_values3277.GenericId<"AuthEventProjection">;
|
|
33
33
|
_creationTime: number;
|
|
34
34
|
eventId: string;
|
|
35
|
-
targetKind: "user" | "
|
|
35
|
+
targetKind: "user" | "session" | "api_key" | "connection" | "oauth_client" | "group" | "global";
|
|
36
36
|
targetId: string;
|
|
37
37
|
kind: "user.created" | "user.updated" | "session.signed_in" | "session.signed_out" | "session.invalidated" | "session.refresh_exchanged" | "session.refresh_reuse_detected" | "account.linked" | "account.unlinked" | "password.changed" | "passkey.added" | "passkey.removed" | "totp.enrolled" | "totp.removed" | "email.verified" | "phone.verified" | "api_key.created" | "api_key.revoked" | "oauth.client.created" | "oauth.client.revoked" | "oauth.code.created" | "oauth.token.created" | "oauth.token.exchanged" | "oauth.refresh.reuse_detected" | "oauth.refresh.revoked" | "connection.created" | "connection.updated" | "connection.removed" | "connection.login.succeeded" | "connection.login.failed" | "connection.domain.verification_requested" | "connection.domain.verified" | "connection.policy.updated" | "connection.saml.set" | "connection.saml.refreshed" | "connection.oidc.set" | "connection.scim.set" | "connection.scim.read" | "connection.scim.user.provisioned" | "connection.scim.user.updated" | "connection.scim.user.deactivated" | "connection.scim.user.reactivated" | "connection.scim.group.provisioned" | "connection.scim.group.updated" | "connection.scim.group.deactivated" | "connection.scim.group.reactivated" | "webhook.endpoint.created" | "webhook.endpoint.disabled" | "webhook.delivery.created" | "webhook.delivery.attempted" | "webhook.delivery.succeeded" | "webhook.delivery.failed";
|
|
38
|
-
category: "email" | "
|
|
38
|
+
category: "email" | "password" | "phone" | "user" | "session" | "account" | "passkey" | "totp" | "api_key" | "oauth" | "connection" | "scim" | "webhook" | "security";
|
|
39
39
|
occurredAt: number;
|
|
40
|
-
actorType: "
|
|
40
|
+
actorType: "user" | "api_key" | "scim" | "webhook" | "system" | "oauth_client" | "anonymous";
|
|
41
41
|
actorId: string | undefined;
|
|
42
|
-
subjectType: "email" | "phone" | "user" | "
|
|
42
|
+
subjectType: "email" | "phone" | "user" | "session" | "account" | "passkey" | "totp" | "api_key" | "connection" | "system" | "oauth_client" | "oauth_code" | "group" | "scim_identity" | "webhook_endpoint" | "webhook_delivery";
|
|
43
43
|
subjectId: string | undefined;
|
|
44
44
|
outcome: "success" | "failure";
|
|
45
45
|
errorCode: string | undefined;
|
|
46
46
|
requestId: string | undefined;
|
|
47
47
|
ip: undefined;
|
|
48
48
|
data: {
|
|
49
|
+
profile?: Record<string, any> | undefined;
|
|
49
50
|
type?: string | undefined;
|
|
50
51
|
provider?: string | undefined;
|
|
51
|
-
profile?: Record<string, any> | undefined;
|
|
52
52
|
existingUserId?: string | undefined;
|
|
53
53
|
} | {
|
|
54
54
|
method?: string | undefined;
|
|
55
55
|
provider: string;
|
|
56
56
|
} | {
|
|
57
|
+
flow?: "reset" | "change" | undefined;
|
|
57
58
|
userId?: string | undefined;
|
|
58
|
-
sessionId?: string | undefined;
|
|
59
59
|
reason?: string | undefined;
|
|
60
|
+
sessionId?: string | undefined;
|
|
60
61
|
refreshTokenId?: string | undefined;
|
|
61
|
-
flow?: "reset" | "change" | undefined;
|
|
62
62
|
} | {
|
|
63
|
-
accountId?: string | undefined;
|
|
64
63
|
provider?: string | undefined;
|
|
65
64
|
providerAccountId?: string | undefined;
|
|
65
|
+
accountId?: string | undefined;
|
|
66
66
|
} | {
|
|
67
|
-
name?: string | undefined;
|
|
68
|
-
credentialId?: string | undefined;
|
|
69
67
|
reason?: string | undefined;
|
|
70
68
|
passkeyId?: string | undefined;
|
|
69
|
+
credentialId?: string | undefined;
|
|
71
70
|
totpId?: string | undefined;
|
|
72
71
|
keyId?: string | undefined;
|
|
72
|
+
name?: string | undefined;
|
|
73
73
|
prefix?: string | undefined;
|
|
74
74
|
} | {
|
|
75
75
|
email?: string | undefined;
|
|
76
76
|
phone?: string | undefined;
|
|
77
77
|
userId?: string | undefined;
|
|
78
78
|
} | {
|
|
79
|
-
name?: string | undefined;
|
|
80
79
|
userId?: string | undefined;
|
|
80
|
+
name?: string | undefined;
|
|
81
81
|
clientId?: string | undefined;
|
|
82
82
|
codeId?: string | undefined;
|
|
83
83
|
scopes?: string[] | undefined;
|
|
@@ -85,16 +85,15 @@ declare const list: convex_server207.RegisteredQuery<"public", {
|
|
|
85
85
|
grantType?: string | undefined;
|
|
86
86
|
resource?: string | undefined;
|
|
87
87
|
} | {
|
|
88
|
+
errorCode?: string | undefined;
|
|
88
89
|
userId?: string | undefined;
|
|
89
90
|
connectionId?: string | undefined;
|
|
90
|
-
|
|
91
|
-
expiresAt?: number | undefined;
|
|
92
|
-
version?: number | undefined;
|
|
91
|
+
changed?: string[] | undefined;
|
|
93
92
|
protocol?: "oidc" | "saml" | undefined;
|
|
94
93
|
domain?: string | undefined;
|
|
95
94
|
recordName?: string | undefined;
|
|
96
|
-
|
|
97
|
-
|
|
95
|
+
expiresAt?: number | undefined;
|
|
96
|
+
verifiedAt?: number | undefined;
|
|
98
97
|
metadataUrl?: string | undefined;
|
|
99
98
|
domains?: string[] | undefined;
|
|
100
99
|
issuer?: string | undefined;
|
|
@@ -102,28 +101,29 @@ declare const list: convex_server207.RegisteredQuery<"public", {
|
|
|
102
101
|
jwksUri?: string | undefined;
|
|
103
102
|
audience?: string | string[] | undefined;
|
|
104
103
|
tokenEndpointAuthMethod?: string | undefined;
|
|
104
|
+
version?: number | undefined;
|
|
105
105
|
} | {
|
|
106
106
|
userId?: string | undefined;
|
|
107
|
+
scimConfigId?: string | undefined;
|
|
108
|
+
resourceType?: "user" | "group" | undefined;
|
|
109
|
+
resourceId?: string | undefined;
|
|
107
110
|
operation?: string | undefined;
|
|
108
111
|
externalId?: string | undefined;
|
|
109
|
-
groupId?: string | undefined;
|
|
110
112
|
active?: boolean | undefined;
|
|
111
|
-
|
|
112
|
-
scimConfigId?: string | undefined;
|
|
113
|
-
resourceId?: string | undefined;
|
|
113
|
+
groupId?: string | undefined;
|
|
114
114
|
} | {
|
|
115
|
-
status?: number | undefined;
|
|
116
115
|
endpointId?: string | undefined;
|
|
117
116
|
deliveryId?: string | undefined;
|
|
118
117
|
sourceEventId?: string | undefined;
|
|
119
118
|
sourceEventType?: "user.created" | "user.updated" | "session.signed_in" | "session.signed_out" | "session.invalidated" | "session.refresh_exchanged" | "session.refresh_reuse_detected" | "account.linked" | "account.unlinked" | "password.changed" | "passkey.added" | "passkey.removed" | "totp.enrolled" | "totp.removed" | "email.verified" | "phone.verified" | "api_key.created" | "api_key.revoked" | "oauth.client.created" | "oauth.client.revoked" | "oauth.code.created" | "oauth.token.created" | "oauth.token.exchanged" | "oauth.refresh.reuse_detected" | "oauth.refresh.revoked" | "connection.created" | "connection.updated" | "connection.removed" | "connection.login.succeeded" | "connection.login.failed" | "connection.domain.verification_requested" | "connection.domain.verified" | "connection.policy.updated" | "connection.saml.set" | "connection.saml.refreshed" | "connection.oidc.set" | "connection.scim.set" | "connection.scim.read" | "connection.scim.user.provisioned" | "connection.scim.user.updated" | "connection.scim.user.deactivated" | "connection.scim.user.reactivated" | "connection.scim.group.provisioned" | "connection.scim.group.updated" | "connection.scim.group.deactivated" | "connection.scim.group.reactivated" | "webhook.endpoint.created" | "webhook.endpoint.disabled" | "webhook.delivery.created" | "webhook.delivery.attempted" | "webhook.delivery.succeeded" | "webhook.delivery.failed" | undefined;
|
|
120
119
|
attemptCount?: number | undefined;
|
|
120
|
+
status?: number | undefined;
|
|
121
121
|
error?: string | undefined;
|
|
122
122
|
} | undefined;
|
|
123
123
|
}[];
|
|
124
124
|
isDone: boolean;
|
|
125
|
-
continueCursor:
|
|
126
|
-
splitCursor?:
|
|
125
|
+
continueCursor: convex_server212.Cursor;
|
|
126
|
+
splitCursor?: convex_server212.Cursor | null;
|
|
127
127
|
pageStatus?: "SplitRecommended" | "SplitRequired" | null;
|
|
128
128
|
}>>;
|
|
129
129
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","names":[],"sources":["../../../src/component/connection/audit.ts"],"mappings":";;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"audit.d.ts","names":[],"sources":["../../../src/component/connection/audit.ts"],"mappings":";;;;;;;;;;;;;AA8GA;;;;;cAAa,IAAA,mBAAI,eAAA;iBAkCf,iBAAA,CAAA,SAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ErrorCode } from "../../shared/codes.js";
|
|
2
|
+
import { EVENT_KIND_CATEGORY } from "../../shared/event/kinds.js";
|
|
2
3
|
import { vAuthEventProjectionDoc, vPaginated } from "../model.js";
|
|
3
4
|
import schema_default from "../schema.js";
|
|
4
5
|
import { query } from "../_generated/server.js";
|
|
@@ -83,7 +84,7 @@ const PUBLIC_DATA_KEYS = {
|
|
|
83
84
|
};
|
|
84
85
|
function publicData(kind, value) {
|
|
85
86
|
if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
|
|
86
|
-
const keys = PUBLIC_DATA_KEYS[kind
|
|
87
|
+
const keys = PUBLIC_DATA_KEYS[EVENT_KIND_CATEGORY[kind]] ?? [];
|
|
87
88
|
const source = value;
|
|
88
89
|
const redacted = {};
|
|
89
90
|
for (const key of keys) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","names":["schema"],"sources":["../../../src/component/connection/audit.ts"],"sourcesContent":["/**\n * `component.connection.audit.*` - Connection audit projections backed by auth events.\n *\n * @module\n */\n\nimport { paginationOptsValidator } from \"convex/server\";\nimport { paginator } from \"convex-helpers/server/pagination\";\nimport { ConvexError, v, type Infer } from \"convex/values\";\n\nimport { ErrorCode } from \"../../shared/codes\";\nimport type { Doc } from \"../_generated/dataModel\";\nimport { query } from \"../functions\";\nimport { vAuthEventData, vAuthEventProjectionDoc, vPaginated } from \"../model\";\nimport schema from \"../schema\";\n\nconst PUBLIC_DATA_KEYS = {\n user: [\"type\", \"provider\", \"existingUserId\"],\n session: [\"provider\", \"method\", \"reason\"],\n account: [\"provider\", \"accountId\"],\n password: [\"userId\"],\n passkey: [\"passkeyId\"],\n totp: [\"totpId\"],\n email: [\"userId\"],\n phone: [\"userId\"],\n api_key: [\"keyId\", \"name\", \"prefix\", \"reason\"],\n oauth: [\"clientId\", \"codeId\", \"scopes\", \"grantType\", \"resource\"],\n connection: [\n \"connectionId\",\n \"protocol\",\n \"domain\",\n \"recordName\",\n \"expiresAt\",\n \"verifiedAt\",\n \"metadataUrl\",\n \"domains\",\n \"version\",\n \"errorCode\",\n \"issuer\",\n \"discoveryUrl\",\n \"jwksUri\",\n \"audience\",\n \"tokenEndpointAuthMethod\",\n ],\n scim: [\n \"scimConfigId\",\n \"resourceType\",\n \"resourceId\",\n \"operation\",\n \"externalId\",\n \"active\",\n \"groupId\",\n \"userId\",\n ],\n webhook: [\n \"endpointId\",\n \"deliveryId\",\n \"sourceEventId\",\n \"sourceEventType\",\n \"attemptCount\",\n \"status\",\n \"error\",\n ],\n security: [\"reason\", \"errorCode\"],\n} as const;\n\nfunction publicData(kind:
|
|
1
|
+
{"version":3,"file":"audit.js","names":["schema"],"sources":["../../../src/component/connection/audit.ts"],"sourcesContent":["/**\n * `component.connection.audit.*` - Connection audit projections backed by auth events.\n *\n * @module\n */\n\nimport { paginationOptsValidator } from \"convex/server\";\nimport { paginator } from \"convex-helpers/server/pagination\";\nimport { ConvexError, v, type Infer } from \"convex/values\";\n\nimport { ErrorCode } from \"../../shared/codes\";\nimport { EVENT_KIND_CATEGORY, type AuthEventKind } from \"../../shared/event/kinds\";\nimport type { Doc } from \"../_generated/dataModel\";\nimport { query } from \"../functions\";\nimport { vAuthEventData, vAuthEventProjectionDoc, vPaginated } from \"../model\";\nimport schema from \"../schema\";\n\nconst PUBLIC_DATA_KEYS = {\n user: [\"type\", \"provider\", \"existingUserId\"],\n session: [\"provider\", \"method\", \"reason\"],\n account: [\"provider\", \"accountId\"],\n password: [\"userId\"],\n passkey: [\"passkeyId\"],\n totp: [\"totpId\"],\n email: [\"userId\"],\n phone: [\"userId\"],\n api_key: [\"keyId\", \"name\", \"prefix\", \"reason\"],\n oauth: [\"clientId\", \"codeId\", \"scopes\", \"grantType\", \"resource\"],\n connection: [\n \"connectionId\",\n \"protocol\",\n \"domain\",\n \"recordName\",\n \"expiresAt\",\n \"verifiedAt\",\n \"metadataUrl\",\n \"domains\",\n \"version\",\n \"errorCode\",\n \"issuer\",\n \"discoveryUrl\",\n \"jwksUri\",\n \"audience\",\n \"tokenEndpointAuthMethod\",\n ],\n scim: [\n \"scimConfigId\",\n \"resourceType\",\n \"resourceId\",\n \"operation\",\n \"externalId\",\n \"active\",\n \"groupId\",\n \"userId\",\n ],\n webhook: [\n \"endpointId\",\n \"deliveryId\",\n \"sourceEventId\",\n \"sourceEventType\",\n \"attemptCount\",\n \"status\",\n \"error\",\n ],\n security: [\"reason\", \"errorCode\"],\n} as const;\n\nfunction publicData(kind: AuthEventKind, value: unknown): Infer<typeof vAuthEventData> | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const category = EVENT_KIND_CATEGORY[kind];\n const keys = PUBLIC_DATA_KEYS[category] ?? [];\n const source = value as Record<string, unknown>;\n const redacted: Record<string, unknown> = {};\n for (const key of keys) {\n const nested = source[key];\n if (nested !== undefined) redacted[key] = nested;\n }\n return Object.keys(redacted).length === 0\n ? undefined\n : (redacted as Infer<typeof vAuthEventData>);\n}\n\nfunction publicProjection(doc: Doc<\"AuthEventProjection\">) {\n return {\n _id: doc._id,\n _creationTime: doc._creationTime,\n eventId: doc.eventId,\n targetKind: doc.targetKind,\n targetId: doc.targetId,\n kind: doc.kind,\n category: doc.category,\n occurredAt: doc.occurredAt,\n actorType: doc.actorType,\n actorId: doc.actorId,\n subjectType: doc.subjectType,\n subjectId: doc.subjectId,\n outcome: doc.outcome,\n errorCode: doc.errorCode,\n requestId: doc.requestId,\n ip: undefined,\n data: publicData(doc.kind, doc.data),\n };\n}\n\n/**\n * List audit-event projections for a connection or a group, newest first and\n * paginated. Rows are redacted to public fields (IP dropped, `data` narrowed to\n * an allowlist). Requires exactly one of `connectionId` or `groupId` — passing\n * neither throws rather than scanning the entire audit log.\n */\nexport const list = query({\n args: {\n connectionId: v.optional(v.id(\"GroupConnection\")),\n groupId: v.optional(v.id(\"Group\")),\n paginationOpts: paginationOptsValidator,\n },\n returns: vPaginated(vAuthEventProjectionDoc),\n handler: async (ctx, args) => {\n if (args.connectionId !== undefined) {\n const result = await paginator(ctx.db, schema)\n .query(\"AuthEventProjection\")\n .withIndex(\"target_time\", (idx) =>\n idx.eq(\"targetKind\", \"connection\").eq(\"targetId\", args.connectionId!),\n )\n .order(\"desc\")\n .paginate(args.paginationOpts);\n return { ...result, page: result.page.map(publicProjection) };\n }\n if (args.groupId !== undefined) {\n const result = await paginator(ctx.db, schema)\n .query(\"AuthEventProjection\")\n .withIndex(\"target_time\", (idx) =>\n idx.eq(\"targetKind\", \"group\").eq(\"targetId\", args.groupId!),\n )\n .order(\"desc\")\n .paginate(args.paginationOpts);\n return { ...result, page: result.page.map(publicProjection) };\n }\n throw new ConvexError({\n code: ErrorCode.INVALID_PARAMETERS,\n message:\n \"connection.audit.list requires either `connectionId` or `groupId` to target the query. Passing neither would walk the entire audit log.\",\n });\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,MAAM,mBAAmB;CACvB,MAAM;EAAC;EAAQ;EAAY;EAAiB;CAC5C,SAAS;EAAC;EAAY;EAAU;EAAS;CACzC,SAAS,CAAC,YAAY,YAAY;CAClC,UAAU,CAAC,SAAS;CACpB,SAAS,CAAC,YAAY;CACtB,MAAM,CAAC,SAAS;CAChB,OAAO,CAAC,SAAS;CACjB,OAAO,CAAC,SAAS;CACjB,SAAS;EAAC;EAAS;EAAQ;EAAU;EAAS;CAC9C,OAAO;EAAC;EAAY;EAAU;EAAU;EAAa;EAAW;CAChE,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,UAAU,CAAC,UAAU,YAAY;CAClC;AAED,SAAS,WAAW,MAAqB,OAA0D;AACjG,KAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,MAAM,CAAE,QAAO;CAEhF,MAAM,OAAO,iBADI,oBAAoB,UACM,EAAE;CAC7C,MAAM,SAAS;CACf,MAAM,WAAoC,EAAE;AAC5C,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,SAAS,OAAO;AACtB,MAAI,WAAW,OAAW,UAAS,OAAO;;AAE5C,QAAO,OAAO,KAAK,SAAS,CAAC,WAAW,IACpC,SACC;;AAGP,SAAS,iBAAiB,KAAiC;AACzD,QAAO;EACL,KAAK,IAAI;EACT,eAAe,IAAI;EACnB,SAAS,IAAI;EACb,YAAY,IAAI;EAChB,UAAU,IAAI;EACd,MAAM,IAAI;EACV,UAAU,IAAI;EACd,YAAY,IAAI;EAChB,WAAW,IAAI;EACf,SAAS,IAAI;EACb,aAAa,IAAI;EACjB,WAAW,IAAI;EACf,SAAS,IAAI;EACb,WAAW,IAAI;EACf,WAAW,IAAI;EACf,IAAI;EACJ,MAAM,WAAW,IAAI,MAAM,IAAI,KAAK;EACrC;;;;;;;;AASH,MAAa,OAAO,MAAM;CACxB,MAAM;EACJ,cAAc,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC;EACjD,SAAS,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;EAClC,gBAAgB;EACjB;CACD,SAAS,WAAW,wBAAwB;CAC5C,SAAS,OAAO,KAAK,SAAS;AAC5B,MAAI,KAAK,iBAAiB,QAAW;GACnC,MAAM,SAAS,MAAM,UAAU,IAAI,IAAIA,eAAO,CAC3C,MAAM,sBAAsB,CAC5B,UAAU,gBAAgB,QACzB,IAAI,GAAG,cAAc,aAAa,CAAC,GAAG,YAAY,KAAK,aAAc,CACtE,CACA,MAAM,OAAO,CACb,SAAS,KAAK,eAAe;AAChC,UAAO;IAAE,GAAG;IAAQ,MAAM,OAAO,KAAK,IAAI,iBAAiB;IAAE;;AAE/D,MAAI,KAAK,YAAY,QAAW;GAC9B,MAAM,SAAS,MAAM,UAAU,IAAI,IAAIA,eAAO,CAC3C,MAAM,sBAAsB,CAC5B,UAAU,gBAAgB,QACzB,IAAI,GAAG,cAAc,QAAQ,CAAC,GAAG,YAAY,KAAK,QAAS,CAC5D,CACA,MAAM,OAAO,CACb,SAAS,KAAK,eAAe;AAChC,UAAO;IAAE,GAAG;IAAQ,MAAM,OAAO,KAAK,IAAI,iBAAiB;IAAE;;AAE/D,QAAM,IAAI,YAAY;GACpB,MAAM,UAAU;GAChB,SACE;GACH,CAAC;;CAEL,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as convex_server215 from "convex/server";
|
|
2
2
|
|
|
3
3
|
//#region src/component/connection/cache.d.ts
|
|
4
4
|
declare namespace cache_d_exports {
|
|
@@ -27,7 +27,7 @@ declare namespace cache_d_exports {
|
|
|
27
27
|
/**
|
|
28
28
|
* Read-through fetch for OIDC discovery JSON. Cached 1h per URL.
|
|
29
29
|
*/
|
|
30
|
-
declare const oidcDiscovery:
|
|
30
|
+
declare const oidcDiscovery: convex_server215.RegisteredAction<"public", {
|
|
31
31
|
runtimeOrigin?: string | undefined;
|
|
32
32
|
externalHost?: string | undefined;
|
|
33
33
|
url: string;
|
|
@@ -45,7 +45,7 @@ declare const oidcDiscovery: convex_server210.RegisteredAction<"public", {
|
|
|
45
45
|
* Cached 2h per URL (separate from the runtime sign-in path so admin
|
|
46
46
|
* dashboards don't share keys with hot-path traffic).
|
|
47
47
|
*/
|
|
48
|
-
declare const oidcStatusDiscovery:
|
|
48
|
+
declare const oidcStatusDiscovery: convex_server215.RegisteredAction<"public", {
|
|
49
49
|
runtimeOrigin?: string | undefined;
|
|
50
50
|
externalHost?: string | undefined;
|
|
51
51
|
url: string;
|
|
@@ -61,19 +61,19 @@ declare const oidcStatusDiscovery: convex_server210.RegisteredAction<"public", {
|
|
|
61
61
|
/**
|
|
62
62
|
* Read-through fetch for SAML IdP metadata XML. Cached 24h per URL.
|
|
63
63
|
*/
|
|
64
|
-
declare const samlMetadata:
|
|
64
|
+
declare const samlMetadata: convex_server215.RegisteredAction<"public", {
|
|
65
65
|
runtimeOrigin?: string | undefined;
|
|
66
66
|
externalHost?: string | undefined;
|
|
67
67
|
url: string;
|
|
68
68
|
}, Promise<string>>;
|
|
69
69
|
/** Invalidate a cached OIDC discovery entry (e.g. on `discoveryUrl` update). */
|
|
70
|
-
declare const invalidateOidcDiscovery:
|
|
70
|
+
declare const invalidateOidcDiscovery: convex_server215.RegisteredMutation<"public", {
|
|
71
71
|
runtimeOrigin?: string | undefined;
|
|
72
72
|
externalHost?: string | undefined;
|
|
73
73
|
url: string;
|
|
74
74
|
}, Promise<null>>;
|
|
75
75
|
/** Invalidate a cached SAML metadata entry (e.g. on `metadataUrl` update). */
|
|
76
|
-
declare const invalidateSamlMetadata:
|
|
76
|
+
declare const invalidateSamlMetadata: convex_server215.RegisteredMutation<"public", {
|
|
77
77
|
runtimeOrigin?: string | undefined;
|
|
78
78
|
externalHost?: string | undefined;
|
|
79
79
|
url: string;
|