@devtune/ai-traffic 0.3.0 → 0.4.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/README.md +26 -8
- package/dist/cjs/client-ip.js +5 -0
- package/dist/cjs/client-ip.js.map +1 -1
- package/dist/client-ip.d.ts +2 -1
- package/dist/client-ip.d.ts.map +1 -1
- package/dist/client-ip.js +5 -0
- package/dist/client-ip.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -95,15 +95,16 @@ A user agent is a claim, not an identity. Anything on the internet can send `GPT
|
|
|
95
95
|
|
|
96
96
|
The package only reads that address from a source your deployment declares as trustworthy, because a forgeable one verifies nothing:
|
|
97
97
|
|
|
98
|
-
| `trustedProxy` | Source | When to use it
|
|
99
|
-
| -------------- | ------------------------------------------------------------------------- |
|
|
100
|
-
| `"vercel"` | `x-vercel-forwarded-for`, which Vercel overwrites | Default when `VERCEL=1`
|
|
101
|
-
| `"connection"` | Socket peer supplied by the Express and Node adapters | Default everywhere else
|
|
102
|
-
| `"cloudflare"` | `cf-connecting-ip`, or `cf-connecting-ipv6` in Pseudo IPv4 overwrite mode | Cloudflare fronts the app
|
|
103
|
-
|
|
|
104
|
-
|
|
|
98
|
+
| `trustedProxy` | Source | When to use it |
|
|
99
|
+
| -------------- | ------------------------------------------------------------------------- | --------------------------------------- |
|
|
100
|
+
| `"vercel"` | `x-vercel-forwarded-for`, which Vercel overwrites | Default when `VERCEL=1` |
|
|
101
|
+
| `"connection"` | Socket peer supplied by the Express and Node adapters | Default everywhere else |
|
|
102
|
+
| `"cloudflare"` | `cf-connecting-ip`, or `cf-connecting-ipv6` in Pseudo IPv4 overwrite mode | Cloudflare fronts the app |
|
|
103
|
+
| "cloudfront" | Rightmost address in `x-forwarded-for`, appended by CloudFront | CloudFront connects directly to the app |
|
|
104
|
+
| A number | `x-forwarded-for`, counting that many trusted hops from the right | Another reverse proxy fronts the app |
|
|
105
|
+
| `"none"` | Nothing | Opt out of verification |
|
|
105
106
|
|
|
106
|
-
`x-forwarded-for` is
|
|
107
|
+
`x-forwarded-for` is only read when you select `"cloudfront"` or pass a numeric offset, because any client can append to it. When it is read, entries are counted from the right, so a padded chain cannot push the trusted hops out of range. Values that do not parse as an IPv4 or IPv6 literal are dropped.
|
|
107
108
|
|
|
108
109
|
No address is sent when the declared proxy's or hop count's header is absent, or when an edge runtime has neither a socket nor a declared proxy. DevTune records that traffic as unverified rather than guessing.
|
|
109
110
|
|
|
@@ -254,3 +255,20 @@ Registry refresh and ingest sends are fire-and-forget and guarded. Network failu
|
|
|
254
255
|
## License
|
|
255
256
|
|
|
256
257
|
[MIT](LICENSE) © 2026 PLGeek Ltd.
|
|
258
|
+
|
|
259
|
+
### CloudFront
|
|
260
|
+
|
|
261
|
+
When CloudFront connects directly to the application running the sensor, add
|
|
262
|
+
`trustedProxy: "cloudfront"` to your existing middleware options. No CloudFront
|
|
263
|
+
origin request policy change is needed.
|
|
264
|
+
|
|
265
|
+
CloudFront appends the viewer address to `X-Forwarded-For`, after any entries the
|
|
266
|
+
viewer supplied. The sensor reads that rightmost entry and ignores earlier ones.
|
|
267
|
+
See [AWS's documented custom-origin behavior](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html).
|
|
268
|
+
|
|
269
|
+
Only use this setting when requests reach the app through your trusted CloudFront
|
|
270
|
+
distribution. If an ALB or another proxy between CloudFront and the app appends
|
|
271
|
+
addresses, use a numeric `trustedProxy` offset instead: `0` selects the rightmost
|
|
272
|
+
entry, `1` skips one appended address, and so on. Confirm the actual header chain
|
|
273
|
+
before selecting an offset. Code executing inside CloudFront itself is a different
|
|
274
|
+
integration; this setting is for middleware at the origin.
|
package/dist/cjs/client-ip.js
CHANGED
|
@@ -25,6 +25,11 @@ function resolveClientIp(request, trustedProxy) {
|
|
|
25
25
|
if (trustedProxy === "connection") {
|
|
26
26
|
return normalizeIp(request.ip ?? null);
|
|
27
27
|
}
|
|
28
|
+
if (trustedProxy === "cloudfront") {
|
|
29
|
+
// CloudFront appends the TCP viewer address after any visitor-supplied entries.
|
|
30
|
+
// Additional downstream proxies require an explicit numeric offset instead.
|
|
31
|
+
return normalizeIp(readForwardedForHop(request, 0));
|
|
32
|
+
}
|
|
28
33
|
if (typeof trustedProxy === "number") {
|
|
29
34
|
return normalizeIp(readForwardedForHop(request, trustedProxy));
|
|
30
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-ip.js","sourceRoot":"","sources":["../../src/client-ip.ts"],"names":[],"mappings":";AAAA;;;GAGG;;
|
|
1
|
+
{"version":3,"file":"client-ip.js","sourceRoot":"","sources":["../../src/client-ip.ts"],"names":[],"mappings":"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"}
|
package/dist/client-ip.d.ts
CHANGED
|
@@ -10,12 +10,13 @@ import type { RequestLike } from "./client.js";
|
|
|
10
10
|
*
|
|
11
11
|
* - `"vercel"` reads `x-vercel-forwarded-for`, which Vercel overwrites.
|
|
12
12
|
* - `"cloudflare"` reads `cf-connecting-ip`, which Cloudflare overwrites.
|
|
13
|
+
* - "cloudfront" reads the rightmost x-forwarded-for entry for a direct CloudFront origin.
|
|
13
14
|
* - A number counts trusted hops at the right-hand end of `x-forwarded-for`
|
|
14
15
|
* and takes the entry immediately left of them.
|
|
15
16
|
* - `"connection"` uses the socket peer the adapter supplies and no header.
|
|
16
17
|
* - `"none"` sends no address at all.
|
|
17
18
|
*/
|
|
18
|
-
export type DevTuneAiTrafficTrustedProxy = "vercel" | "cloudflare" | "connection" | "none" | number;
|
|
19
|
+
export type DevTuneAiTrafficTrustedProxy = "vercel" | "cloudflare" | "cloudfront" | "connection" | "none" | number;
|
|
19
20
|
/**
|
|
20
21
|
* Picks the address source for a deployment that has not configured one.
|
|
21
22
|
* Vercel sets `VERCEL` on every runtime including edge, and overwrites its own
|
package/dist/client-ip.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-ip.d.ts","sourceRoot":"","sources":["../src/client-ip.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C
|
|
1
|
+
{"version":3,"file":"client-ip.d.ts","sourceRoot":"","sources":["../src/client-ip.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,4BAA4B,GACpC,QAAQ,GACR,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,MAAM,GACN,MAAM,CAAC;AAKX;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAoB,GACzD,4BAA4B,CAE9B;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,4BAA4B,GACzC,MAAM,GAAG,IAAI,CAwBf;AA8GD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,WAExC"}
|
package/dist/client-ip.js
CHANGED
|
@@ -20,6 +20,11 @@ export function resolveClientIp(request, trustedProxy) {
|
|
|
20
20
|
if (trustedProxy === "connection") {
|
|
21
21
|
return normalizeIp(request.ip ?? null);
|
|
22
22
|
}
|
|
23
|
+
if (trustedProxy === "cloudfront") {
|
|
24
|
+
// CloudFront appends the TCP viewer address after any visitor-supplied entries.
|
|
25
|
+
// Additional downstream proxies require an explicit numeric offset instead.
|
|
26
|
+
return normalizeIp(readForwardedForHop(request, 0));
|
|
27
|
+
}
|
|
23
28
|
if (typeof trustedProxy === "number") {
|
|
24
29
|
return normalizeIp(readForwardedForHop(request, trustedProxy));
|
|
25
30
|
}
|
package/dist/client-ip.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-ip.js","sourceRoot":"","sources":["../src/client-ip.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"client-ip.js","sourceRoot":"","sources":["../src/client-ip.ts"],"names":[],"mappings":"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"}
|