ninja-reverse-proxy 1.0.2 → 1.0.3

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 CHANGED
@@ -8,7 +8,7 @@ Designed in the same philosophy as Nginx, Traefik, and HAProxy — configure it
8
8
 
9
9
  ## Works with any HTTP backend
10
10
 
11
- Express · Fastify · NestJS · Django · FastAPI · Flask · Spring Boot · Go · ASP.NET Core · Kubernetes Services · Docker Compose services · **Any service that speaks HTTP**
11
+ node· Kubernetes Services · Docker Compose services · **Any service that speaks HTTP**
12
12
 
13
13
  The proxy never cares what technology runs behind the URLs. You configure upstreams in `config.yaml` and the proxy routes, balances, caches, rate-limits, and health-checks them automatically.
14
14
 
@@ -168,7 +168,7 @@ The proxy hot-reloads `config.d/` automatically whenever a file is added or chan
168
168
  | `server.httpsPort` | `8443` | HTTPS port — main entry point |
169
169
  | `server.workers` | `2` | Set to your CPU core count |
170
170
  | `loadBalancing.strategy` | `round-robin` | `round-robin` \| `least-connections` \| `ip-hash` \| `random` |
171
- | `loadBalancing.failureThreshold` | `3` | Mark upstream DOWN after N consecutive failures |
171
+ | `loadBalancing.failure0Threshold` | `3` | Mark upstream DOWN after N consecutive failures |
172
172
  | `loadBalancing.recoveryTimeMs` | `15000` | Retry a DOWN upstream after N ms |
173
173
  | `cache.enabled` | `false` | Enable Redis GET response caching |
174
174
  | `cache.ttlSeconds` | `60` | Cache TTL in seconds |
@@ -12,6 +12,7 @@ export declare const rootConfigSchema: z.ZodObject<{
12
12
  id: z.ZodString;
13
13
  url: z.ZodString;
14
14
  weight: z.ZodDefault<z.ZodNumber>;
15
+ healthPath: z.ZodDefault<z.ZodString>;
15
16
  }, z.core.$strip>>;
16
17
  headers: z.ZodOptional<z.ZodArray<z.ZodObject<{
17
18
  key: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../src/config-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiFxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAE3B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
1
+ {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../src/config-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAkFxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAE3B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -3,6 +3,7 @@ const upstreamSchema = z.object({
3
3
  id: z.string(),
4
4
  url: z.string().url(),
5
5
  weight: z.number().default(1),
6
+ healthPath: z.string().default("/health"),
6
7
  });
7
8
  const headerSchema = z.object({
8
9
  key: z.string(),
@@ -1 +1 @@
1
- {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../src/config-schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../src/config-schema.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -9,6 +9,7 @@ export declare function validateConfig(config: any): Promise<{
9
9
  id: string;
10
10
  url: string;
11
11
  weight: number;
12
+ healthPath: string;
12
13
  }[];
13
14
  paths: {
14
15
  path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,wBAAsB,eAAe,CAAC,QAAQ,EAAG,MAAM,gBAkEtD;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAE/C"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,wBAAsB,eAAe,CAAC,QAAQ,EAAG,MAAM,gBAkEtD;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAE/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,EAClD,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,iBAmC/B;AAGD,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,EAClD,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,EAC9B,EAAE,EAAE,YAAY,iBAwCjB"}
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,EAClD,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,iBAmC/B;AAGD,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,EAClD,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,EAC9B,EAAE,EAAE,YAAY,iBAmCjB"}
package/dist/health.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import http from "http";
2
2
  import { LoadBalancer } from "./loadBalancer.js";
3
- // Initial health check
3
+ // Initial health check
4
4
  export async function initialHealthCheck(upstreams, HEALTHY_UPSTREAMS) {
5
5
  console.log(`Initial health check`);
6
6
  for (const upstream of upstreams) {
@@ -9,7 +9,7 @@ export async function initialHealthCheck(upstreams, HEALTHY_UPSTREAMS) {
9
9
  const req = http.request({
10
10
  host: upstreamUrl.hostname,
11
11
  port: upstreamUrl.port,
12
- path: "/health",
12
+ path: upstream.healthPath ?? "/health",
13
13
  method: "GET",
14
14
  }, (initialRes) => {
15
15
  if (initialRes.statusCode === 200) {
@@ -44,16 +44,12 @@ export async function startHealthChecks(upstreams, HEALTHY_UPSTREAMS, lb) {
44
44
  const req = http.request({
45
45
  host: upstreamUrl.hostname,
46
46
  port: upstreamUrl.port,
47
- path: "/health",
47
+ path: upstream.healthPath ?? "/health",
48
48
  method: "GET",
49
49
  }, (HealthRes) => {
50
50
  if (HealthRes.statusCode === 200) {
51
- lb.recordSuccess(upstream.id);
52
51
  if (!HEALTHY_UPSTREAMS.has(upstream.id)) {
53
52
  HEALTHY_UPSTREAMS.add(upstream.id);
54
- if (!lb.hasUpstream(upstream.id)) {
55
- lb.addUpstream(upstream.id);
56
- }
57
53
  console.log(`${upstream.id} is back ONLINE!`);
58
54
  }
59
55
  else {
@@ -61,15 +57,13 @@ export async function startHealthChecks(upstreams, HEALTHY_UPSTREAMS, lb) {
61
57
  }
62
58
  }
63
59
  else {
64
- lb.recordFailure(upstream.id);
65
60
  HEALTHY_UPSTREAMS.delete(upstream.id);
66
61
  console.log(`${upstream.id} is DOWN!`);
67
62
  }
68
63
  });
69
- req.on('error', () => {
70
- lb.recordFailure(upstream.id);
64
+ req.on("error", () => {
71
65
  HEALTHY_UPSTREAMS.delete(upstream.id);
72
- console.log(`${upstream.id} is DOWN! (connection refused)`);
66
+ console.log(`${upstream.id} is DOWN! (con nection refused)`);
73
67
  });
74
68
  req.end();
75
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"health.js","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,wBAAwB;AACxB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAkD,EAClD,iBAA8B;IAE9B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CACtB;gBACE,IAAI,EAAE,WAAW,CAAC,QAAQ;gBAC1B,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,KAAK;aACd,EACD,CAAC,UAAU,EAAE,EAAE;gBACb,IAAI,UAAU,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAClC,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC;oBACzC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,EAAE,iBAAiB,CAAC,CAAC;oBAC7C,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACxC,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CACF,CAAC;YACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACnB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,EAAE,iBAAiB,CAAC,CAAC;gBAC7C,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACtC,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,oCAAoC;AACpC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAkD,EAClD,iBAA8B,EAC9B,EAAgB;IAEhB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,WAAW,CAAC,GAAG,EAAE;QACf,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CACtB;gBACE,IAAI,EAAE,WAAW,CAAC,QAAQ;gBAC1B,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,KAAK;aACd,EACD,CAAC,SAAS,EAAE,EAAE;gBACZ,IAAI,SAAS,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBACjC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC9B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;wBACxC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;wBACnC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;4BACjC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;wBAC9B,CAAC;wBACD,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,EAAE,kBAAkB,CAAC,CAAC;oBAChD,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC9B,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBACtC,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC,CAAC,CAAC;YACL,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACnB,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC9B,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,EAAE,gCAAgC,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,EAAE,KAAK,CAAC,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"loadBalancer.d.ts","sourceRoot":"","sources":["../src/loadBalancer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,aAAa,GACb,mBAAmB,GACnB,SAAS,GACT,QAAQ,CAAC;AAab,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,UAAU,CAAC;IACrB,SAAS,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAkC;gBAE3C,MAAM,EAAE,kBAAkB;IAqBtC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,IAAI;IAezC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAKhC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIhC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAW/B,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAc/B,OAAO,CAAC,YAAY;IAiBpB,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI/D,YAAY,CACV,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,QAAQ,CAAC,EAAE,MAAM,EACjB,kBAAkB,GAAE,GAAG,CAAC,MAAM,CAAa,GAC1C,MAAM,GAAG,IAAI;IA+ChB,OAAO,CAAC,MAAM;IAQd,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAanC"}
1
+ {"version":3,"file":"loadBalancer.d.ts","sourceRoot":"","sources":["../src/loadBalancer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,aAAa,GACb,mBAAmB,GACnB,SAAS,GACT,QAAQ,CAAC;AAab,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,UAAU,CAAC;IACrB,SAAS,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAkC;gBAE3C,MAAM,EAAE,kBAAkB;IAqBtC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,IAAI;IAezC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAKhC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIhC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAiB/B,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAgB/B,OAAO,CAAC,YAAY;IAoBpB,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI/D,YAAY,CACV,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,QAAQ,CAAC,EAAE,MAAM,EACjB,kBAAkB,GAAE,GAAG,CAAC,MAAM,CAAa,GAC1C,MAAM,GAAG,IAAI;IA8ChB,OAAO,CAAC,MAAM;IAQd,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAanC"}
@@ -50,6 +50,13 @@ export class LoadBalancer {
50
50
  const s = this.states.get(id);
51
51
  if (!s)
52
52
  return;
53
+ // have added this to check that whether HALP OPEN server returned back to CLOSED state by logging
54
+ if (s.state === "HALF_OPEN") {
55
+ console.log(`[CircuitBreaker] ${id} HALF_OPEN succeeded -> CLOSED`);
56
+ }
57
+ else {
58
+ console.log(`[CircuitBreaker] ${id} -> CLOSED`);
59
+ }
53
60
  s.failures = 0;
54
61
  s.state = "CLOSED";
55
62
  if (s.effectiveWeight < s.weight) {
@@ -67,10 +74,12 @@ export class LoadBalancer {
67
74
  if (s.effectiveWeight > 1) {
68
75
  s.effectiveWeight--;
69
76
  }
77
+ console.log(`[CircuitBreaker] ${id} failure count = ${s.failures}`);
70
78
  if (s.activeConnections > 0)
71
79
  s.activeConnections--;
72
80
  if (s.failures >= this.failureThreshold) {
73
81
  s.state = "OPEN";
82
+ console.log(`[CircuitBreaker] ${id} -> OPEN`);
74
83
  }
75
84
  }
76
85
  getAvailable(healthyIds) {
@@ -82,8 +91,12 @@ export class LoadBalancer {
82
91
  if (s.state === "OPEN") {
83
92
  if (now - s.lastFailureTime >= this.recoveryTimeMs) {
84
93
  s.state = "HALF_OPEN";
94
+ console.log(`[CircuitBreaker] ${s.id} -> HALF_OPEN`);
85
95
  available.push(s);
86
96
  }
97
+ else {
98
+ console.log(`[CircuitBreaker] ${s.id} is OPEN, skipping`);
99
+ }
87
100
  continue;
88
101
  }
89
102
  available.push(s);
@@ -1 +1 @@
1
- {"version":3,"file":"loadBalancer.js","sourceRoot":"","sources":["../src/loadBalancer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loadBalancer.js","sourceRoot":"","sources":["../src/loadBalancer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare class MetricsRegistry {
2
+ private requestsTotal;
3
+ private requestDurationSum;
4
+ private requestDurationCount;
5
+ private activeConnections;
6
+ private cacheOperations;
7
+ private healthyUpstreams;
8
+ constructor(healthyUpstreams: Set<string>);
9
+ recordRequest(method: string, path: string, status: number, upstreamId: string, durationMs: number): void;
10
+ recordActiveConnection(upstreamId: string, delta: number): void;
11
+ recordCacheOp(action: "hit" | "miss"): void;
12
+ getExpositionFormat(allUpstreamIds: string[]): string;
13
+ }
14
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,gBAAgB,CAAc;gBAE1B,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC;IAIlC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAWlG,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAKxD,aAAa,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM;IAIpC,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM;CA6C7D"}
@@ -0,0 +1,70 @@
1
+ export class MetricsRegistry {
2
+ requestsTotal = new Map();
3
+ requestDurationSum = new Map();
4
+ requestDurationCount = new Map();
5
+ activeConnections = new Map();
6
+ cacheOperations = new Map();
7
+ healthyUpstreams;
8
+ constructor(healthyUpstreams) {
9
+ this.healthyUpstreams = healthyUpstreams;
10
+ }
11
+ recordRequest(method, path, status, upstreamId, durationMs) {
12
+ const cleanPath = path.split("?")[0]; // remove query parameters
13
+ const key = `method="${method}",path="${cleanPath}",status="${status}",upstream_id="${upstreamId}"`;
14
+ this.requestsTotal.set(key, (this.requestsTotal.get(key) || 0) + 1);
15
+ const durationKey = `method="${method}",path="${cleanPath}",upstream_id="${upstreamId}"`;
16
+ const durationSeconds = durationMs / 1000;
17
+ this.requestDurationSum.set(durationKey, (this.requestDurationSum.get(durationKey) || 0) + durationSeconds);
18
+ this.requestDurationCount.set(durationKey, (this.requestDurationCount.get(durationKey) || 0) + 1);
19
+ }
20
+ recordActiveConnection(upstreamId, delta) {
21
+ const current = this.activeConnections.get(upstreamId) || 0;
22
+ this.activeConnections.set(upstreamId, Math.max(0, current + delta));
23
+ }
24
+ recordCacheOp(action) {
25
+ this.cacheOperations.set(action, (this.cacheOperations.get(action) || 0) + 1);
26
+ }
27
+ getExpositionFormat(allUpstreamIds) {
28
+ let output = "";
29
+ output += "# HELP ninja_http_requests_total Total number of HTTP requests processed by the proxy\n";
30
+ output += "# TYPE ninja_http_requests_total counter\n";
31
+ for (const [labels, count] of this.requestsTotal.entries()) {
32
+ output += `ninja_http_requests_total{${labels}} ${count}\n`;
33
+ }
34
+ output += "\n";
35
+ output += "# HELP ninja_http_request_duration_seconds_sum Sum of request durations in seconds\n";
36
+ output += "# TYPE ninja_http_request_duration_seconds_sum counter\n";
37
+ for (const [labels, sum] of this.requestDurationSum.entries()) {
38
+ output += `ninja_http_request_duration_seconds_sum{${labels}} ${sum.toFixed(6)}\n`;
39
+ }
40
+ output += "\n";
41
+ output += "# HELP ninja_http_request_duration_seconds_count Count of requests for duration tracking\n";
42
+ output += "# TYPE ninja_http_request_duration_seconds_count counter\n";
43
+ for (const [labels, count] of this.requestDurationCount.entries()) {
44
+ output += `ninja_http_request_duration_seconds_count{${labels}} ${count}\n`;
45
+ }
46
+ output += "\n";
47
+ output += "# HELP ninja_active_connections Current number of active connections to the upstream\n";
48
+ output += "# TYPE ninja_active_connections gauge\n";
49
+ for (const upstreamId of allUpstreamIds) {
50
+ const active = this.activeConnections.get(upstreamId) || 0;
51
+ output += `ninja_active_connections{upstream_id="${upstreamId}"} ${active}\n`;
52
+ }
53
+ output += "\n";
54
+ output += "# HELP ninja_cache_operations_total Total cache hits/misses\n";
55
+ output += "# TYPE ninja_cache_operations_total counter\n";
56
+ output += `ninja_cache_operations_total{action="hit"} ${this.cacheOperations.get("hit") || 0}\n`;
57
+ output += `ninja_cache_operations_total{action="miss"} ${this.cacheOperations.get("miss") || 0}\n`;
58
+ output += "\n";
59
+ // 6. Upstream status
60
+ output += "# HELP ninja_upstream_status Health status of the upstream (1 = UP, 0 = DOWN)\n";
61
+ output += "# TYPE ninja_upstream_status gauge\n";
62
+ for (const upstreamId of allUpstreamIds) {
63
+ const isUp = this.healthyUpstreams.has(upstreamId) ? 1 : 0;
64
+ output += `ninja_upstream_status{upstream_id="${upstreamId}"} ${isUp}\n`;
65
+ }
66
+ output += "\n";
67
+ return output;
68
+ }
69
+ }
70
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,7 @@ export declare const workerMessageReplySchema: z.ZodObject<{
19
19
  statusCode: z.ZodOptional<z.ZodNumber>;
20
20
  isCompressed: z.ZodOptional<z.ZodBoolean>;
21
21
  encoding: z.ZodOptional<z.ZodString>;
22
+ headers: z.ZodOptional<z.ZodAny>;
22
23
  }, z.core.$strip>;
23
24
  export type WorkerMessageType = z.infer<typeof workerMessageSchema>;
24
25
  export type WorkerReplyMessageType = z.infer<typeof workerMessageReplySchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"server-schema.d.ts","sourceRoot":"","sources":["../src/server-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,eAAO,MAAM,mBAAmB;;;;;;;;;;;iBAM9B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;iBAQnC,CAAC;AAGH,MAAM,MAAO,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACrE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
1
+ {"version":3,"file":"server-schema.d.ts","sourceRoot":"","sources":["../src/server-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,eAAO,MAAM,mBAAmB;;;;;;;;;;;iBAM9B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;iBASnC,CAAC;AAGH,MAAM,MAAO,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACrE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
@@ -14,5 +14,6 @@ export const workerMessageReplySchema = z.object({
14
14
  statusCode: z.number().optional(),
15
15
  isCompressed: z.boolean().optional(),
16
16
  encoding: z.string().optional(),
17
+ headers: z.any().optional(),
17
18
  });
18
19
  //# sourceMappingURL=server-schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-schema.js","sourceRoot":"","sources":["../src/server-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,WAAW,EAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtD,OAAO,EAAI,CAAC,CAAC,GAAG,EAAE;IAClB,IAAI,EAAG,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,GAAG,EAAG,CAAC,CAAC,MAAM,EAAE;IAChB,SAAS,EAAG,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAChC,CAAC,CAAC"}
1
+ {"version":3,"file":"server-schema.js","sourceRoot":"","sources":["../src/server-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,WAAW,EAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtD,OAAO,EAAI,CAAC,CAAC,GAAG,EAAE;IAClB,IAAI,EAAG,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,GAAG,EAAG,CAAC,CAAC,MAAM,EAAE;IAChB,SAAS,EAAG,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAoB3D,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AA4CD,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,gBAAgB,iBAuCnE;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,kBAAkB,iBAkjB5D"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAqB3D,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AA6CD,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,gBAAgB,iBAuCnE;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,kBAAkB,iBA+qB5D"}
package/dist/server.js CHANGED
@@ -2,6 +2,7 @@ import http from "http";
2
2
  import https from "https";
3
3
  import { readFileSync, promises as fs } from "fs";
4
4
  import path from "path";
5
+ import net from "net";
5
6
  import cluster, { Worker } from "node:cluster";
6
7
  import { rootConfigSchema } from "./config-schema.js";
7
8
  import zlib from "zlib";
@@ -11,10 +12,12 @@ import { RateLimiter } from "./rate-limiter.js";
11
12
  import { LoadBalancer } from "./loadBalancer.js";
12
13
  import { registry } from "./Serviceregistry.js";
13
14
  import { Cache } from "./cache.js";
15
+ import { MetricsRegistry } from "./metrics.js";
14
16
  let WORKER_POOL = [];
15
17
  let ACTIVE_CONFIG;
16
18
  let lb;
17
19
  let cache;
20
+ let metricsRegistry;
18
21
  const HEALTHY_UPSTREAMS = new Set();
19
22
  const rateLimiters = new Map();
20
23
  async function writeAccessLog(logPath, clientIp, method, url, statusCode, bytesSent, latencyMs, userAgent) {
@@ -104,6 +107,7 @@ export async function createServer(config) {
104
107
  ttlSeconds: ACTIVE_CONFIG.server.cache.ttlSeconds,
105
108
  });
106
109
  await cache.connect();
110
+ metricsRegistry = new MetricsRegistry(HEALTHY_UPSTREAMS);
107
111
  lb = new LoadBalancer({
108
112
  strategy: ACTIVE_CONFIG.server.loadBalancing.strategy,
109
113
  upstreams: ACTIVE_CONFIG.server.upstreams,
@@ -151,9 +155,11 @@ export async function createServer(config) {
151
155
  if (!upstreamId) {
152
156
  res.writeHead(503, { "Content-Type": "application/json" });
153
157
  res.end(JSON.stringify({ error: "No healthy upstreams available" }));
158
+ metricsRegistry.recordRequest(payload.requestType, payload.url, 503, "none", performance.now() - startTime);
154
159
  return;
155
160
  }
156
161
  attemptedUpstreams.add(upstreamId);
162
+ metricsRegistry.recordActiveConnection(upstreamId, 1);
157
163
  const serviceInstance = registry.get(upstreamId);
158
164
  if (!serviceInstance) {
159
165
  res.writeHead(503);
@@ -189,16 +195,24 @@ export async function createServer(config) {
189
195
  (reply.statusCode && retryConfig.statusCodes.includes(reply.statusCode))) {
190
196
  lb.recordFailure(upstreamId);
191
197
  if (attempt < retryConfig.maxAttempts) {
198
+ metricsRegistry.recordActiveConnection(upstreamId, -1);
192
199
  dispatchToWorker(payload, clientIp, res, attempt + 1, attemptedUpstreams, startTime);
193
200
  }
194
201
  else {
202
+ metricsRegistry.recordActiveConnection(upstreamId, -1);
195
203
  res.writeHead(reply.statusCode ?? 502);
196
204
  res.end(reply.error || "Bad Gateway");
205
+ metricsRegistry.recordRequest(payload.requestType, payload.url, reply.statusCode ?? 502, upstreamId, performance.now() - startTime);
197
206
  writeAccessLog(ACTIVE_CONFIG.server.accessLog, clientIp, payload.requestType, payload.url, reply.statusCode ?? 502, 0, performance.now() - startTime, payload.headers["user-agent"] ?? "-");
198
207
  }
199
208
  }
200
209
  else {
201
210
  lb.recordSuccess(upstreamId);
211
+ metricsRegistry.recordActiveConnection(upstreamId, -1);
212
+ metricsRegistry.recordRequest(payload.requestType, payload.url, reply.statusCode ?? 200, upstreamId, performance.now() - startTime);
213
+ if (payload.requestType === "GET") {
214
+ metricsRegistry.recordCacheOp("miss");
215
+ }
202
216
  let responseData = reply.data;
203
217
  if (reply.isCompressed && reply.encoding === "gzip") {
204
218
  responseData = Buffer.from(reply.data, "base64");
@@ -212,13 +226,14 @@ export async function createServer(config) {
212
226
  "Access-Control-Allow-Methods": "GET,POST,PUT,DELETE,OPTIONS",
213
227
  "Access-Control-Allow-Headers": "*",
214
228
  "Access-Control-Allow-Credentials": "true",
229
+ ...(reply.headers || {}),
215
230
  };
231
+ delete responseHeaders["content-length"];
232
+ delete responseHeaders["transfer-encoding"];
233
+ delete responseHeaders["connection"];
216
234
  if (pathRule?.sticky) {
217
235
  responseHeaders["Set-Cookie"] = `NINJA_ROUTE=${upstreamId}; Path=/; HttpOnly; SameSite=Lax`;
218
236
  }
219
- if (reply.isCompressed && reply.encoding) {
220
- responseHeaders["Content-Encoding"] = reply.encoding;
221
- }
222
237
  res.writeHead(reply.statusCode ?? 200, responseHeaders);
223
238
  res.end(responseData);
224
239
  writeAccessLog(ACTIVE_CONFIG.server.accessLog, clientIp, payload.requestType, payload.url, reply.statusCode ?? 200, Buffer.byteLength(responseData), performance.now() - startTime, payload.headers["user-agent"] ?? "-");
@@ -226,12 +241,65 @@ export async function createServer(config) {
226
241
  };
227
242
  timer = setTimeout(() => {
228
243
  worker.off("message", handler);
244
+ metricsRegistry.recordActiveConnection(upstreamId, -1);
229
245
  res.writeHead(504);
230
246
  res.end("Gateway Timeout");
247
+ metricsRegistry.recordRequest(payload.requestType, payload.url, 504, upstreamId, performance.now() - startTime);
231
248
  writeAccessLog(ACTIVE_CONFIG.server.accessLog, clientIp, payload.requestType, payload.url, 504, 0, performance.now() - startTime, payload.headers["user-agent"] ?? "-");
232
249
  }, ACTIVE_CONFIG.server.readTimeoutMs);
233
250
  worker.on("message", handler);
234
251
  }
252
+ function handleWebSocketUpgrade(req, socket, head) {
253
+ const url = new URL(req.url, `http://${req.headers.host}`);
254
+ const pathRule = ACTIVE_CONFIG.server.paths.find((p) => url.pathname.startsWith(p.path));
255
+ if (!pathRule) {
256
+ socket.destroy();
257
+ return;
258
+ }
259
+ const clientIP = req.headers["x-forwarded-for"] ??
260
+ socket.remoteAddress ??
261
+ "unknown";
262
+ const upstreamId = lb.pickFiltered(HEALTHY_UPSTREAMS, clientIP, new Set());
263
+ if (!upstreamId) {
264
+ socket.destroy();
265
+ return;
266
+ }
267
+ const serviceInstance = registry.get(upstreamId);
268
+ if (!serviceInstance) {
269
+ socket.destroy();
270
+ return;
271
+ }
272
+ const upstreamUrl = new URL(serviceInstance.url);
273
+ const targetSocket = net.connect({
274
+ host: upstreamUrl.hostname,
275
+ port: parseInt(upstreamUrl.port || "80"),
276
+ }, () => {
277
+ let rawRequest = `${req.method} ${req.url} HTTP/${req.httpVersion}\r\n`;
278
+ for (const [key, val] of Object.entries(req.headers)) {
279
+ if (Array.isArray(val)) {
280
+ val.forEach((v) => {
281
+ rawRequest += `${key}: ${v}\r\n`;
282
+ });
283
+ }
284
+ else {
285
+ rawRequest += `${key}: ${val}\r\n`;
286
+ }
287
+ }
288
+ rawRequest += "\r\n";
289
+ targetSocket.write(rawRequest);
290
+ if (head && head.length > 0) {
291
+ targetSocket.write(head);
292
+ }
293
+ socket.pipe(targetSocket);
294
+ targetSocket.pipe(socket);
295
+ });
296
+ targetSocket.on("error", () => {
297
+ socket.destroy();
298
+ });
299
+ socket.on("error", () => {
300
+ targetSocket.destroy();
301
+ });
302
+ }
235
303
  const httpServer = http.createServer((req, res) => {
236
304
  if (req.url?.startsWith("/__registry")) {
237
305
  httpsServer.emit("request", req, res);
@@ -241,6 +309,7 @@ export async function createServer(config) {
241
309
  res.writeHead(301, { Location: httpsUrl });
242
310
  res.end();
243
311
  });
312
+ httpServer.on("upgrade", handleWebSocketUpgrade);
244
313
  const httpsServer = https.createServer(sslOptions, async (req, res) => {
245
314
  const clientIP = req.headers["x-forwarded-for"] ??
246
315
  req.socket.remoteAddress ??
@@ -264,6 +333,12 @@ export async function createServer(config) {
264
333
  }, null, 2));
265
334
  return;
266
335
  }
336
+ if (req.url === "/metrics" || req.url === "/__metrics") {
337
+ res.writeHead(200, { "Content-Type": "text/plain; version=0.0.4; charset=utf-8" });
338
+ const allUpstreams = [...new Set([...ACTIVE_CONFIG.server.upstreams.map(u => u.id), ...registry.getAll().map(s => s.id)])];
339
+ res.end(metricsRegistry.getExpositionFormat(allUpstreams));
340
+ return;
341
+ }
267
342
  if (req.url === "/__registry") {
268
343
  res.writeHead(200, { "Content-Type": "application/json" });
269
344
  res.end(JSON.stringify(registry.getStats(), null, 2));
@@ -324,6 +399,8 @@ export async function createServer(config) {
324
399
  if (cached) {
325
400
  res.writeHead(200, { "X-Cache": "HIT" });
326
401
  res.end(cached);
402
+ metricsRegistry.recordCacheOp("hit");
403
+ metricsRegistry.recordRequest("GET", req.url ?? "", 200, "cache", 0);
327
404
  writeAccessLog(ACTIVE_CONFIG.server.accessLog, clientIP, req.method, req.url ?? "", 200, Buffer.byteLength(cached), 0, req.headers["user-agent"] ?? "-");
328
405
  return;
329
406
  }
@@ -348,6 +425,7 @@ export async function createServer(config) {
348
425
  dispatchToWorker(payload, clientIP, res);
349
426
  });
350
427
  });
428
+ httpsServer.on("upgrade", handleWebSocketUpgrade);
351
429
  let isShuttingDown = false;
352
430
  async function gracefulShutdown(signal) {
353
431
  if (isShuttingDown)
@@ -450,27 +528,59 @@ export async function createServer(config) {
450
528
  const acceptEncoding = msg.headers["accept-encoding"] || "";
451
529
  const contentType = upstreamRes.headers["content-type"] || "";
452
530
  const isCompressible = /json|text|javascript|css/.test(contentType);
453
- if (workerConfig.server.compression && isCompressible && acceptEncoding.includes("gzip")) {
454
- zlib.gzip(bodyBuffer, (err, compressed) => {
531
+ const upstreamEncoding = upstreamRes.headers["content-encoding"];
532
+ // Strip content-encoding from upstream headers — we decompress first,
533
+ // then optionally re-compress via the proxy's own compression layer.
534
+ const forwardHeaders = { ...upstreamRes.headers };
535
+ delete forwardHeaders["content-encoding"];
536
+ const sendReply = (rawBody) => {
537
+ if (workerConfig.server.compression && isCompressible && acceptEncoding.includes("gzip")) {
538
+ zlib.gzip(rawBody, (err, compressed) => {
539
+ const reply = {
540
+ requestId: raw.requestId,
541
+ data: err ? rawBody.toString("utf8") : compressed.toString("base64"),
542
+ isCompressed: !err,
543
+ encoding: err ? undefined : "gzip",
544
+ statusCode: upstreamRes.statusCode ?? 200,
545
+ headers: err ? forwardHeaders : { ...forwardHeaders, "content-encoding": "gzip" },
546
+ };
547
+ if (process.send)
548
+ process.send(JSON.stringify(reply));
549
+ });
550
+ }
551
+ else {
455
552
  const reply = {
456
553
  requestId: raw.requestId,
457
- data: err ? bodyBuffer.toString("utf8") : compressed.toString("base64"),
458
- isCompressed: !err,
459
- encoding: err ? undefined : "gzip",
554
+ data: rawBody.toString("utf8"),
460
555
  statusCode: upstreamRes.statusCode ?? 200,
556
+ headers: forwardHeaders,
461
557
  };
462
558
  if (process.send)
463
559
  process.send(JSON.stringify(reply));
560
+ }
561
+ };
562
+ if (upstreamEncoding === "gzip") {
563
+ zlib.gunzip(bodyBuffer, (err, decompressed) => {
564
+ if (err) {
565
+ // Decompression failed — send raw bytes as base64 with original headers
566
+ const reply = {
567
+ requestId: raw.requestId,
568
+ data: bodyBuffer.toString("base64"),
569
+ isCompressed: true,
570
+ encoding: "gzip",
571
+ statusCode: upstreamRes.statusCode ?? 200,
572
+ headers: upstreamRes.headers,
573
+ };
574
+ if (process.send)
575
+ process.send(JSON.stringify(reply));
576
+ }
577
+ else {
578
+ sendReply(decompressed);
579
+ }
464
580
  });
465
581
  }
466
582
  else {
467
- const reply = {
468
- requestId: raw.requestId,
469
- data: bodyBuffer.toString("utf8"),
470
- statusCode: upstreamRes.statusCode ?? 200,
471
- };
472
- if (process.send)
473
- process.send(JSON.stringify(reply));
583
+ sendReply(bodyBuffer);
474
584
  }
475
585
  });
476
586
  });
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ services:
2
+ prometheus:
3
+ image: prom/prometheus:latest
4
+ container_name: ninja-prometheus
5
+ volumes:
6
+ - ./prometheus.yml:/etc/prometheus/prometheus.yml
7
+ ports:
8
+ - "9090:9090"
9
+ extra_hosts:
10
+ - "host.docker.internal:host-gateway"
11
+
12
+ grafana:
13
+ image: grafana/grafana:latest
14
+ container_name: ninja-grafana
15
+ ports:
16
+ - "3000:3000"
17
+ environment:
18
+ - GF_AUTH_ANONYMOUS_ENABLED=true
19
+ - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
20
+ - GF_SECURITY_ALLOW_EMBEDDING=true
21
+ depends_on:
22
+ - prometheus
@@ -0,0 +1,11 @@
1
+ global:
2
+ scrape_interval: 5s
3
+
4
+ scrape_configs:
5
+ - job_name: 'ninja-reverse-proxy'
6
+ metrics_path: '/metrics'
7
+ scheme: 'https'
8
+ static_configs:
9
+ - targets: ['host.docker.internal:8443']
10
+ tls_config:
11
+ insecure_skip_verify: true
@@ -0,0 +1,16 @@
1
+ Keep-Alive: timeout=5
2
+
3
+ Backend-2 Failedubuntu@ip-1curl http://localhost:3000//localhost:3000/
4
+ curl http://localhost:3001/
5
+ Hello from Backend-1Hello fcurl -k -i https://localhost:8443/retry curl -k -i https://localhost:8443/retry
6
+ HTTP/1.1 200 OK
7
+ Access-Control-Allow-Origin: *
8
+ Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
9
+ Access-Control-Allow-Headers: *
10
+ Access-Control-Allow-Credentials: true
11
+ Date: Mon, 20 Jul 2026 11:24:37 GMT
12
+ Connection: keep-alive
13
+ Keep-Alive: timeout=5
14
+ Transfer-Encoding: chunked
15
+
16
+ Request handled by Backend-1ubuntu@ip-172-31-89-102:~$
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ninja-reverse-proxy",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "A production-grade reverse proxy with load balancing, circuit breaker, sticky sessions, and dynamic service registry.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",