@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/AGENTS.md +41 -0
- package/dist/chunks/{TerminalAuthService-BgwNOEPM.js → TerminalAuthService-DGp_Wsil.js} +610 -16
- package/dist/chunks/TerminalAuthService-DGp_Wsil.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -89
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +3 -2
- package/dist/services/MobileAuthService.d.ts +242 -0
- package/dist/services/MobileAuthService.d.ts.map +1 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/smrt-knowledge.json +8 -6
- package/dist/sveltekit/index.d.ts +2 -0
- package/dist/sveltekit/index.d.ts.map +1 -1
- package/dist/sveltekit/mobile-handlers.d.ts +66 -0
- package/dist/sveltekit/mobile-handlers.d.ts.map +1 -0
- package/dist/sveltekit.js +178 -2
- package/dist/sveltekit.js.map +1 -1
- package/package.json +11 -10
- package/dist/chunks/TerminalAuthService-BgwNOEPM.js.map +0 -1
package/dist/sveltekit.js
CHANGED
|
@@ -1,8 +1,184 @@
|
|
|
1
|
-
import {
|
|
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
|