managed-deepagents 0.0.3-dev.33 → 0.0.3-dev.34
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/connectors.d.ts +2 -7
- package/dist/connectors.d.ts.map +1 -1
- package/dist/connectors.js +1 -18
- package/dist/connectors.js.map +1 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/runtime/index.d.ts +0 -13
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +12 -39
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/types.d.ts +7 -23
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/types.d.ts +0 -9
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -12
- package/dist/connectors/langsmith.d.ts +0 -133
- package/dist/connectors/langsmith.d.ts.map +0 -1
- package/dist/connectors/langsmith.js +0 -262
- package/dist/connectors/langsmith.js.map +0 -1
- package/dist/identity.d.ts +0 -273
- package/dist/identity.d.ts.map +0 -1
- package/dist/identity.js +0 -358
- package/dist/identity.js.map +0 -1
- package/dist/runtime/auth.d.ts +0 -54
- package/dist/runtime/auth.d.ts.map +0 -1
- package/dist/runtime/auth.js +0 -191
- package/dist/runtime/auth.js.map +0 -1
- package/dist/runtime/connector.d.ts +0 -138
- package/dist/runtime/connector.d.ts.map +0 -1
- package/dist/runtime/connector.js +0 -82
- package/dist/runtime/connector.js.map +0 -1
- package/dist/runtime/credentials.d.ts +0 -60
- package/dist/runtime/credentials.d.ts.map +0 -1
- package/dist/runtime/credentials.js +0 -189
- package/dist/runtime/credentials.js.map +0 -1
- package/dist/runtime/identity-http.d.ts +0 -27
- package/dist/runtime/identity-http.d.ts.map +0 -1
- package/dist/runtime/identity-http.js +0 -213
- package/dist/runtime/identity-http.js.map +0 -1
- package/dist/runtime/identity-runtime.d.ts +0 -54
- package/dist/runtime/identity-runtime.d.ts.map +0 -1
- package/dist/runtime/identity-runtime.js +0 -151
- package/dist/runtime/identity-runtime.js.map +0 -1
- package/dist/runtime/langsmith-connector.d.ts +0 -112
- package/dist/runtime/langsmith-connector.d.ts.map +0 -1
- package/dist/runtime/langsmith-connector.js +0 -411
- package/dist/runtime/langsmith-connector.js.map +0 -1
- package/dist/runtime/managed-middleware.d.ts +0 -25
- package/dist/runtime/managed-middleware.d.ts.map +0 -1
- package/dist/runtime/managed-middleware.js +0 -76
- package/dist/runtime/managed-middleware.js.map +0 -1
- package/dist/runtime/managed-tools.d.ts +0 -61
- package/dist/runtime/managed-tools.d.ts.map +0 -1
- package/dist/runtime/managed-tools.js +0 -102
- package/dist/runtime/managed-tools.js.map +0 -1
- package/dist/runtime/validated-token.d.ts +0 -25
- package/dist/runtime/validated-token.d.ts.map +0 -1
- package/dist/runtime/validated-token.js +0 -260
- package/dist/runtime/validated-token.js.map +0 -1
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { createCredentialsProvider, } from "./credentials.js";
|
|
2
|
-
import { buildRuntimeIdentity, resolveRuntimeConfigurable, sanitizeConfigurable, } from "./identity-runtime.js";
|
|
3
|
-
/**
|
|
4
|
-
* Derive the managed runtime primitives for a run from its config. Identity is
|
|
5
|
-
* built only from the trusted `configurable.langgraph_auth_user` the custom-auth
|
|
6
|
-
* handler produced — the field LangGraph propagates to every node and tool.
|
|
7
|
-
*/
|
|
8
|
-
export function managedRuntimeExtras(runtime, cfg) {
|
|
9
|
-
const identity = buildRuntimeIdentity(resolveRuntimeConfigurable(runtime));
|
|
10
|
-
const extras = {};
|
|
11
|
-
if (identity) {
|
|
12
|
-
extras.identity = identity;
|
|
13
|
-
}
|
|
14
|
-
if (cfg) {
|
|
15
|
-
const credentials = createCredentialsProvider(cfg, identity);
|
|
16
|
-
if (credentials) {
|
|
17
|
-
extras.credentials = credentials;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return extras;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* The fields MDA overlays onto the runtime a tool/middleware hook receives:
|
|
24
|
-
* the frozen `identity` (when an actor resolved) and a `configurable` with the
|
|
25
|
-
* reserved identity keys stripped (§8) so downstream code can't read a
|
|
26
|
-
* client-spoofed `actor_id`/`tenant_id`. Returns an empty object when there is
|
|
27
|
-
* nothing to change, so the original runtime passes through untouched.
|
|
28
|
-
*/
|
|
29
|
-
export function managedRuntimeOverrides(runtime, cfg) {
|
|
30
|
-
const overrides = {};
|
|
31
|
-
const configurable = resolveRuntimeConfigurable(runtime);
|
|
32
|
-
const identity = buildRuntimeIdentity(configurable);
|
|
33
|
-
if (identity) {
|
|
34
|
-
overrides.identity = identity;
|
|
35
|
-
}
|
|
36
|
-
if (cfg) {
|
|
37
|
-
const credentials = createCredentialsProvider(cfg, identity);
|
|
38
|
-
if (credentials) {
|
|
39
|
-
overrides.credentials = credentials;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
if (configurable) {
|
|
43
|
-
const sanitized = sanitizeConfigurable(configurable);
|
|
44
|
-
if (Object.keys(sanitized).length !== Object.keys(configurable).length) {
|
|
45
|
-
if (runtime?.configurable !== undefined) {
|
|
46
|
-
overrides.configurable = sanitized;
|
|
47
|
-
}
|
|
48
|
-
else if (runtime?.config) {
|
|
49
|
-
overrides.config = {
|
|
50
|
-
...runtime.config,
|
|
51
|
-
configurable: sanitized,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return overrides;
|
|
57
|
-
}
|
|
58
|
-
function augmentToolConfig(config, cfg) {
|
|
59
|
-
const overrides = managedRuntimeOverrides(config, cfg);
|
|
60
|
-
return Object.keys(overrides).length > 0
|
|
61
|
-
? { ...config, ...overrides }
|
|
62
|
-
: config;
|
|
63
|
-
}
|
|
64
|
-
function wrapToolCallable(original, cfg, receiver) {
|
|
65
|
-
return (input, runManager, config) => original.call(receiver, input, runManager, augmentToolConfig(config, cfg));
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Wrap a tool so its runtime carries the managed primitives (`runtime.identity`,
|
|
69
|
-
* …) without changing its name, schema, or class.
|
|
70
|
-
*
|
|
71
|
-
* Augments `invoke` (for LangGraph's `ToolNode`) and patches the tool's internal
|
|
72
|
-
* `func`/`coroutine` so identity reaches the authored handler even when LangChain
|
|
73
|
-
* rewrites the runtime into a RunnableConfig before calling the tool function.
|
|
74
|
-
* Every other property/method passes through untouched.
|
|
75
|
-
*/
|
|
76
|
-
export function withManagedRuntime(managedTool, cfg) {
|
|
77
|
-
const patchable = managedTool;
|
|
78
|
-
if (typeof patchable.func === "function") {
|
|
79
|
-
patchable.func = wrapToolCallable(patchable.func.bind(managedTool), cfg, managedTool);
|
|
80
|
-
}
|
|
81
|
-
if (typeof patchable.coroutine === "function") {
|
|
82
|
-
patchable.coroutine = wrapToolCallable(patchable.coroutine.bind(managedTool), cfg, managedTool);
|
|
83
|
-
}
|
|
84
|
-
return new Proxy(managedTool, {
|
|
85
|
-
get(target, property, receiver) {
|
|
86
|
-
if (property === "invoke") {
|
|
87
|
-
return (input, runtime) => {
|
|
88
|
-
const overrides = managedRuntimeOverrides(runtime, cfg);
|
|
89
|
-
return target.invoke(input, Object.keys(overrides).length > 0
|
|
90
|
-
? { ...runtime, ...overrides }
|
|
91
|
-
: runtime);
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
return Reflect.get(target, property, receiver);
|
|
95
|
-
},
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
/** Wrap every tool in a list with {@link withManagedRuntime}. */
|
|
99
|
-
export function wrapToolsWithManagedRuntime(tools, cfg) {
|
|
100
|
-
return tools.map((managedTool) => withManagedRuntime(managedTool, cfg));
|
|
101
|
-
}
|
|
102
|
-
//# sourceMappingURL=managed-tools.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"managed-tools.js","sourceRoot":"","sources":["../../src/runtime/managed-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { type JWTPayload } from "jose";
|
|
2
|
-
import type { IdentityConfig, ValidatedTokenIngress, ValidatedTokenProvider } from "../identity.js";
|
|
3
|
-
import type { ManagedUser } from "./auth.js";
|
|
4
|
-
/**
|
|
5
|
-
* Resolve the caller identity for the `validated_token` ingress mode (§6.2): pick
|
|
6
|
-
* the provider by token issuer, verify the token (JWKS / introspection / guest),
|
|
7
|
-
* then map its claims into the identity envelope. Fail-closed (401) throughout.
|
|
8
|
-
*/
|
|
9
|
-
export declare function resolveValidatedTokenUser(cfg: IdentityConfig, ingress: ValidatedTokenIngress, request: Request): Promise<ManagedUser>;
|
|
10
|
-
/** Extract the bearer token from the `Authorization` header, or 401. */
|
|
11
|
-
export declare function bearerToken(request: Request): string;
|
|
12
|
-
/**
|
|
13
|
-
* Select the provider that should verify `token`. A single-provider deployment
|
|
14
|
-
* always uses its one entry; otherwise selection is by the token's `iss` claim
|
|
15
|
-
* (guest tokens carry MDA's own issuer). Fail-closed on no match (401).
|
|
16
|
-
*/
|
|
17
|
-
export declare function selectProvider(providers: ValidatedTokenProvider[], token: string): ValidatedTokenProvider;
|
|
18
|
-
/** Map verified token claims into the managed user envelope, per `provider.claims`. */
|
|
19
|
-
export declare function claimsToUser(provider: ValidatedTokenProvider, claims: JWTPayload): ManagedUser;
|
|
20
|
-
/**
|
|
21
|
-
* Mint a short-lived guest token for an anonymous caller. Exposed for the guest
|
|
22
|
-
* issue/reissue route; the same deployment key verifies it on later calls.
|
|
23
|
-
*/
|
|
24
|
-
export declare function issueGuestToken(provider: ValidatedTokenProvider, subject?: string): Promise<string>;
|
|
25
|
-
//# sourceMappingURL=validated-token.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validated-token.d.ts","sourceRoot":"","sources":["../../src/runtime/validated-token.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,UAAU,EAGhB,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAc7C;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,WAAW,CAAC,CAWtB;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAQpD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,sBAAsB,EAAE,EACnC,KAAK,EAAE,MAAM,GACZ,sBAAsB,CAsBxB;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,sBAAsB,EAChC,MAAM,EAAE,UAAU,GACjB,WAAW,CA0Bb;AA0JD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,sBAAsB,EAChC,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAejB"}
|
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
import { HTTPException } from "@langchain/langgraph-sdk/auth";
|
|
2
|
-
import { createRemoteJWKSet, decodeJwt, jwtVerify, SignJWT, } from "jose";
|
|
3
|
-
/** Issuer stamped on MDA-minted guest tokens, used to route them at selection. */
|
|
4
|
-
const GUEST_ISSUER = "mda:guest";
|
|
5
|
-
/** Deployment env var carrying the HS256 key MDA signs/verifies guest tokens with. */
|
|
6
|
-
const GUEST_KEY_ENV = "MDA_GUEST_SIGNING_KEY";
|
|
7
|
-
/** Remote JWKS key sets, cached per resolved JWKS URI for the process lifetime. */
|
|
8
|
-
const jwksCache = new Map();
|
|
9
|
-
/** OIDC `discover` results (issuer → jwks_uri), cached for the process lifetime. */
|
|
10
|
-
const discoverCache = new Map();
|
|
11
|
-
/**
|
|
12
|
-
* Resolve the caller identity for the `validated_token` ingress mode (§6.2): pick
|
|
13
|
-
* the provider by token issuer, verify the token (JWKS / introspection / guest),
|
|
14
|
-
* then map its claims into the identity envelope. Fail-closed (401) throughout.
|
|
15
|
-
*/
|
|
16
|
-
export async function resolveValidatedTokenUser(cfg, ingress, request) {
|
|
17
|
-
const token = bearerToken(request);
|
|
18
|
-
const provider = selectProvider(ingress.providers, token);
|
|
19
|
-
const claims = await verifyProviderClaims(provider, token, request.headers);
|
|
20
|
-
const user = claimsToUser(provider, claims);
|
|
21
|
-
if (cfg.tenancy === "multi" && !user.mda_tenant_id) {
|
|
22
|
-
throw new HTTPException(401, {
|
|
23
|
-
message: "missing tenant for multi-tenant deployment",
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
return user;
|
|
27
|
-
}
|
|
28
|
-
/** Extract the bearer token from the `Authorization` header, or 401. */
|
|
29
|
-
export function bearerToken(request) {
|
|
30
|
-
const header = request.headers.get("authorization") ?? "";
|
|
31
|
-
const match = /^Bearer\s+(.+)$/i.exec(header);
|
|
32
|
-
const token = match?.[1];
|
|
33
|
-
if (!token) {
|
|
34
|
-
throw new HTTPException(401, { message: "missing bearer token" });
|
|
35
|
-
}
|
|
36
|
-
return token.trim();
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Select the provider that should verify `token`. A single-provider deployment
|
|
40
|
-
* always uses its one entry; otherwise selection is by the token's `iss` claim
|
|
41
|
-
* (guest tokens carry MDA's own issuer). Fail-closed on no match (401).
|
|
42
|
-
*/
|
|
43
|
-
export function selectProvider(providers, token) {
|
|
44
|
-
const [only] = providers;
|
|
45
|
-
if (only && providers.length === 1) {
|
|
46
|
-
return only;
|
|
47
|
-
}
|
|
48
|
-
let issuer;
|
|
49
|
-
try {
|
|
50
|
-
issuer = decodeJwt(token).iss;
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
throw new HTTPException(401, { message: "malformed token" });
|
|
54
|
-
}
|
|
55
|
-
const match = providers.find((p) => p.issuer && p.issuer === issuer);
|
|
56
|
-
if (match) {
|
|
57
|
-
return match;
|
|
58
|
-
}
|
|
59
|
-
if (issuer === GUEST_ISSUER) {
|
|
60
|
-
const guest = providers.find((p) => p.guest);
|
|
61
|
-
if (guest) {
|
|
62
|
-
return guest;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
throw new HTTPException(401, { message: "no provider matches token issuer" });
|
|
66
|
-
}
|
|
67
|
-
/** Map verified token claims into the managed user envelope, per `provider.claims`. */
|
|
68
|
-
export function claimsToUser(provider, claims) {
|
|
69
|
-
const actor = claims[provider.claims.actor];
|
|
70
|
-
if (actor == null || actor === "") {
|
|
71
|
-
throw new HTTPException(401, {
|
|
72
|
-
message: `token missing actor claim "${provider.claims.actor}"`,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
const user = {
|
|
76
|
-
identity: String(actor),
|
|
77
|
-
permissions: [],
|
|
78
|
-
mda_actor_id: String(actor),
|
|
79
|
-
mda_claims: { ...claims },
|
|
80
|
-
};
|
|
81
|
-
const tenant = provider.claims.tenant
|
|
82
|
-
? claims[provider.claims.tenant]
|
|
83
|
-
: undefined;
|
|
84
|
-
if (tenant != null && tenant !== "") {
|
|
85
|
-
user.mda_tenant_id = String(tenant);
|
|
86
|
-
}
|
|
87
|
-
const email = provider.claims.email
|
|
88
|
-
? claims[provider.claims.email]
|
|
89
|
-
: undefined;
|
|
90
|
-
if (email) {
|
|
91
|
-
user.mda_actor_email = String(email);
|
|
92
|
-
}
|
|
93
|
-
return user;
|
|
94
|
-
}
|
|
95
|
-
async function verifyProviderClaims(provider, token, headers) {
|
|
96
|
-
if (provider.introspect) {
|
|
97
|
-
return introspectClaims(provider, token, headers);
|
|
98
|
-
}
|
|
99
|
-
if (provider.guest) {
|
|
100
|
-
return verifyGuestToken(token);
|
|
101
|
-
}
|
|
102
|
-
return jwksVerifyClaims(provider, token);
|
|
103
|
-
}
|
|
104
|
-
async function jwksVerifyClaims(provider, token) {
|
|
105
|
-
const keySet = await providerKeySet(provider);
|
|
106
|
-
try {
|
|
107
|
-
const { payload } = await jwtVerify(token, keySet, {
|
|
108
|
-
issuer: provider.issuer,
|
|
109
|
-
audience: provider.audience,
|
|
110
|
-
algorithms: provider.algorithms,
|
|
111
|
-
});
|
|
112
|
-
return payload;
|
|
113
|
-
}
|
|
114
|
-
catch {
|
|
115
|
-
throw new HTTPException(401, {
|
|
116
|
-
message: "token signature verification failed",
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
async function providerKeySet(provider) {
|
|
121
|
-
const uri = await resolveJwksUri(provider);
|
|
122
|
-
let keySet = jwksCache.get(uri);
|
|
123
|
-
if (!keySet) {
|
|
124
|
-
keySet = createRemoteJWKSet(new URL(uri));
|
|
125
|
-
jwksCache.set(uri, keySet);
|
|
126
|
-
}
|
|
127
|
-
return keySet;
|
|
128
|
-
}
|
|
129
|
-
async function resolveJwksUri(provider) {
|
|
130
|
-
if (provider.jwks) {
|
|
131
|
-
return provider.jwks;
|
|
132
|
-
}
|
|
133
|
-
if (provider.discover && provider.issuer) {
|
|
134
|
-
const cached = discoverCache.get(provider.issuer);
|
|
135
|
-
if (cached) {
|
|
136
|
-
return cached;
|
|
137
|
-
}
|
|
138
|
-
const base = provider.issuer.replace(/\/$/, "");
|
|
139
|
-
const response = await fetch(`${base}/.well-known/openid-configuration`);
|
|
140
|
-
if (!response.ok) {
|
|
141
|
-
throw new HTTPException(401, {
|
|
142
|
-
message: "failed to resolve OIDC configuration",
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
const config = (await response.json());
|
|
146
|
-
if (!config.jwks_uri) {
|
|
147
|
-
throw new HTTPException(401, {
|
|
148
|
-
message: "OIDC configuration has no jwks_uri",
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
discoverCache.set(provider.issuer, config.jwks_uri);
|
|
152
|
-
return config.jwks_uri;
|
|
153
|
-
}
|
|
154
|
-
throw new HTTPException(500, {
|
|
155
|
-
message: "validated_token provider declares neither jwks nor discover",
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
async function introspectClaims(provider, token, headers) {
|
|
159
|
-
const introspect = provider.introspect;
|
|
160
|
-
const target = resolveIntrospection(provider, headers);
|
|
161
|
-
const requestHeaders = {};
|
|
162
|
-
// Base headers first, then the selected region's headers so a region can
|
|
163
|
-
// override the shared default (e.g. a per-region Supabase `apikey`).
|
|
164
|
-
for (const [key, value] of Object.entries(introspect.headers ?? {})) {
|
|
165
|
-
requestHeaders[key] = expandEnv(value);
|
|
166
|
-
}
|
|
167
|
-
for (const [key, value] of Object.entries(target.headers ?? {})) {
|
|
168
|
-
requestHeaders[key] = expandEnv(value);
|
|
169
|
-
}
|
|
170
|
-
if ((introspect.tokenIn ?? "authorization") === "authorization") {
|
|
171
|
-
requestHeaders.authorization = `Bearer ${token}`;
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
requestHeaders[introspect.header ?? "authorization"] = token;
|
|
175
|
-
}
|
|
176
|
-
// Expand `${ENV}` in the endpoint so region URLs can stay deployment-driven
|
|
177
|
-
// (e.g. `${SUPABASE_EU_URL}/auth/v1/user`) rather than baked in at authoring.
|
|
178
|
-
const response = await fetch(expandEnv(target.url), {
|
|
179
|
-
headers: requestHeaders,
|
|
180
|
-
});
|
|
181
|
-
if (!response.ok) {
|
|
182
|
-
throw new HTTPException(401, { message: "token introspection failed" });
|
|
183
|
-
}
|
|
184
|
-
return (await response.json());
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Resolve the introspection endpoint (and any region-specific headers) for the
|
|
188
|
-
* request. A single-endpoint provider uses `introspect.url`; a multi-region
|
|
189
|
-
* provider selects by the `regionHeader` value, where each region maps either to
|
|
190
|
-
* a bare URL (shared headers) or a `{ url, headers }` object carrying its own
|
|
191
|
-
* credential (e.g. a per-region Supabase `apikey`). Fail-closed (401/500).
|
|
192
|
-
*/
|
|
193
|
-
function resolveIntrospection(provider, headers) {
|
|
194
|
-
const introspect = provider.introspect;
|
|
195
|
-
if (introspect.url) {
|
|
196
|
-
return { url: introspect.url };
|
|
197
|
-
}
|
|
198
|
-
if (introspect.regionHeader && introspect.regions) {
|
|
199
|
-
const region = headers.get(introspect.regionHeader);
|
|
200
|
-
const entry = region ? introspect.regions[region] : undefined;
|
|
201
|
-
if (!entry) {
|
|
202
|
-
throw new HTTPException(401, {
|
|
203
|
-
message: "unknown or missing region for introspection",
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
return typeof entry === "string" ? { url: entry } : entry;
|
|
207
|
-
}
|
|
208
|
-
throw new HTTPException(500, {
|
|
209
|
-
message: "introspection provider declares neither url nor regions",
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
/** Verify an MDA-minted guest token (HS256, signed with the deployment key). */
|
|
213
|
-
async function verifyGuestToken(token) {
|
|
214
|
-
try {
|
|
215
|
-
const { payload } = await jwtVerify(token, guestSigningKey(), {
|
|
216
|
-
issuer: GUEST_ISSUER,
|
|
217
|
-
algorithms: ["HS256"],
|
|
218
|
-
});
|
|
219
|
-
return payload;
|
|
220
|
-
}
|
|
221
|
-
catch {
|
|
222
|
-
throw new HTTPException(401, { message: "invalid guest token" });
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Mint a short-lived guest token for an anonymous caller. Exposed for the guest
|
|
227
|
-
* issue/reissue route; the same deployment key verifies it on later calls.
|
|
228
|
-
*/
|
|
229
|
-
export async function issueGuestToken(provider, subject) {
|
|
230
|
-
const guest = provider.guest;
|
|
231
|
-
if (!guest?.issue) {
|
|
232
|
-
throw new HTTPException(400, {
|
|
233
|
-
message: "provider does not allow guest issuance",
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
const sub = `${guest.actorPrefix ?? ""}${subject ?? crypto.randomUUID()}`;
|
|
237
|
-
return new SignJWT({})
|
|
238
|
-
.setProtectedHeader({ alg: "HS256" })
|
|
239
|
-
.setIssuer(GUEST_ISSUER)
|
|
240
|
-
.setSubject(sub)
|
|
241
|
-
.setIssuedAt()
|
|
242
|
-
.setExpirationTime(guest.ttl ?? "24h")
|
|
243
|
-
.sign(guestSigningKey());
|
|
244
|
-
}
|
|
245
|
-
function guestSigningKey() {
|
|
246
|
-
const key = process.env[GUEST_KEY_ENV];
|
|
247
|
-
if (!key) {
|
|
248
|
-
throw new HTTPException(500, {
|
|
249
|
-
message: `guest tokens require ${GUEST_KEY_ENV}`,
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
return new TextEncoder().encode(key);
|
|
253
|
-
}
|
|
254
|
-
/** Expand a single `${ENV_VAR}` reference in a header value (e.g. Supabase apikey). */
|
|
255
|
-
function expandEnv(value) {
|
|
256
|
-
return value.replace(/\$\{([A-Z0-9_]+)\}/g, (_match, name) => {
|
|
257
|
-
return process.env[name] ?? "";
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
//# sourceMappingURL=validated-token.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validated-token.js","sourceRoot":"","sources":["../../src/runtime/validated-token.ts"],"names":[],"mappings":"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"}
|