@voyant-travel/auth 0.113.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.
Files changed (68) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +225 -0
  3. package/dist/api-token-rotation.d.ts +54 -0
  4. package/dist/api-token-rotation.d.ts.map +1 -0
  5. package/dist/api-token-rotation.js +134 -0
  6. package/dist/api-token-rotation.js.map +1 -0
  7. package/dist/auth-facades.d.ts +62 -0
  8. package/dist/auth-facades.d.ts.map +1 -0
  9. package/dist/auth-facades.js +252 -0
  10. package/dist/auth-facades.js.map +1 -0
  11. package/dist/backend.d.ts +10 -0
  12. package/dist/backend.d.ts.map +1 -0
  13. package/dist/backend.js +15 -0
  14. package/dist/backend.js.map +1 -0
  15. package/dist/cloud-admin-session-public.d.ts +67 -0
  16. package/dist/cloud-admin-session-public.d.ts.map +1 -0
  17. package/dist/cloud-admin-session-public.js +2 -0
  18. package/dist/cloud-admin-session-public.js.map +1 -0
  19. package/dist/cloud-admin-session-revalidation-store.d.ts +17 -0
  20. package/dist/cloud-admin-session-revalidation-store.d.ts.map +1 -0
  21. package/dist/cloud-admin-session-revalidation-store.js +64 -0
  22. package/dist/cloud-admin-session-revalidation-store.js.map +1 -0
  23. package/dist/cloud-admin-session.d.ts +70 -0
  24. package/dist/cloud-admin-session.d.ts.map +1 -0
  25. package/dist/cloud-admin-session.js +319 -0
  26. package/dist/cloud-admin-session.js.map +1 -0
  27. package/dist/cloud-broker/assertion.d.ts +69 -0
  28. package/dist/cloud-broker/assertion.d.ts.map +1 -0
  29. package/dist/cloud-broker/assertion.js +226 -0
  30. package/dist/cloud-broker/assertion.js.map +1 -0
  31. package/dist/cloud-broker/state.d.ts +55 -0
  32. package/dist/cloud-broker/state.d.ts.map +1 -0
  33. package/dist/cloud-broker/state.js +191 -0
  34. package/dist/cloud-broker/state.js.map +1 -0
  35. package/dist/cloud-broker/utils.d.ts +7 -0
  36. package/dist/cloud-broker/utils.d.ts.map +1 -0
  37. package/dist/cloud-broker/utils.js +50 -0
  38. package/dist/cloud-broker/utils.js.map +1 -0
  39. package/dist/cloud-broker.d.ts +5 -0
  40. package/dist/cloud-broker.d.ts.map +1 -0
  41. package/dist/cloud-broker.js +3 -0
  42. package/dist/cloud-broker.js.map +1 -0
  43. package/dist/edge.d.ts +28 -0
  44. package/dist/edge.d.ts.map +1 -0
  45. package/dist/edge.js +106 -0
  46. package/dist/edge.js.map +1 -0
  47. package/dist/index.d.ts +15 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +42 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/permissions.d.ts +141 -0
  52. package/dist/permissions.d.ts.map +1 -0
  53. package/dist/permissions.js +46 -0
  54. package/dist/permissions.js.map +1 -0
  55. package/dist/server.d.ts +106 -0
  56. package/dist/server.d.ts.map +1 -0
  57. package/dist/server.js +193 -0
  58. package/dist/server.js.map +1 -0
  59. package/dist/trusted-origins.d.ts +9 -0
  60. package/dist/trusted-origins.d.ts.map +1 -0
  61. package/dist/trusted-origins.js +41 -0
  62. package/dist/trusted-origins.js.map +1 -0
  63. package/dist/tsconfig.tsbuildinfo +1 -0
  64. package/dist/workspace.d.ts +43 -0
  65. package/dist/workspace.d.ts.map +1 -0
  66. package/dist/workspace.js +146 -0
  67. package/dist/workspace.js.map +1 -0
  68. package/package.json +81 -0
@@ -0,0 +1,62 @@
1
+ import type { getDb } from "@voyant-travel/db";
2
+ import { type ApiTokenRotationOptions, type ApiTokenRotationStore } from "./api-token-rotation.js";
3
+ import { type CurrentUser, type UpdateCurrentUserProfileInput } from "./workspace.js";
4
+ type BetterAuthApiKeySession = {
5
+ user: {
6
+ id: string;
7
+ };
8
+ };
9
+ type BetterAuthApiKeyApi = {
10
+ getSession: (args: {
11
+ headers: Headers;
12
+ }) => Promise<BetterAuthApiKeySession | null>;
13
+ listApiKeys: (args: {
14
+ query?: Record<string, unknown>;
15
+ headers: Headers;
16
+ }) => Promise<unknown>;
17
+ createApiKey: (args: {
18
+ body: Record<string, unknown>;
19
+ headers?: Headers;
20
+ }) => Promise<unknown>;
21
+ updateApiKey: (args: {
22
+ body: Record<string, unknown>;
23
+ headers?: Headers;
24
+ }) => Promise<unknown>;
25
+ deleteApiKey: (args: {
26
+ body: Record<string, unknown>;
27
+ headers: Headers;
28
+ }) => Promise<unknown>;
29
+ };
30
+ export type BetterAuthApiTokenManagement = {
31
+ api: BetterAuthApiKeyApi;
32
+ };
33
+ export interface HandleApiTokenManagementRequestOptions extends ApiTokenRotationOptions {
34
+ /**
35
+ * Auth route mount path. Voyant operator APIs mount Better Auth under
36
+ * `/auth`, which makes the facade routes `/auth/api-tokens`.
37
+ */
38
+ basePath?: string;
39
+ }
40
+ export interface HandleAccountProfileRequestOptions {
41
+ /**
42
+ * Auth route mount path. Voyant operator APIs mount Better Auth under
43
+ * `/auth`, which makes the account profile route `/auth/me`.
44
+ */
45
+ basePath?: string;
46
+ db: ReturnType<typeof getDb>;
47
+ updateProfile?: AccountProfileUpdateHandler;
48
+ }
49
+ export type AccountProfileUpdateHandler = (db: ReturnType<typeof getDb>, input: UpdateCurrentUserProfileInput) => Promise<CurrentUser | null>;
50
+ export type { ApiTokenRotationStore };
51
+ /** Handles Voyant's stable `PATCH /auth/me` account-profile facade. */
52
+ export declare function handleAccountProfileRequest(request: Request, auth: {
53
+ api: unknown;
54
+ }, options: HandleAccountProfileRequestOptions): Promise<Response | null>;
55
+ /**
56
+ * Handles Voyant's stable `/auth/api-tokens` management facade, including
57
+ * create, list, update, delete, and secret rotation.
58
+ */
59
+ export declare function handleApiTokenManagementRequest(request: Request, auth: {
60
+ api: unknown;
61
+ }, options?: HandleApiTokenManagementRequestOptions): Promise<Response | null>;
62
+ //# sourceMappingURL=auth-facades.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-facades.d.ts","sourceRoot":"","sources":["../src/auth-facades.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAE3B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,6BAA6B,EAEnC,MAAM,gBAAgB,CAAA;AAEvB,KAAK,uBAAuB,GAAG;IAC7B,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAA;KACX,CAAA;CACF,CAAA;AAED,KAAK,mBAAmB,GAAG;IACzB,UAAU,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAA;IACnF,WAAW,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9F,YAAY,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9F,YAAY,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9F,YAAY,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9F,CAAA;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC,GAAG,EAAE,mBAAmB,CAAA;CACzB,CAAA;AAED,MAAM,WAAW,sCAAuC,SAAQ,uBAAuB;IACrF;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,kCAAkC;IACjD;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,EAAE,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,CAAA;IAC5B,aAAa,CAAC,EAAE,2BAA2B,CAAA;CAC5C;AAED,MAAM,MAAM,2BAA2B,GAAG,CACxC,EAAE,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,EAC5B,KAAK,EAAE,6BAA6B,KACjC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;AAiChC,YAAY,EAAE,qBAAqB,EAAE,CAAA;AA+IrC,uEAAuE;AACvE,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,EACtB,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyB1B;AAED;;;GAGG;AACH,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,EACtB,OAAO,GAAE,sCAA2C,GACnD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA2F1B"}
@@ -0,0 +1,252 @@
1
+ import { rotateApiTokenSecret, } from "./api-token-rotation.js";
2
+ import { updateCurrentUserProfile, } from "./workspace.js";
3
+ const API_TOKEN_QUERY_FIELDS = [
4
+ "configId",
5
+ "organizationId",
6
+ "limit",
7
+ "offset",
8
+ "sortBy",
9
+ "sortDirection",
10
+ ];
11
+ const API_TOKEN_CREATE_FIELDS = [
12
+ "configId",
13
+ "name",
14
+ "expiresIn",
15
+ "remaining",
16
+ "prefix",
17
+ "organizationId",
18
+ "metadata",
19
+ "permissions",
20
+ ];
21
+ const API_TOKEN_UPDATE_FIELDS = [
22
+ "configId",
23
+ "name",
24
+ "enabled",
25
+ "expiresIn",
26
+ "metadata",
27
+ "permissions",
28
+ ];
29
+ function normalizeApiTokenErrorStatus(status) {
30
+ if (status === 401 ||
31
+ status === 403 ||
32
+ status === 404 ||
33
+ status === 405 ||
34
+ status === 429 ||
35
+ status === 500) {
36
+ return status;
37
+ }
38
+ return 400;
39
+ }
40
+ function authApiErrorResponse(error) {
41
+ const candidate = error;
42
+ const status = normalizeApiTokenErrorStatus(candidate.status ?? candidate.statusCode);
43
+ return jsonResponse({ error: candidate.message ?? "API token request failed" }, status);
44
+ }
45
+ function jsonResponse(body, status = 200, headers) {
46
+ return Response.json(body, { status, headers });
47
+ }
48
+ function methodNotAllowed(allowed) {
49
+ return jsonResponse({ error: "Method not allowed" }, 405, { Allow: allowed.join(", ") });
50
+ }
51
+ function apiTokenFacadePath(pathname, basePath) {
52
+ const trimmedBase = basePath.replace(/^\/+|\/+$/g, "");
53
+ const normalizedBase = trimmedBase ? `/${trimmedBase}` : "";
54
+ const normalizedPath = pathname.replace(/\/+$/g, "") || "/";
55
+ if (normalizedPath === `${normalizedBase}/api-tokens`) {
56
+ return "/api-tokens";
57
+ }
58
+ if (normalizedPath.startsWith(`${normalizedBase}/api-tokens/`)) {
59
+ return normalizedPath.slice(normalizedBase.length);
60
+ }
61
+ return null;
62
+ }
63
+ function accountProfileFacadePath(pathname, basePath) {
64
+ const trimmedBase = basePath.replace(/^\/+|\/+$/g, "");
65
+ const normalizedBase = trimmedBase ? `/${trimmedBase}` : "";
66
+ const normalizedPath = pathname.replace(/\/+$/g, "") || "/";
67
+ return normalizedPath === `${normalizedBase}/me` ? "/me" : null;
68
+ }
69
+ function readApiKeyQuery(request) {
70
+ const query = {};
71
+ const params = new URL(request.url).searchParams;
72
+ for (const key of API_TOKEN_QUERY_FIELDS) {
73
+ const value = params.get(key);
74
+ if (value === null)
75
+ continue;
76
+ query[key] = key === "limit" || key === "offset" ? Number(value) : value;
77
+ }
78
+ return query;
79
+ }
80
+ function readProfileUpdate(body) {
81
+ const input = {};
82
+ for (const field of [
83
+ "firstName",
84
+ "lastName",
85
+ "locale",
86
+ "timezone",
87
+ "profilePictureUrl",
88
+ ]) {
89
+ const value = body[field];
90
+ if (value === undefined)
91
+ continue;
92
+ if (value !== null && typeof value !== "string") {
93
+ throw Object.assign(new Error(`${field} must be a string or null`), { status: 400 });
94
+ }
95
+ const maxLength = field === "locale"
96
+ ? 10
97
+ : field === "timezone"
98
+ ? 64
99
+ : field === "profilePictureUrl"
100
+ ? 2048
101
+ : 200;
102
+ if (typeof value === "string" && value.length > maxLength) {
103
+ throw Object.assign(new Error(`${field} must be ${maxLength} characters or fewer`), {
104
+ status: 400,
105
+ });
106
+ }
107
+ input[field] = value;
108
+ }
109
+ return input;
110
+ }
111
+ async function readOptionalJson(request) {
112
+ const text = await request.text();
113
+ if (!text)
114
+ return {};
115
+ const parsed = JSON.parse(text);
116
+ return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)
117
+ ? parsed
118
+ : {};
119
+ }
120
+ function pickFields(body, fields) {
121
+ const next = {};
122
+ for (const field of fields) {
123
+ if (body[field] !== undefined)
124
+ next[field] = body[field];
125
+ }
126
+ return next;
127
+ }
128
+ async function requireApiTokenSession(auth, headers) {
129
+ const session = await auth.api.getSession({ headers });
130
+ if (!session) {
131
+ throw Object.assign(new Error("Unauthorized"), { status: 401 });
132
+ }
133
+ return session;
134
+ }
135
+ async function requireAccountProfileSession(auth, headers) {
136
+ const session = await auth.api.getSession({ headers });
137
+ if (!session) {
138
+ throw Object.assign(new Error("Unauthorized"), { status: 401 });
139
+ }
140
+ return session;
141
+ }
142
+ /** Handles Voyant's stable `PATCH /auth/me` account-profile facade. */
143
+ export async function handleAccountProfileRequest(request, auth, options) {
144
+ const path = accountProfileFacadePath(new URL(request.url).pathname, options.basePath ?? "/auth");
145
+ if (path === null)
146
+ return null;
147
+ try {
148
+ if (request.method !== "PATCH")
149
+ return null;
150
+ const session = await requireAccountProfileSession({ api: auth.api }, request.headers);
151
+ const body = await readOptionalJson(request);
152
+ const profile = await (options.updateProfile ?? updateCurrentUserProfile)(options.db, {
153
+ userId: session.user.id,
154
+ ...readProfileUpdate(body),
155
+ });
156
+ if (!profile) {
157
+ return jsonResponse({ error: "User not found" }, 404);
158
+ }
159
+ return jsonResponse(profile);
160
+ }
161
+ catch (error) {
162
+ return authApiErrorResponse(error);
163
+ }
164
+ }
165
+ /**
166
+ * Handles Voyant's stable `/auth/api-tokens` management facade, including
167
+ * create, list, update, delete, and secret rotation.
168
+ */
169
+ export async function handleApiTokenManagementRequest(request, auth, options = {}) {
170
+ const path = apiTokenFacadePath(new URL(request.url).pathname, options.basePath ?? "/auth");
171
+ if (path === null)
172
+ return null;
173
+ const api = auth.api;
174
+ const rotateMatch = path.match(/^\/api-tokens\/([^/]+)\/rotate$/);
175
+ const keyMatch = path.match(/^\/api-tokens\/([^/]+)$/);
176
+ try {
177
+ if (path === "/api-tokens") {
178
+ if (request.method === "GET") {
179
+ const result = await api.listApiKeys({
180
+ query: readApiKeyQuery(request),
181
+ headers: request.headers,
182
+ });
183
+ return jsonResponse(result);
184
+ }
185
+ if (request.method === "POST") {
186
+ const body = await readOptionalJson(request);
187
+ const session = await requireApiTokenSession({ api }, request.headers);
188
+ const result = await api.createApiKey({
189
+ body: {
190
+ ...pickFields(body, API_TOKEN_CREATE_FIELDS),
191
+ userId: session.user.id,
192
+ },
193
+ });
194
+ return jsonResponse(result, 201);
195
+ }
196
+ return methodNotAllowed(["GET", "POST"]);
197
+ }
198
+ if (rotateMatch?.[1]) {
199
+ if (request.method !== "POST")
200
+ return methodNotAllowed(["POST"]);
201
+ const keyId = decodeURIComponent(rotateMatch[1]);
202
+ const body = await readOptionalJson(request);
203
+ const session = await requireApiTokenSession({ api }, request.headers);
204
+ const result = await rotateApiTokenSecret({
205
+ keyId,
206
+ body,
207
+ userId: session.user.id,
208
+ options,
209
+ authorize: async ({ configId, enabled, keyId, userId }) => {
210
+ await api.updateApiKey({
211
+ body: {
212
+ ...(configId ? { configId } : {}),
213
+ keyId,
214
+ enabled,
215
+ userId,
216
+ },
217
+ });
218
+ },
219
+ });
220
+ return jsonResponse(result);
221
+ }
222
+ if (keyMatch?.[1]) {
223
+ const keyId = decodeURIComponent(keyMatch[1]);
224
+ if (request.method === "POST") {
225
+ const body = await readOptionalJson(request);
226
+ const session = await requireApiTokenSession({ api }, request.headers);
227
+ const result = await api.updateApiKey({
228
+ body: {
229
+ ...pickFields(body, API_TOKEN_UPDATE_FIELDS),
230
+ keyId,
231
+ userId: session.user.id,
232
+ },
233
+ });
234
+ return jsonResponse(result);
235
+ }
236
+ if (request.method === "DELETE") {
237
+ const body = await readOptionalJson(request);
238
+ const result = await api.deleteApiKey({
239
+ body: { ...pickFields(body, ["configId"]), keyId },
240
+ headers: request.headers,
241
+ });
242
+ return jsonResponse(result);
243
+ }
244
+ return methodNotAllowed(["POST", "DELETE"]);
245
+ }
246
+ return jsonResponse({ error: "Not found" }, 404);
247
+ }
248
+ catch (error) {
249
+ return authApiErrorResponse(error);
250
+ }
251
+ }
252
+ //# sourceMappingURL=auth-facades.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-facades.js","sourceRoot":"","sources":["../src/auth-facades.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type VerifyTokenOptions = {
2
+ secretKey: string;
3
+ clockSkewInMs?: number;
4
+ };
5
+ export declare function verifyToken(token: string, options: VerifyTokenOptions): Promise<{
6
+ sub: string;
7
+ sid?: string;
8
+ }>;
9
+ export declare function createApiTokenFromUserId(userId: string, secret: string): Promise<string>;
10
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC;IACT,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAC,CAUD;AAED,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE9F"}
@@ -0,0 +1,15 @@
1
+ import { signSessionClaims, verifySessionClaims } from "@voyant-travel/utils/session-claims";
2
+ export async function verifyToken(token, options) {
3
+ const claims = await verifySessionClaims(token, options.secretKey);
4
+ if (!claims) {
5
+ throw new Error("Invalid or expired token");
6
+ }
7
+ return {
8
+ sub: claims.userId,
9
+ sid: claims.sessionId,
10
+ };
11
+ }
12
+ export async function createApiTokenFromUserId(userId, secret) {
13
+ return signSessionClaims(userId, `session:${userId}`, secret);
14
+ }
15
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AAO5F,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAa,EACb,OAA2B;IAK3B,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IAClE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IAC7C,CAAC;IAED,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,MAAM;QAClB,GAAG,EAAE,MAAM,CAAC,SAAS;KACtB,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAAc,EAAE,MAAc;IAC3E,OAAO,iBAAiB,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE,EAAE,MAAM,CAAC,CAAA;AAC/D,CAAC"}
@@ -0,0 +1,67 @@
1
+ import type { getDb } from "@voyant-travel/db";
2
+ import type { BetterAuthPlugin } from "better-auth/types";
3
+ import type { CloudAdminAssertion, CloudAdminAuthExchangeConfig, CloudAdminAuthRevalidateConfig } from "./cloud-broker.js";
4
+ export type CloudAdminProvisionedUser = {
5
+ id: string;
6
+ name: string;
7
+ email: string;
8
+ emailVerified: boolean;
9
+ image?: string | null;
10
+ createdAt: Date;
11
+ updatedAt: Date;
12
+ };
13
+ export type CloudAdminUserProvisioningInput = {
14
+ db: ReturnType<typeof getDb>;
15
+ assertion: CloudAdminAssertion;
16
+ user: CloudAdminProvisionedUser;
17
+ isNewUser: boolean;
18
+ provider: {
19
+ providerId: "voyant-cloud";
20
+ providerAccountId: string;
21
+ };
22
+ };
23
+ export type CloudAdminUserProvisioningHandler = (input: CloudAdminUserProvisioningInput) => Promise<void> | void;
24
+ export interface VoyantCloudAdminAuthPluginOptions {
25
+ db: ReturnType<typeof getDb>;
26
+ cookieSecret: string;
27
+ exchange: CloudAdminAuthExchangeConfig;
28
+ fetch?: typeof fetch;
29
+ revalidateAfterSeconds?: number;
30
+ onUserProvisioning?: CloudAdminUserProvisioningHandler;
31
+ }
32
+ export declare function createVoyantCloudAdminAuthPlugin(options: VoyantCloudAdminAuthPluginOptions): BetterAuthPlugin;
33
+ export type VoyantCloudAdminSessionRevalidationInput = {
34
+ db: ReturnType<typeof getDb>;
35
+ sessionId: string;
36
+ config: CloudAdminAuthRevalidateConfig;
37
+ fetch?: typeof fetch;
38
+ now?: Date;
39
+ revalidateAfterSeconds?: number;
40
+ };
41
+ export type VoyantCloudAdminSessionRevalidationResult = {
42
+ ok: true;
43
+ status: "active" | "cached";
44
+ } | {
45
+ ok: false;
46
+ status: "revoked";
47
+ reason?: string;
48
+ };
49
+ export declare function revalidateVoyantCloudAdminAuthSession(input: VoyantCloudAdminSessionRevalidationInput): Promise<VoyantCloudAdminSessionRevalidationResult>;
50
+ export type VoyantCloudAdminUserRevalidationInput = {
51
+ db: ReturnType<typeof getDb>;
52
+ userId: string;
53
+ config: CloudAdminAuthRevalidateConfig;
54
+ fetch?: typeof fetch;
55
+ now?: Date;
56
+ revalidateAfterSeconds?: number;
57
+ };
58
+ export type VoyantCloudAdminUserRevalidationResult = {
59
+ ok: true;
60
+ status: "active" | "cached";
61
+ } | {
62
+ ok: false;
63
+ status: "revoked";
64
+ reason?: string;
65
+ };
66
+ export declare function revalidateVoyantCloudAdminAuthUser(input: VoyantCloudAdminUserRevalidationInput): Promise<VoyantCloudAdminUserRevalidationResult>;
67
+ //# sourceMappingURL=cloud-admin-session-public.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-admin-session-public.d.ts","sourceRoot":"","sources":["../src/cloud-admin-session-public.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cloud-admin-session-public.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-admin-session-public.js","sourceRoot":"","sources":["../src/cloud-admin-session-public.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import type { getDb } from "@voyant-travel/db";
2
+ export declare function markCloudAuthSessionRevalidated(db: ReturnType<typeof getDb>, input: {
3
+ sessionId: string;
4
+ userId: string;
5
+ now: Date;
6
+ revalidateAfterSeconds: number;
7
+ }): Promise<void>;
8
+ export declare function revokeCloudAuthUserAccess(db: ReturnType<typeof getDb>, input: {
9
+ sessionId?: string;
10
+ userId: string;
11
+ now: Date;
12
+ }): Promise<void>;
13
+ export declare function markCloudAuthUserRevalidated(db: ReturnType<typeof getDb>, input: {
14
+ userId: string;
15
+ now: Date;
16
+ }): Promise<void>;
17
+ //# sourceMappingURL=cloud-admin-session-revalidation-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-admin-session-revalidation-store.d.ts","sourceRoot":"","sources":["../src/cloud-admin-session-revalidation-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAQ9C,wBAAsB,+BAA+B,CACnD,EAAE,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,EAC5B,KAAK,EAAE;IACL,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,IAAI,CAAA;IACT,sBAAsB,EAAE,MAAM,CAAA;CAC/B,GACA,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,EAC5B,KAAK,EAAE;IACL,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,IAAI,CAAA;CACV,GACA,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED,wBAAsB,4BAA4B,CAChD,EAAE,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,EAC5B,KAAK,EAAE;IACL,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,IAAI,CAAA;CACV,GACA,OAAO,CAAC,IAAI,CAAC,CASf"}
@@ -0,0 +1,64 @@
1
+ import { apikeyTable, cloudAuthSessionLinks, cloudAuthUserLinks, } from "@voyant-travel/db/schema/iam";
2
+ import { eq } from "drizzle-orm";
3
+ export async function markCloudAuthSessionRevalidated(db, input) {
4
+ const revalidateAfter = new Date(input.now.getTime() + input.revalidateAfterSeconds * 1000);
5
+ await Promise.all([
6
+ db
7
+ .update(cloudAuthSessionLinks)
8
+ .set({
9
+ lastRevalidatedAt: input.now,
10
+ revalidateAfter,
11
+ revokedAt: null,
12
+ updatedAt: input.now,
13
+ })
14
+ .where(eq(cloudAuthSessionLinks.sessionId, input.sessionId)),
15
+ db
16
+ .update(cloudAuthUserLinks)
17
+ .set({
18
+ lastRevalidatedAt: input.now,
19
+ revokedAt: null,
20
+ updatedAt: input.now,
21
+ })
22
+ .where(eq(cloudAuthUserLinks.userId, input.userId)),
23
+ ]);
24
+ }
25
+ export async function revokeCloudAuthUserAccess(db, input) {
26
+ const updates = [
27
+ db
28
+ .update(cloudAuthUserLinks)
29
+ .set({
30
+ revokedAt: input.now,
31
+ lastRevalidatedAt: input.now,
32
+ updatedAt: input.now,
33
+ })
34
+ .where(eq(cloudAuthUserLinks.userId, input.userId)),
35
+ db
36
+ .update(apikeyTable)
37
+ .set({
38
+ enabled: false,
39
+ updatedAt: input.now,
40
+ })
41
+ .where(eq(apikeyTable.referenceId, input.userId)),
42
+ ];
43
+ if (input.sessionId) {
44
+ updates.push(db
45
+ .update(cloudAuthSessionLinks)
46
+ .set({
47
+ revokedAt: input.now,
48
+ updatedAt: input.now,
49
+ })
50
+ .where(eq(cloudAuthSessionLinks.sessionId, input.sessionId)));
51
+ }
52
+ await Promise.all(updates);
53
+ }
54
+ export async function markCloudAuthUserRevalidated(db, input) {
55
+ await db
56
+ .update(cloudAuthUserLinks)
57
+ .set({
58
+ lastRevalidatedAt: input.now,
59
+ revokedAt: null,
60
+ updatedAt: input.now,
61
+ })
62
+ .where(eq(cloudAuthUserLinks.userId, input.userId));
63
+ }
64
+ //# sourceMappingURL=cloud-admin-session-revalidation-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-admin-session-revalidation-store.js","sourceRoot":"","sources":["../src/cloud-admin-session-revalidation-store.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,EAA4B,EAC5B,KAKC;IAED,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAA;IAC3F,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,EAAE;aACC,MAAM,CAAC,qBAAqB,CAAC;aAC7B,GAAG,CAAC;YACH,iBAAiB,EAAE,KAAK,CAAC,GAAG;YAC5B,eAAe;YACf,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,KAAK,CAAC,GAAG;SACrB,CAAC;aACD,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9D,EAAE;aACC,MAAM,CAAC,kBAAkB,CAAC;aAC1B,GAAG,CAAC;YACH,iBAAiB,EAAE,KAAK,CAAC,GAAG;YAC5B,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,KAAK,CAAC,GAAG;SACrB,CAAC;aACD,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;KACtD,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,EAA4B,EAC5B,KAIC;IAED,MAAM,OAAO,GAA4B;QACvC,EAAE;aACC,MAAM,CAAC,kBAAkB,CAAC;aAC1B,GAAG,CAAC;YACH,SAAS,EAAE,KAAK,CAAC,GAAG;YACpB,iBAAiB,EAAE,KAAK,CAAC,GAAG;YAC5B,SAAS,EAAE,KAAK,CAAC,GAAG;SACrB,CAAC;aACD,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACrD,EAAE;aACC,MAAM,CAAC,WAAW,CAAC;aACnB,GAAG,CAAC;YACH,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,KAAK,CAAC,GAAG;SACrB,CAAC;aACD,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;KACpD,CAAA;IAED,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CACV,EAAE;aACC,MAAM,CAAC,qBAAqB,CAAC;aAC7B,GAAG,CAAC;YACH,SAAS,EAAE,KAAK,CAAC,GAAG;YACpB,SAAS,EAAE,KAAK,CAAC,GAAG;SACrB,CAAC;aACD,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAC/D,CAAA;IACH,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,EAA4B,EAC5B,KAGC;IAED,MAAM,EAAE;SACL,MAAM,CAAC,kBAAkB,CAAC;SAC1B,GAAG,CAAC;QACH,iBAAiB,EAAE,KAAK,CAAC,GAAG;QAC5B,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,KAAK,CAAC,GAAG;KACrB,CAAC;SACD,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;AACvD,CAAC"}
@@ -0,0 +1,70 @@
1
+ import type { getDb } from "@voyant-travel/db";
2
+ import type { BetterAuthPlugin } from "better-auth/types";
3
+ import { type CloudAdminAssertion, type CloudAdminAuthExchangeConfig, type CloudAdminAuthRevalidateConfig } from "./cloud-broker.js";
4
+ export interface VoyantCloudAdminAuthPluginOptions {
5
+ db: ReturnType<typeof getDb>;
6
+ cookieSecret: string;
7
+ exchange: CloudAdminAuthExchangeConfig;
8
+ fetch?: typeof fetch;
9
+ revalidateAfterSeconds?: number;
10
+ onUserProvisioning?: CloudAdminUserProvisioningHandler;
11
+ }
12
+ export type VoyantCloudAdminSessionRevalidationInput = {
13
+ db: ReturnType<typeof getDb>;
14
+ sessionId: string;
15
+ config: CloudAdminAuthRevalidateConfig;
16
+ fetch?: typeof fetch;
17
+ now?: Date;
18
+ revalidateAfterSeconds?: number;
19
+ };
20
+ export type VoyantCloudAdminSessionRevalidationResult = {
21
+ ok: true;
22
+ status: "active" | "cached";
23
+ } | {
24
+ ok: false;
25
+ status: "revoked";
26
+ reason?: string;
27
+ };
28
+ export type VoyantCloudAdminUserRevalidationInput = {
29
+ db: ReturnType<typeof getDb>;
30
+ userId: string;
31
+ config: CloudAdminAuthRevalidateConfig;
32
+ fetch?: typeof fetch;
33
+ now?: Date;
34
+ revalidateAfterSeconds?: number;
35
+ };
36
+ export type VoyantCloudAdminUserRevalidationResult = {
37
+ ok: true;
38
+ status: "active" | "cached";
39
+ } | {
40
+ ok: false;
41
+ status: "revoked";
42
+ reason?: string;
43
+ };
44
+ declare const VOYANT_CLOUD_PROVIDER_ID = "voyant-cloud";
45
+ type BetterAuthUserForCookie = {
46
+ id: string;
47
+ name: string;
48
+ email: string;
49
+ emailVerified: boolean;
50
+ image?: string | null;
51
+ createdAt: Date;
52
+ updatedAt: Date;
53
+ };
54
+ export type CloudAdminProvisionedUser = BetterAuthUserForCookie;
55
+ export type CloudAdminUserProvisioningInput = {
56
+ db: ReturnType<typeof getDb>;
57
+ assertion: CloudAdminAssertion;
58
+ user: CloudAdminProvisionedUser;
59
+ isNewUser: boolean;
60
+ provider: {
61
+ providerId: typeof VOYANT_CLOUD_PROVIDER_ID;
62
+ providerAccountId: string;
63
+ };
64
+ };
65
+ export type CloudAdminUserProvisioningHandler = (input: CloudAdminUserProvisioningInput) => Promise<void> | void;
66
+ export declare function createVoyantCloudAdminAuthPlugin(options: VoyantCloudAdminAuthPluginOptions): BetterAuthPlugin;
67
+ export declare function revalidateVoyantCloudAdminAuthSession({ db, sessionId, config, fetch, now, revalidateAfterSeconds, }: VoyantCloudAdminSessionRevalidationInput): Promise<VoyantCloudAdminSessionRevalidationResult>;
68
+ export declare function revalidateVoyantCloudAdminAuthUser({ db, userId, config, fetch, now, revalidateAfterSeconds, }: VoyantCloudAdminUserRevalidationInput): Promise<VoyantCloudAdminUserRevalidationResult>;
69
+ export {};
70
+ //# sourceMappingURL=cloud-admin-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-admin-session.d.ts","sourceRoot":"","sources":["../src/cloud-admin-session.ts"],"names":[],"mappings":"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"}