@introspection-sdk/introspection-proxy 0.8.2 → 0.9.0
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/.turbo/turbo-build.log +1 -1
- package/README.md +9 -0
- package/dist/proxy.d.ts +7 -0
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +19 -1
- package/dist/proxy.js.map +1 -1
- package/package.json +1 -1
- package/src/proxy.ts +33 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @introspection-sdk/introspection-proxy@0.
|
|
2
|
+
> @introspection-sdk/introspection-proxy@0.9.0 build /home/runner/work/introspection-js-sdk/introspection-js-sdk/packages/introspection-proxy
|
|
3
3
|
> tsc
|
|
4
4
|
|
package/README.md
CHANGED
|
@@ -36,6 +36,15 @@ const supabase = createClient(url, key, {
|
|
|
36
36
|
});
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
+
Active W3C trace context is injected into proxied requests. OTel baggage is
|
|
40
|
+
excluded by default because it can contain conversation or identity metadata.
|
|
41
|
+
Enable it only for a trusted application endpoint that participates in the
|
|
42
|
+
same distributed trace:
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
const mcpFetch = createProxyFetch({ propagateBaggage: true });
|
|
46
|
+
```
|
|
47
|
+
|
|
39
48
|
## How it works
|
|
40
49
|
|
|
41
50
|
Two proxy modes, selected per-request:
|
package/dist/proxy.d.ts
CHANGED
|
@@ -10,6 +10,13 @@ export interface ProxyFetchOptions {
|
|
|
10
10
|
* span regardless of this flag.
|
|
11
11
|
*/
|
|
12
12
|
tracing?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Propagate active OTel baggage alongside trace context (default false).
|
|
15
|
+
* Enable only for trusted application endpoints; baggage can contain
|
|
16
|
+
* conversation or identity correlation and must not be sent to arbitrary
|
|
17
|
+
* third-party hosts.
|
|
18
|
+
*/
|
|
19
|
+
propagateBaggage?: boolean;
|
|
13
20
|
}
|
|
14
21
|
export declare function resolveForwardProxyUrl(): string | undefined;
|
|
15
22
|
/**
|
package/dist/proxy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAkBA,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,QAAQ,CAAC;AAYhB,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAiBD,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,SAAS,CAQ3D;AA4BD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,iBAAsB,GAC9B,UAAU,GAAG,SAAS,CAUxB;AA2BD,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,iBAAsB,GAC9B,OAAO,KAAK,CAsFd;AAED,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,iBAAsB,GAAG,MAAM,IAAI,CAU7E"}
|
package/dist/proxy.js
CHANGED
|
@@ -15,8 +15,13 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { Socket } from "node:net";
|
|
17
17
|
import { connect as tlsConnect } from "node:tls";
|
|
18
|
+
import { context, propagation } from "@opentelemetry/api";
|
|
18
19
|
import { Agent, EnvHttpProxyAgent, fetch as undiciFetch, } from "undici";
|
|
19
20
|
import { matchesNoProxy, parseNoProxyEntries, tracedProxyCall, } from "./tracing.js";
|
|
21
|
+
// Agent sessions commonly pause for tools or user input between model calls.
|
|
22
|
+
// Undici's 4-second default closes the otherwise reusable egress connection
|
|
23
|
+
// before the next call, forcing another proxy socket handshake.
|
|
24
|
+
const EGRESS_KEEP_ALIVE_TIMEOUT_MS = 10 * 60 * 1000;
|
|
20
25
|
function resolveEgressUrl(options) {
|
|
21
26
|
return options.egressProxyUrl ?? process.env.INTROSPECTION_EGRESS_URL;
|
|
22
27
|
}
|
|
@@ -40,6 +45,8 @@ function buildEgressDispatcher(proxyUrl) {
|
|
|
40
45
|
const port = Number(url.port) || (useTls ? 443 : 80);
|
|
41
46
|
const host = url.hostname;
|
|
42
47
|
return new Agent({
|
|
48
|
+
keepAliveTimeout: EGRESS_KEEP_ALIVE_TIMEOUT_MS,
|
|
49
|
+
keepAliveMaxTimeout: EGRESS_KEEP_ALIVE_TIMEOUT_MS,
|
|
43
50
|
connect(_options, callback) {
|
|
44
51
|
if (useTls) {
|
|
45
52
|
const socket = tlsConnect({ host, port, servername: host });
|
|
@@ -81,6 +88,17 @@ function downgradeToHttp(url) {
|
|
|
81
88
|
const s = typeof url === "string" ? url : url.toString();
|
|
82
89
|
return s.startsWith("https://") ? "http://" + s.slice(8) : s;
|
|
83
90
|
}
|
|
91
|
+
function withInjectedTraceContext(opts, propagateBaggage) {
|
|
92
|
+
const headers = new Headers(opts.headers);
|
|
93
|
+
propagation.inject(context.active(), headers, {
|
|
94
|
+
set(carrier, key, value) {
|
|
95
|
+
if (!propagateBaggage && key.toLowerCase() === "baggage")
|
|
96
|
+
return;
|
|
97
|
+
carrier.set(key, value);
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
return { ...opts, headers };
|
|
101
|
+
}
|
|
84
102
|
export function createProxyFetch(options = {}) {
|
|
85
103
|
// Capture the real fetch now, before installProxyFetch swaps
|
|
86
104
|
// globalThis.fetch to this wrapper. The per-request fallback below must not
|
|
@@ -130,7 +148,7 @@ export function createProxyFetch(options = {}) {
|
|
|
130
148
|
if (useEgress && egressIsPlainHttp) {
|
|
131
149
|
target = downgradeToHttp(target);
|
|
132
150
|
}
|
|
133
|
-
const execute = () => undiciFetch(target, opts);
|
|
151
|
+
const execute = () => undiciFetch(target, withInjectedTraceContext(opts, options.propagateBaggage ?? false));
|
|
134
152
|
// A forward-dispatched request to a NO_PROXY host goes direct inside
|
|
135
153
|
// EnvHttpProxyAgent — no proxy hop, so no proxy span (in-cluster clients
|
|
136
154
|
// trace those calls themselves as `introspection-api-call`).
|
package/dist/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EACL,KAAK,EACL,iBAAiB,EAEjB,KAAK,IAAI,WAAW,GAErB,MAAM,QAAQ,CAAC;AAChB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,eAAe,GAChB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@introspection-sdk/introspection-proxy",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Outbound HTTP proxy helpers for routing fetch-based clients through the Introspection egress proxy or a standard forward proxy",
|
|
6
6
|
"engines": {
|
package/src/proxy.ts
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { Socket } from "node:net";
|
|
17
17
|
import { connect as tlsConnect } from "node:tls";
|
|
18
|
+
import { context, propagation } from "@opentelemetry/api";
|
|
18
19
|
import {
|
|
19
20
|
Agent,
|
|
20
21
|
EnvHttpProxyAgent,
|
|
@@ -28,6 +29,11 @@ import {
|
|
|
28
29
|
tracedProxyCall,
|
|
29
30
|
} from "./tracing.js";
|
|
30
31
|
|
|
32
|
+
// Agent sessions commonly pause for tools or user input between model calls.
|
|
33
|
+
// Undici's 4-second default closes the otherwise reusable egress connection
|
|
34
|
+
// before the next call, forcing another proxy socket handshake.
|
|
35
|
+
const EGRESS_KEEP_ALIVE_TIMEOUT_MS = 10 * 60 * 1000;
|
|
36
|
+
|
|
31
37
|
export interface ProxyFetchOptions {
|
|
32
38
|
egressProxyUrl?: string;
|
|
33
39
|
egressProxyHosts?: string;
|
|
@@ -39,6 +45,13 @@ export interface ProxyFetchOptions {
|
|
|
39
45
|
* span regardless of this flag.
|
|
40
46
|
*/
|
|
41
47
|
tracing?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Propagate active OTel baggage alongside trace context (default false).
|
|
50
|
+
* Enable only for trusted application endpoints; baggage can contain
|
|
51
|
+
* conversation or identity correlation and must not be sent to arbitrary
|
|
52
|
+
* third-party hosts.
|
|
53
|
+
*/
|
|
54
|
+
propagateBaggage?: boolean;
|
|
42
55
|
}
|
|
43
56
|
|
|
44
57
|
function resolveEgressUrl(options: ProxyFetchOptions): string | undefined {
|
|
@@ -73,6 +86,8 @@ function buildEgressDispatcher(proxyUrl: string): Dispatcher {
|
|
|
73
86
|
const host = url.hostname;
|
|
74
87
|
|
|
75
88
|
return new Agent({
|
|
89
|
+
keepAliveTimeout: EGRESS_KEEP_ALIVE_TIMEOUT_MS,
|
|
90
|
+
keepAliveMaxTimeout: EGRESS_KEEP_ALIVE_TIMEOUT_MS,
|
|
76
91
|
connect(
|
|
77
92
|
_options: buildConnector.Options,
|
|
78
93
|
callback: buildConnector.Callback,
|
|
@@ -120,6 +135,20 @@ function downgradeToHttp(url: string | URL): string {
|
|
|
120
135
|
return s.startsWith("https://") ? "http://" + s.slice(8) : s;
|
|
121
136
|
}
|
|
122
137
|
|
|
138
|
+
function withInjectedTraceContext(
|
|
139
|
+
opts: Record<string, unknown>,
|
|
140
|
+
propagateBaggage: boolean,
|
|
141
|
+
): Record<string, unknown> {
|
|
142
|
+
const headers = new Headers(opts.headers as HeadersInit | undefined);
|
|
143
|
+
propagation.inject(context.active(), headers, {
|
|
144
|
+
set(carrier, key, value) {
|
|
145
|
+
if (!propagateBaggage && key.toLowerCase() === "baggage") return;
|
|
146
|
+
carrier.set(key, value);
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
return { ...opts, headers };
|
|
150
|
+
}
|
|
151
|
+
|
|
123
152
|
export function createProxyFetch(
|
|
124
153
|
options: ProxyFetchOptions = {},
|
|
125
154
|
): typeof fetch {
|
|
@@ -182,7 +211,10 @@ export function createProxyFetch(
|
|
|
182
211
|
const execute = () =>
|
|
183
212
|
undiciFetch(
|
|
184
213
|
target as unknown as Parameters<typeof undiciFetch>[0],
|
|
185
|
-
|
|
214
|
+
withInjectedTraceContext(
|
|
215
|
+
opts,
|
|
216
|
+
options.propagateBaggage ?? false,
|
|
217
|
+
) as unknown as Parameters<typeof undiciFetch>[1],
|
|
186
218
|
) as unknown as Promise<Response>;
|
|
187
219
|
|
|
188
220
|
// A forward-dispatched request to a NO_PROXY host goes direct inside
|