@happyvertical/smrt-users 0.38.9 → 0.38.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/sveltekit.js CHANGED
@@ -1,8 +1,184 @@
1
- import { _ as resolveOidcProviderConfig, a as TerminalAuthRateLimitError, f as OidcLoginError, g as getUsersOidcConfig, h as encodeOidcTransaction, i as TerminalAuthError, l as withSessionPermissionContext, m as decodeOidcTransaction, o as TerminalAuthService, p as OidcLoginService, u as SessionService } from "./chunks/TerminalAuthService-BgwNOEPM.js";
1
+ import { C as encodeOidcTransaction, S as decodeOidcTransaction, T as resolveOidcProviderConfig, _ as validateMobileRedirectUri, a as TerminalAuthRateLimitError, b as OidcLoginError, g as readMobileBearerToken, h as MobileAuthService, i as TerminalAuthError, m as MobileAuthError, o as TerminalAuthService, p as withSessionPermissionContext, s as OperationPermissionError, v as SessionService, w as getUsersOidcConfig, x as OidcLoginService } from "./chunks/TerminalAuthService-DGp_Wsil.js";
2
2
  import { ObjectRegistry } from "@happyvertical/smrt-core";
3
3
  import { createLogger } from "@happyvertical/logger";
4
4
  import { classnameToTablename } from "@happyvertical/smrt-core/utils";
5
5
  import { methodNameToKebab, resolveApiActionSet } from "@happyvertical/smrt-core/vite-plugin";
6
+ //#region src/sveltekit/mobile-handlers.ts
7
+ var logger$1 = createLogger({ level: "info" });
8
+ var NO_STORE_HEADERS$1 = {
9
+ "cache-control": "private, no-store",
10
+ pragma: "no-cache"
11
+ };
12
+ function jsonResponse$2(body, status = 200) {
13
+ return new Response(JSON.stringify(body), {
14
+ status,
15
+ headers: {
16
+ "content-type": "application/json",
17
+ ...NO_STORE_HEADERS$1
18
+ }
19
+ });
20
+ }
21
+ function withNoStoreDefault(response) {
22
+ if (response.headers.has("cache-control")) return response;
23
+ const headers = new Headers(response.headers);
24
+ for (const [name, value] of Object.entries(NO_STORE_HEADERS$1)) headers.set(name, value);
25
+ return new Response(response.body, {
26
+ status: response.status,
27
+ statusText: response.statusText,
28
+ headers
29
+ });
30
+ }
31
+ function errorResponse(error) {
32
+ if (error instanceof MobileAuthError) {
33
+ if (error.status >= 500) logger$1.error("Mobile handler server error", {
34
+ code: error.code,
35
+ message: error.message
36
+ });
37
+ return jsonResponse$2({
38
+ error: error.message,
39
+ code: error.code
40
+ }, error.status);
41
+ }
42
+ if (error instanceof OperationPermissionError) return jsonResponse$2({
43
+ error: error.message,
44
+ code: "permission_denied",
45
+ reason: error.decision.reason,
46
+ permission: error.permission
47
+ }, error.status);
48
+ logger$1.error("Unexpected mobile handler error", { error });
49
+ return jsonResponse$2({
50
+ error: "Internal server error",
51
+ code: "internal_error"
52
+ }, 500);
53
+ }
54
+ async function readJsonBody(event) {
55
+ try {
56
+ const body = await event.request.json();
57
+ if (!body || typeof body !== "object" || Array.isArray(body)) throw new Error("not an object");
58
+ return body;
59
+ } catch {
60
+ throw new MobileAuthError(400, "invalid_request", "Request body must be a JSON object.");
61
+ }
62
+ }
63
+ function optionalString(value) {
64
+ return typeof value === "string" ? value : void 0;
65
+ }
66
+ function parseStartRequest(body) {
67
+ return {
68
+ providerId: optionalString(body.providerId),
69
+ redirectUri: optionalString(body.redirectUri) ?? "",
70
+ scopes: Array.isArray(body.scopes) ? body.scopes.filter((scope) => typeof scope === "string") : void 0,
71
+ state: optionalString(body.state),
72
+ loginHint: optionalString(body.loginHint)
73
+ };
74
+ }
75
+ function parseCompleteRequest(body) {
76
+ return {
77
+ providerId: optionalString(body.providerId),
78
+ code: optionalString(body.code) ?? "",
79
+ state: optionalString(body.state),
80
+ codeVerifier: optionalString(body.codeVerifier),
81
+ redirectUri: optionalString(body.redirectUri) ?? ""
82
+ };
83
+ }
84
+ function clientAddress(event) {
85
+ try {
86
+ return event.getClientAddress?.();
87
+ } catch {
88
+ return;
89
+ }
90
+ }
91
+ function populateLocals(event, context) {
92
+ if (!event.locals) return;
93
+ event.locals.user = context.user;
94
+ event.locals.membership = context.membership ?? null;
95
+ event.locals.permissions = context.permissions;
96
+ event.locals.tenantId = context.tenantId;
97
+ event.locals.sessionId = context.sessionId;
98
+ }
99
+ function createMobileAuthHandlers(options) {
100
+ let servicePromise = null;
101
+ const getService = () => {
102
+ servicePromise ??= MobileAuthService.create(options).catch((error) => {
103
+ servicePromise = null;
104
+ throw error;
105
+ });
106
+ return servicePromise;
107
+ };
108
+ const authStart = async (event) => {
109
+ try {
110
+ const service = await getService();
111
+ const body = await readJsonBody(event);
112
+ return jsonResponse$2(await service.start(parseStartRequest(body)));
113
+ } catch (error) {
114
+ return errorResponse(error);
115
+ }
116
+ };
117
+ const authComplete = async (event) => {
118
+ try {
119
+ const service = await getService();
120
+ const body = await readJsonBody(event);
121
+ return jsonResponse$2(await service.complete(parseCompleteRequest(body), {
122
+ userAgent: event.request.headers.get("user-agent") ?? void 0,
123
+ ipAddress: clientAddress(event)
124
+ }));
125
+ } catch (error) {
126
+ return errorResponse(error);
127
+ }
128
+ };
129
+ const sessionGet = async (event) => {
130
+ try {
131
+ return jsonResponse$2(await (await getService()).bootstrap(event.request.headers.get("authorization")));
132
+ } catch (error) {
133
+ return errorResponse(error);
134
+ }
135
+ };
136
+ const sessionDelete = async (event) => {
137
+ try {
138
+ return jsonResponse$2(await (await getService()).logout(event.request.headers.get("authorization")));
139
+ } catch (error) {
140
+ return errorResponse(error);
141
+ }
142
+ };
143
+ const withSession = async (event, fn) => {
144
+ try {
145
+ const service = await getService();
146
+ const token = readMobileBearerToken(event.request.headers.get("authorization"));
147
+ if (!token) throw new MobileAuthError(401, "missing_bearer_token", "Missing mobile bearer token.");
148
+ return await withSessionPermissionContext({
149
+ ...options,
150
+ sessionId: token,
151
+ sessionService: service.getSessionService(),
152
+ enterTenantContext: options.enterTenantContext ?? true,
153
+ postgresRls: options.postgresRls
154
+ }, async (context) => {
155
+ if (!context.session) throw new MobileAuthError(401, "invalid_bearer_token", "Invalid or expired mobile bearer token.");
156
+ populateLocals(event, context);
157
+ return withNoStoreDefault(await fn(event, context));
158
+ });
159
+ } catch (error) {
160
+ return errorResponse(error);
161
+ }
162
+ };
163
+ return {
164
+ authStart,
165
+ authComplete,
166
+ session: {
167
+ GET: sessionGet,
168
+ DELETE: sessionDelete
169
+ },
170
+ withSession,
171
+ guard: (fn) => (event) => withSession(event, fn),
172
+ getService
173
+ };
174
+ }
175
+ function resolveMobileUploadDedupKey(formData, headers, fieldName = "clientCaptureId") {
176
+ const field = formData?.get(fieldName);
177
+ if (typeof field === "string" && field.trim().length > 0) return field.trim();
178
+ const header = headers.get("idempotency-key")?.trim();
179
+ return header && header.length > 0 ? header : null;
180
+ }
181
+ //#endregion
6
182
  //#region src/sveltekit/resource-list-handler.ts
7
183
  var STANDARD_API_ACTIONS = [
8
184
  "list",
@@ -805,6 +981,6 @@ var NO_STORE_HEADERS = {
805
981
  pragma: "no-cache"
806
982
  };
807
983
  //#endregion
808
- export { InvalidBearerError, TerminalAuthError, TerminalAuthRateLimitError, TerminalAuthService, beginOidcLogin, completeOidcLogin, createBearerSessionDeleteHandler, createOidcCallbackHandler, createOidcLoginHandler, createResourceListHandler, createSessionCookie, createSessionHandler, createTerminalAuthStartHandler, createTerminalAuthTokenHandler, defaultSessionLocals, destroySessionCookie, loadBearerSessionContext, mountTerminalLoginPage, parseBearerToken, switchSessionTenant };
984
+ export { InvalidBearerError, MobileAuthError, MobileAuthService, TerminalAuthError, TerminalAuthRateLimitError, TerminalAuthService, beginOidcLogin, completeOidcLogin, createBearerSessionDeleteHandler, createMobileAuthHandlers, createOidcCallbackHandler, createOidcLoginHandler, createResourceListHandler, createSessionCookie, createSessionHandler, createTerminalAuthStartHandler, createTerminalAuthTokenHandler, defaultSessionLocals, destroySessionCookie, loadBearerSessionContext, mountTerminalLoginPage, parseBearerToken, readMobileBearerToken, resolveMobileUploadDedupKey, switchSessionTenant, validateMobileRedirectUri };
809
985
 
810
986
  //# sourceMappingURL=sveltekit.js.map