@empire-builder-kit/runtime 0.0.1-alpha.8 → 1.0.0-beta.4

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 -21
  2. package/NOTICE +5 -0
  3. package/README.md +14 -23
  4. package/package.json +53 -97
  5. package/src/auth-backend.d.ts +44 -0
  6. package/src/auth-backend.js +158 -0
  7. package/src/auth-backend.js.map +1 -0
  8. package/src/auth-session.d.ts +175 -0
  9. package/src/auth-session.js +181 -0
  10. package/src/auth-session.js.map +1 -0
  11. package/src/auth-web.d.ts +79 -0
  12. package/src/auth-web.js +153 -0
  13. package/src/auth-web.js.map +1 -0
  14. package/src/auth.d.ts +143 -0
  15. package/src/auth.js +233 -0
  16. package/src/auth.js.map +1 -0
  17. package/{dist → src}/config.d.ts +0 -1
  18. package/{dist → src}/config.js +9 -21
  19. package/src/config.js.map +1 -0
  20. package/src/events.d.ts +74 -0
  21. package/src/events.js +149 -0
  22. package/src/events.js.map +1 -0
  23. package/{dist → src}/frontend.d.ts +1 -2
  24. package/src/frontend.js +62 -0
  25. package/src/frontend.js.map +1 -0
  26. package/src/hosts.d.ts +9 -0
  27. package/src/hosts.js +38 -0
  28. package/src/hosts.js.map +1 -0
  29. package/src/index.d.ts +15 -0
  30. package/src/index.js +30 -0
  31. package/src/index.js.map +1 -0
  32. package/src/lambda.d.ts +45 -0
  33. package/src/lambda.js +117 -0
  34. package/src/lambda.js.map +1 -0
  35. package/{dist → src}/logging.d.ts +0 -1
  36. package/src/logging.js +113 -0
  37. package/src/logging.js.map +1 -0
  38. package/{dist → src}/observability.d.ts +18 -1
  39. package/{dist → src}/observability.js +72 -62
  40. package/src/observability.js.map +1 -0
  41. package/{dist → src}/request-context.d.ts +12 -2
  42. package/src/request-context.js +68 -0
  43. package/src/request-context.js.map +1 -0
  44. package/{dist → src}/response.d.ts +0 -1
  45. package/src/response.js +66 -0
  46. package/src/response.js.map +1 -0
  47. package/dist/auth-backend.d.ts +0 -18
  48. package/dist/auth-backend.d.ts.map +0 -1
  49. package/dist/auth-backend.js +0 -57
  50. package/dist/auth-web.d.ts +0 -18
  51. package/dist/auth-web.d.ts.map +0 -1
  52. package/dist/auth-web.js +0 -32
  53. package/dist/auth.d.ts +0 -68
  54. package/dist/auth.d.ts.map +0 -1
  55. package/dist/auth.js +0 -107
  56. package/dist/config.d.ts.map +0 -1
  57. package/dist/frontend.d.ts.map +0 -1
  58. package/dist/frontend.js +0 -64
  59. package/dist/index.d.ts +0 -12
  60. package/dist/index.d.ts.map +0 -1
  61. package/dist/index.js +0 -23
  62. package/dist/logging.d.ts.map +0 -1
  63. package/dist/logging.js +0 -129
  64. package/dist/observability.d.ts.map +0 -1
  65. package/dist/request-context.d.ts.map +0 -1
  66. package/dist/request-context.js +0 -58
  67. package/dist/response.d.ts.map +0 -1
  68. package/dist/response.js +0 -66
@@ -0,0 +1,153 @@
1
+ import { __awaiter } from "tslib";
2
+ import { isAuthError, toPrincipal, } from './auth.js';
3
+ import { createCognitoJwtVerifier, extractBearerToken, } from './auth-backend.js';
4
+ /**
5
+ * Creates Next.js middleware configuration for auth.
6
+ * Validates JWTs from the standard Authorization header.
7
+ *
8
+ * The verifier defaults to `tokenUse: 'access'` (matching `createAuthGuard`),
9
+ * so a Cognito id token — which is audience-scoped to the client and not
10
+ * intended as an API access credential (OAuth 2.0 Security BCP / RFC 9700) —
11
+ * is rejected as a bearer credential. Pass `verifierOptions.tokenUse` to
12
+ * override (e.g. `'any'` or `'id'`).
13
+ */
14
+ export function createAuthMiddlewareConfig(config, options = {}) {
15
+ var _a, _b;
16
+ const verifier = createCognitoJwtVerifier(config, Object.assign(Object.assign({}, options.verifierOptions), { tokenUse: (_b = (_a = options.verifierOptions) === null || _a === void 0 ? void 0 : _a.tokenUse) !== null && _b !== void 0 ? _b : 'access' }));
17
+ /**
18
+ * Extract and verify session from a Next.js request.
19
+ */
20
+ function getSession(request) {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ const authHeader = request.headers.get('authorization');
23
+ const token = extractBearerToken(authHeader !== null && authHeader !== void 0 ? authHeader : undefined);
24
+ if (!token) {
25
+ return null;
26
+ }
27
+ try {
28
+ return yield verifier.verify(token);
29
+ }
30
+ catch (_a) {
31
+ return null;
32
+ }
33
+ });
34
+ }
35
+ return {
36
+ verifier,
37
+ getSession,
38
+ /**
39
+ * Resolve a typed principal from the request session. Returns null
40
+ * (never throws) when the token is missing/invalid, no policy is
41
+ * configured, or the session maps to no principal kind.
42
+ */
43
+ getPrincipal(request) {
44
+ return __awaiter(this, void 0, void 0, function* () {
45
+ if (!options.policy) {
46
+ return null;
47
+ }
48
+ const session = yield getSession(request);
49
+ if (!session) {
50
+ return null;
51
+ }
52
+ try {
53
+ return toPrincipal(session, options.policy);
54
+ }
55
+ catch (_a) {
56
+ return null;
57
+ }
58
+ });
59
+ },
60
+ };
61
+ }
62
+ function normalizePath(path) {
63
+ var _a, _b;
64
+ const pathOnly = (_b = (_a = path.split(/[?#]/, 1)[0]) === null || _a === void 0 ? void 0 : _a.replace(/\\/g, '/')) !== null && _b !== void 0 ? _b : '/';
65
+ if (/%(?:2f|5c)/i.test(pathOnly)) {
66
+ return null;
67
+ }
68
+ let decoded;
69
+ try {
70
+ decoded = decodeURI(pathOnly);
71
+ }
72
+ catch (_c) {
73
+ return null;
74
+ }
75
+ if (/%(?:2f|5c)/i.test(decoded)) {
76
+ return null;
77
+ }
78
+ const segments = [];
79
+ for (const segment of decoded.split('/')) {
80
+ if (!segment || segment === '.') {
81
+ continue;
82
+ }
83
+ if (segment === '..') {
84
+ segments.pop();
85
+ continue;
86
+ }
87
+ segments.push(segment);
88
+ }
89
+ return `/${segments.join('/')}`.replace(/\/+$/, '') || '/';
90
+ }
91
+ function matchesRoute(rulePath, pathname) {
92
+ return ((rulePath === '/' && pathname === '/') ||
93
+ pathname === rulePath ||
94
+ pathname.startsWith(`${rulePath}/`));
95
+ }
96
+ /**
97
+ * Framework-agnostic route guard for web middleware. Returns a decision
98
+ * object instead of throwing so middleware templates can translate it into
99
+ * redirects or responses. The most specific (longest) matching rule wins;
100
+ * equal-length rules keep their input order; unmatched paths are denied
101
+ * unless `defaultBehavior` is set to `allow`.
102
+ *
103
+ * Path matching is case-sensitive: `/Admin` does not match a `/admin` rule.
104
+ * Under the default `deny` this fails closed (an unmatched `/Admin` is
105
+ * denied). Do not combine `defaultBehavior: 'allow'` with a case-insensitive
106
+ * routing layer, or a case-variant of a protected path can bypass its rule
107
+ * and fall through to `allow`.
108
+ */
109
+ export function createRouteGuard(options) {
110
+ var _a;
111
+ const rules = options.rules
112
+ .map((rule) => {
113
+ const normalizedPath = normalizePath(rule.path);
114
+ if (!normalizedPath) {
115
+ throw new Error(`Invalid route rule path: ${rule.path}`);
116
+ }
117
+ return Object.assign(Object.assign({}, rule), { path: normalizedPath });
118
+ })
119
+ .sort((a, b) => b.path.length - a.path.length);
120
+ const defaultBehavior = (_a = options.defaultBehavior) !== null && _a !== void 0 ? _a : 'deny';
121
+ return {
122
+ check(pathname, session) {
123
+ const normalizedPathname = normalizePath(pathname);
124
+ if (!normalizedPathname) {
125
+ return { allowed: false, reason: 'forbidden', status: 403 };
126
+ }
127
+ const rule = rules.find((candidate) => matchesRoute(candidate.path, normalizedPathname));
128
+ if (!rule) {
129
+ return defaultBehavior === 'allow'
130
+ ? { allowed: true }
131
+ : { allowed: false, reason: 'forbidden', status: 403 };
132
+ }
133
+ if (rule.public) {
134
+ return { allowed: true };
135
+ }
136
+ let principal;
137
+ try {
138
+ principal = toPrincipal(session !== null && session !== void 0 ? session : { metadata: {}, status: 'anonymous' }, options.policy);
139
+ }
140
+ catch (error) {
141
+ if (isAuthError(error) && error.status === 401) {
142
+ return { allowed: false, reason: 'unauthenticated', status: 401 };
143
+ }
144
+ return { allowed: false, reason: 'forbidden', status: 403 };
145
+ }
146
+ if (rule.allow && !rule.allow.includes(principal.kind)) {
147
+ return { allowed: false, reason: 'forbidden', status: 403 };
148
+ }
149
+ return { allowed: true, principal };
150
+ },
151
+ };
152
+ }
153
+ //# sourceMappingURL=auth-web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-web.js","sourceRoot":"","sources":["../../../../packages/runtime/src/auth-web.ts"],"names":[],"mappings":"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"}
package/src/auth.d.ts ADDED
@@ -0,0 +1,143 @@
1
+ import type { RequestActor, RequestMetadata, RequestMetadataValue } from './request-context.js';
2
+ import { RuntimeError, type RuntimeErrorDetails } from './response.js';
3
+ export type AuthSessionStatus = 'anonymous' | 'authenticated';
4
+ export interface AuthSessionSubject {
5
+ displayName?: string;
6
+ email?: string;
7
+ id: string;
8
+ permissions?: string[];
9
+ roles?: string[];
10
+ tenantId?: string;
11
+ type: RequestActor['type'];
12
+ }
13
+ export interface AuthSession {
14
+ audience?: string;
15
+ expiresAt?: string;
16
+ issuedAt?: string;
17
+ metadata: RequestMetadata;
18
+ sessionId?: string;
19
+ status: AuthSessionStatus;
20
+ subject?: AuthSessionSubject;
21
+ }
22
+ export interface AnonymousSessionInput {
23
+ audience?: string;
24
+ expiresAt?: string;
25
+ issuedAt?: string;
26
+ metadata?: Record<string, RequestMetadataValue | undefined>;
27
+ sessionId?: string;
28
+ }
29
+ export interface AuthenticatedSessionInput extends AnonymousSessionInput {
30
+ subject: AuthSessionSubject;
31
+ }
32
+ export interface AuthenticatedSession extends AuthSession {
33
+ status: 'authenticated';
34
+ subject: AuthSessionSubject;
35
+ }
36
+ export declare const authContract: {
37
+ readonly exportPath: "@empire-builder-kit/runtime/auth";
38
+ readonly packageName: "@empire-builder-kit/runtime";
39
+ };
40
+ export declare function createAnonymousSession(input?: AnonymousSessionInput): AuthSession;
41
+ export declare function createAuthenticatedSession(input: AuthenticatedSessionInput): AuthenticatedSession;
42
+ export declare function isAuthenticatedSession(session: AuthSession): session is AuthenticatedSession;
43
+ export declare function toRequestActor(session: AuthSession): RequestActor | undefined;
44
+ export declare function toSessionLogMetadata(session: AuthSession): RequestMetadata;
45
+ /**
46
+ * BetterAuth configuration contract.
47
+ *
48
+ * App groups consume auth from the core SDK. The core app group owns
49
+ * the Cognito user pool and exposes these connection details so
50
+ * BetterAuth can be configured against the shared pool.
51
+ */
52
+ export interface BetterAuthConfig {
53
+ provider: 'cognito';
54
+ userPoolId: string;
55
+ clientId: string;
56
+ issuerUrl: string;
57
+ }
58
+ export declare function createBetterAuthConfig(options: {
59
+ userPoolId: string;
60
+ clientId: string;
61
+ region: string;
62
+ }): BetterAuthConfig;
63
+ export interface CognitoTokenClaims {
64
+ sub: string;
65
+ aud?: string | string[];
66
+ client_id?: string;
67
+ email?: string;
68
+ 'cognito:username'?: string;
69
+ 'cognito:groups'?: string[];
70
+ exp?: number;
71
+ iat?: number;
72
+ scope?: string;
73
+ token_use?: string;
74
+ }
75
+ export declare function sessionFromCognitoToken(decoded: CognitoTokenClaims): AuthenticatedSession;
76
+ export type PrincipalKind = 'admin' | 'agent' | 'customer';
77
+ export type DefaultPrincipalKind = Exclude<PrincipalKind, 'admin'>;
78
+ /**
79
+ * A typed identity resolved from an authenticated session via an
80
+ * {@link AuthPolicy}. Guards and handlers should authorize against the
81
+ * principal instead of inspecting raw Cognito claims.
82
+ */
83
+ export interface Principal {
84
+ audience?: string;
85
+ id: string;
86
+ kind: PrincipalKind;
87
+ roles: string[];
88
+ scopes: string[];
89
+ session: AuthenticatedSession;
90
+ }
91
+ export interface AuthPolicyRule {
92
+ /**
93
+ * App client ids. Audience matching is ignored for admin rules and only
94
+ * matches agent rules for service principals. Use Cognito groups for
95
+ * privileged human access; scopes only grant privileged (admin/agent)
96
+ * access to service principals, so a human token carrying a privileged
97
+ * scope cannot elevate above customer.
98
+ */
99
+ audiences?: string[];
100
+ groups?: string[];
101
+ scopes?: string[];
102
+ }
103
+ /**
104
+ * Maps Cognito groups, safe token audience matches, and OAuth scopes onto
105
+ * principal kinds. When several kinds match, the more privileged kind wins:
106
+ * admin, then agent, then customer. Admin defaults are intentionally
107
+ * disallowed; unaffiliated authenticated users may only default to agent or
108
+ * customer.
109
+ */
110
+ export interface AuthPolicy {
111
+ admin?: AuthPolicyRule;
112
+ agent?: AuthPolicyRule;
113
+ customer?: AuthPolicyRule;
114
+ defaultKind?: DefaultPrincipalKind;
115
+ }
116
+ export declare const authErrorCodes: {
117
+ readonly forbiddenKind: "auth_forbidden_kind";
118
+ readonly forbiddenRole: "auth_forbidden_role";
119
+ readonly forbiddenScope: "auth_forbidden_scope";
120
+ readonly invalidToken: "auth_invalid_token";
121
+ readonly principalMismatch: "auth_principal_mismatch";
122
+ readonly unauthenticated: "auth_unauthenticated";
123
+ };
124
+ export type AuthErrorCode = (typeof authErrorCodes)[keyof typeof authErrorCodes];
125
+ export interface AuthErrorOptions {
126
+ code: AuthErrorCode;
127
+ details?: RuntimeErrorDetails;
128
+ message: string;
129
+ status: 401 | 403;
130
+ }
131
+ export declare class AuthError extends RuntimeError {
132
+ constructor(options: AuthErrorOptions);
133
+ }
134
+ export declare function isAuthError(error: unknown): error is AuthError;
135
+ export declare function toPrincipal(session: AuthSession, policy: AuthPolicy): Principal;
136
+ export declare function hasRole(principal: Principal, role: string): boolean;
137
+ export declare function hasScope(principal: Principal, scope: string): boolean;
138
+ export declare function isAdmin(principal: Principal): boolean;
139
+ export declare function isAgent(principal: Principal): boolean;
140
+ export declare function isCustomer(principal: Principal): boolean;
141
+ export declare function assertPrincipalKind(principal: Principal, allowed: PrincipalKind[]): void;
142
+ export declare function assertRole(principal: Principal, role: string): void;
143
+ export declare function assertScope(principal: Principal, scope: string): void;
package/src/auth.js ADDED
@@ -0,0 +1,233 @@
1
+ import { RuntimeError } from './response.js';
2
+ export const authContract = {
3
+ exportPath: '@empire-builder-kit/runtime/auth',
4
+ packageName: '@empire-builder-kit/runtime',
5
+ };
6
+ function normalizeMetadata(metadata) {
7
+ const entries = Object.entries(metadata !== null && metadata !== void 0 ? metadata : {}).filter(([, value]) => value !== undefined);
8
+ return Object.fromEntries(entries);
9
+ }
10
+ function normalizeList(values) {
11
+ const normalized = (values !== null && values !== void 0 ? values : [])
12
+ .map((value) => value.trim())
13
+ .filter(Boolean);
14
+ if (normalized.length === 0) {
15
+ return undefined;
16
+ }
17
+ return [...new Set(normalized)];
18
+ }
19
+ function normalizeSubject(subject) {
20
+ var _a, _b, _c;
21
+ return Object.assign(Object.assign({}, subject), { displayName: ((_a = subject.displayName) === null || _a === void 0 ? void 0 : _a.trim()) || undefined, email: ((_b = subject.email) === null || _b === void 0 ? void 0 : _b.trim()) || undefined, permissions: normalizeList(subject.permissions), roles: normalizeList(subject.roles), tenantId: ((_c = subject.tenantId) === null || _c === void 0 ? void 0 : _c.trim()) || undefined });
22
+ }
23
+ export function createAnonymousSession(input = {}) {
24
+ var _a;
25
+ return {
26
+ audience: ((_a = input.audience) === null || _a === void 0 ? void 0 : _a.trim()) || undefined,
27
+ expiresAt: input.expiresAt,
28
+ issuedAt: input.issuedAt,
29
+ metadata: normalizeMetadata(input.metadata),
30
+ sessionId: input.sessionId,
31
+ status: 'anonymous',
32
+ };
33
+ }
34
+ export function createAuthenticatedSession(input) {
35
+ return Object.assign(Object.assign({}, createAnonymousSession(input)), { status: 'authenticated', subject: normalizeSubject(input.subject) });
36
+ }
37
+ export function isAuthenticatedSession(session) {
38
+ return session.status === 'authenticated' && session.subject !== undefined;
39
+ }
40
+ export function toRequestActor(session) {
41
+ if (!isAuthenticatedSession(session)) {
42
+ return undefined;
43
+ }
44
+ return {
45
+ id: session.subject.id,
46
+ type: session.subject.type,
47
+ };
48
+ }
49
+ export function toSessionLogMetadata(session) {
50
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
51
+ return normalizeMetadata(Object.assign({ authAudience: session.audience, authExpiresAt: session.expiresAt, authIssuedAt: session.issuedAt, authPermissions: (_b = (_a = session.subject) === null || _a === void 0 ? void 0 : _a.permissions) === null || _b === void 0 ? void 0 : _b.join(','), authRoles: (_d = (_c = session.subject) === null || _c === void 0 ? void 0 : _c.roles) === null || _d === void 0 ? void 0 : _d.join(','), authSessionId: session.sessionId, authStatus: session.status, authSubjectEmail: (_e = session.subject) === null || _e === void 0 ? void 0 : _e.email, authSubjectId: (_f = session.subject) === null || _f === void 0 ? void 0 : _f.id, authSubjectName: (_g = session.subject) === null || _g === void 0 ? void 0 : _g.displayName, authSubjectType: (_h = session.subject) === null || _h === void 0 ? void 0 : _h.type, authTenantId: (_j = session.subject) === null || _j === void 0 ? void 0 : _j.tenantId }, session.metadata));
52
+ }
53
+ export function createBetterAuthConfig(options) {
54
+ const region = options.region.trim();
55
+ const userPoolId = options.userPoolId.trim();
56
+ const clientId = options.clientId.trim();
57
+ if (!region || !userPoolId || !clientId) {
58
+ throw new Error('Cognito region, userPoolId, and clientId must be non-empty.');
59
+ }
60
+ return {
61
+ provider: 'cognito',
62
+ userPoolId,
63
+ clientId,
64
+ issuerUrl: `https://cognito-idp.${region}.amazonaws.com/${userPoolId}`,
65
+ };
66
+ }
67
+ function resolveTokenAudience(decoded) {
68
+ if (decoded.client_id) {
69
+ return decoded.client_id;
70
+ }
71
+ if (typeof decoded.aud === 'string') {
72
+ return decoded.aud;
73
+ }
74
+ if (Array.isArray(decoded.aud)) {
75
+ return decoded.aud.find((audience) => audience.trim() !== '');
76
+ }
77
+ return undefined;
78
+ }
79
+ export function sessionFromCognitoToken(decoded) {
80
+ var _a;
81
+ // Client-credentials access tokens carry sub === client_id and no user
82
+ // claims; they represent a machine caller, not a Cognito user.
83
+ const isServiceToken = decoded.client_id !== undefined && decoded.client_id === decoded.sub;
84
+ return createAuthenticatedSession({
85
+ audience: resolveTokenAudience(decoded),
86
+ subject: {
87
+ id: decoded.sub,
88
+ email: decoded.email,
89
+ displayName: decoded['cognito:username'],
90
+ permissions: (_a = decoded.scope) === null || _a === void 0 ? void 0 : _a.split(/\s+/),
91
+ roles: decoded['cognito:groups'],
92
+ type: isServiceToken ? 'service' : 'user',
93
+ },
94
+ expiresAt: decoded.exp
95
+ ? new Date(decoded.exp * 1000).toISOString()
96
+ : undefined,
97
+ issuedAt: decoded.iat
98
+ ? new Date(decoded.iat * 1000).toISOString()
99
+ : undefined,
100
+ });
101
+ }
102
+ export const authErrorCodes = {
103
+ forbiddenKind: 'auth_forbidden_kind',
104
+ forbiddenRole: 'auth_forbidden_role',
105
+ forbiddenScope: 'auth_forbidden_scope',
106
+ invalidToken: 'auth_invalid_token',
107
+ principalMismatch: 'auth_principal_mismatch',
108
+ unauthenticated: 'auth_unauthenticated',
109
+ };
110
+ export class AuthError extends RuntimeError {
111
+ constructor(options) {
112
+ super(Object.assign(Object.assign({}, options), { retryable: false }));
113
+ this.name = 'AuthError';
114
+ }
115
+ }
116
+ export function isAuthError(error) {
117
+ return error instanceof AuthError;
118
+ }
119
+ const principalKindPrecedence = ['admin', 'agent', 'customer'];
120
+ function matchesPolicyRule(kind, rule, input) {
121
+ var _a, _b, _c;
122
+ if ((_a = rule.groups) === null || _a === void 0 ? void 0 : _a.some((group) => input.roles.includes(group))) {
123
+ return true;
124
+ }
125
+ if (((_b = rule.scopes) === null || _b === void 0 ? void 0 : _b.some((scope) => input.scopes.includes(scope))) &&
126
+ (kind === 'customer' || input.subjectType === 'service')) {
127
+ return true;
128
+ }
129
+ if (input.audience !== undefined &&
130
+ ((_c = rule.audiences) === null || _c === void 0 ? void 0 : _c.includes(input.audience)) &&
131
+ (kind === 'customer' ||
132
+ (kind === 'agent' && input.subjectType === 'service'))) {
133
+ return true;
134
+ }
135
+ return false;
136
+ }
137
+ function resolveDefaultPrincipalKind(policy) {
138
+ const defaultKind = policy.defaultKind;
139
+ if (defaultKind === 'admin') {
140
+ throw new AuthError({
141
+ code: authErrorCodes.principalMismatch,
142
+ message: 'Auth policy defaultKind cannot be admin',
143
+ status: 403,
144
+ });
145
+ }
146
+ return defaultKind;
147
+ }
148
+ export function toPrincipal(session, policy) {
149
+ var _a, _b, _c;
150
+ if (!isAuthenticatedSession(session)) {
151
+ throw new AuthError({
152
+ code: authErrorCodes.unauthenticated,
153
+ message: 'Authentication required',
154
+ status: 401,
155
+ });
156
+ }
157
+ const audience = session.audience;
158
+ const roles = (_a = session.subject.roles) !== null && _a !== void 0 ? _a : [];
159
+ const scopes = (_b = session.subject.permissions) !== null && _b !== void 0 ? _b : [];
160
+ const defaultKind = resolveDefaultPrincipalKind(policy);
161
+ const kind = (_c = principalKindPrecedence.find((candidate) => {
162
+ const rule = policy[candidate];
163
+ return rule !== undefined
164
+ ? matchesPolicyRule(candidate, rule, {
165
+ audience,
166
+ roles,
167
+ scopes,
168
+ subjectType: session.subject.type,
169
+ })
170
+ : false;
171
+ })) !== null && _c !== void 0 ? _c : defaultKind;
172
+ if (!kind) {
173
+ throw new AuthError({
174
+ code: authErrorCodes.principalMismatch,
175
+ message: 'Session does not map to a known principal kind',
176
+ status: 403,
177
+ });
178
+ }
179
+ return {
180
+ audience,
181
+ id: session.subject.id,
182
+ kind,
183
+ roles,
184
+ scopes,
185
+ session,
186
+ };
187
+ }
188
+ export function hasRole(principal, role) {
189
+ return principal.roles.includes(role);
190
+ }
191
+ export function hasScope(principal, scope) {
192
+ return principal.scopes.includes(scope);
193
+ }
194
+ export function isAdmin(principal) {
195
+ return principal.kind === 'admin';
196
+ }
197
+ export function isAgent(principal) {
198
+ return principal.kind === 'agent';
199
+ }
200
+ export function isCustomer(principal) {
201
+ return principal.kind === 'customer';
202
+ }
203
+ export function assertPrincipalKind(principal, allowed) {
204
+ if (!allowed.includes(principal.kind)) {
205
+ throw new AuthError({
206
+ code: authErrorCodes.forbiddenKind,
207
+ details: { allowed, kind: principal.kind },
208
+ message: `Principal kind '${principal.kind}' is not allowed`,
209
+ status: 403,
210
+ });
211
+ }
212
+ }
213
+ export function assertRole(principal, role) {
214
+ if (!hasRole(principal, role)) {
215
+ throw new AuthError({
216
+ code: authErrorCodes.forbiddenRole,
217
+ details: { role },
218
+ message: `Principal is missing required role '${role}'`,
219
+ status: 403,
220
+ });
221
+ }
222
+ }
223
+ export function assertScope(principal, scope) {
224
+ if (!hasScope(principal, scope)) {
225
+ throw new AuthError({
226
+ code: authErrorCodes.forbiddenScope,
227
+ details: { scope },
228
+ message: `Principal is missing required scope '${scope}'`,
229
+ status: 403,
230
+ });
231
+ }
232
+ }
233
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../packages/runtime/src/auth.ts"],"names":[],"mappings":"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"}
@@ -49,4 +49,3 @@ export declare function number(options?: NumberOptions): ConfigParser<number>;
49
49
  export declare function boolean(options?: BooleanOptions): ConfigParser<boolean>;
50
50
  export declare function enumValue<const T extends string>(values: readonly T[], options?: EnumOptions<T>): ConfigParser<T>;
51
51
  export {};
52
- //# sourceMappingURL=config.d.ts.map
@@ -1,30 +1,17 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ConfigValidationError = void 0;
4
- exports.formatConfigIssues = formatConfigIssues;
5
- exports.loadConfig = loadConfig;
6
- exports.string = string;
7
- exports.optionalString = optionalString;
8
- exports.number = number;
9
- exports.boolean = boolean;
10
- exports.enumValue = enumValue;
11
1
  class ConfigFieldError extends Error {
12
- issue;
13
2
  constructor(issue) {
14
3
  super(`${issue.key}: ${issue.message}`);
15
4
  this.name = 'ConfigFieldError';
16
5
  this.issue = issue;
17
6
  }
18
7
  }
19
- class ConfigValidationError extends Error {
20
- issues;
8
+ export class ConfigValidationError extends Error {
21
9
  constructor(issues) {
22
10
  super(formatConfigIssues(issues));
23
11
  this.name = 'ConfigValidationError';
24
12
  this.issues = issues;
25
13
  }
26
14
  }
27
- exports.ConfigValidationError = ConfigValidationError;
28
15
  function normalizeEnvKey(propertyKey, env) {
29
16
  if (env) {
30
17
  return env;
@@ -53,7 +40,7 @@ function resolveStringValue(rawValue, defaultValue) {
53
40
  }
54
41
  return rawValue;
55
42
  }
56
- function formatConfigIssues(issues) {
43
+ export function formatConfigIssues(issues) {
57
44
  const summary = issues
58
45
  .map(({ key, message, value }) => value === undefined
59
46
  ? `- ${key}: ${message}`
@@ -61,7 +48,7 @@ function formatConfigIssues(issues) {
61
48
  .join('\n');
62
49
  return `Invalid configuration:\n${summary}`;
63
50
  }
64
- function loadConfig(schema, source = process.env) {
51
+ export function loadConfig(schema, source = process.env) {
65
52
  const issues = [];
66
53
  const config = {};
67
54
  for (const [propertyKey, parser] of Object.entries(schema)) {
@@ -84,7 +71,7 @@ function loadConfig(schema, source = process.env) {
84
71
  }
85
72
  return config;
86
73
  }
87
- function string(options = {}) {
74
+ export function string(options = {}) {
88
75
  return ({ propertyKey, source }) => {
89
76
  const envKey = normalizeEnvKey(propertyKey, options.env);
90
77
  const rawValue = resolveStringValue(source[envKey], options.defaultValue);
@@ -104,7 +91,7 @@ function string(options = {}) {
104
91
  return value;
105
92
  };
106
93
  }
107
- function optionalString(options = {}) {
94
+ export function optionalString(options = {}) {
108
95
  return ({ propertyKey, source }) => {
109
96
  const envKey = normalizeEnvKey(propertyKey, options.env);
110
97
  const rawValue = resolveStringValue(source[envKey], options.defaultValue);
@@ -124,7 +111,7 @@ function optionalString(options = {}) {
124
111
  return value;
125
112
  };
126
113
  }
127
- function number(options = {}) {
114
+ export function number(options = {}) {
128
115
  return ({ propertyKey, source }) => {
129
116
  const envKey = normalizeEnvKey(propertyKey, options.env);
130
117
  const rawValue = source[envKey];
@@ -150,7 +137,7 @@ function number(options = {}) {
150
137
  return value;
151
138
  };
152
139
  }
153
- function boolean(options = {}) {
140
+ export function boolean(options = {}) {
154
141
  return ({ propertyKey, source }) => {
155
142
  const envKey = normalizeEnvKey(propertyKey, options.env);
156
143
  const rawValue = source[envKey];
@@ -170,7 +157,7 @@ function boolean(options = {}) {
170
157
  throwFieldError(envKey, 'must be a boolean value', rawValue);
171
158
  };
172
159
  }
173
- function enumValue(values, options = {}) {
160
+ export function enumValue(values, options = {}) {
174
161
  return ({ propertyKey, source }) => {
175
162
  const envKey = normalizeEnvKey(propertyKey, options.env);
176
163
  const rawValue = resolveStringValue(source[envKey], options.defaultValue);
@@ -183,3 +170,4 @@ function enumValue(values, options = {}) {
183
170
  return rawValue;
184
171
  };
185
172
  }
173
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../packages/runtime/src/config.ts"],"names":[],"mappings":"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"}