@hazeljs/gateway 0.7.9 → 0.8.1
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 +22 -14
- package/dist/gateway.d.ts.map +1 -1
- package/dist/gateway.js +5 -2
- package/package.json +9 -6
package/README.md
CHANGED
|
@@ -126,7 +126,15 @@ USER_SVC_RATE_LIMIT_MAX=500
|
|
|
126
126
|
Decorators remain available for quick prototypes and when you prefer co-located configuration:
|
|
127
127
|
|
|
128
128
|
```typescript
|
|
129
|
-
import {
|
|
129
|
+
import {
|
|
130
|
+
Gateway,
|
|
131
|
+
Route,
|
|
132
|
+
ServiceRoute,
|
|
133
|
+
Canary,
|
|
134
|
+
GatewayCircuitBreaker,
|
|
135
|
+
GatewayRateLimit,
|
|
136
|
+
GatewayServer,
|
|
137
|
+
} from '@hazeljs/gateway';
|
|
130
138
|
|
|
131
139
|
@Gateway({
|
|
132
140
|
resilience: { defaultCircuitBreaker: { failureThreshold: 5 } },
|
|
@@ -194,12 +202,12 @@ gateway.on('canary:complete', (data) => {
|
|
|
194
202
|
|
|
195
203
|
## Version Routing Strategies
|
|
196
204
|
|
|
197
|
-
| Strategy | How It Works
|
|
198
|
-
|
|
199
|
-
| Header
|
|
200
|
-
| URI
|
|
201
|
-
| Query
|
|
202
|
-
| Weighted | Percentage-based random
|
|
205
|
+
| Strategy | How It Works | Example |
|
|
206
|
+
| -------- | -------------------------------- | --------------------------- |
|
|
207
|
+
| Header | Client sends `X-API-Version: v2` | Opt-in for specific clients |
|
|
208
|
+
| URI | Path prefix `/v2/api/users` | RESTful versioning |
|
|
209
|
+
| Query | `?version=v2` | Quick testing |
|
|
210
|
+
| Weighted | Percentage-based random | A/B testing, canary |
|
|
203
211
|
|
|
204
212
|
## HazelJS Core Integration
|
|
205
213
|
|
|
@@ -242,13 +250,13 @@ const response = await gateway.handleRequest({
|
|
|
242
250
|
|
|
243
251
|
## Environment Variable Convention
|
|
244
252
|
|
|
245
|
-
| Prefix
|
|
246
|
-
|
|
247
|
-
| `GATEWAY_*`
|
|
248
|
-
| `GATEWAY_CB_*`
|
|
249
|
-
| `<SERVICE>_SVC_*`
|
|
250
|
-
| `<SERVICE>_CANARY_*`
|
|
251
|
-
| `<SERVICE>_VERSION_*` | Version routing
|
|
253
|
+
| Prefix | Scope | Example |
|
|
254
|
+
| --------------------- | ----------------------- | -------------------------------- |
|
|
255
|
+
| `GATEWAY_*` | Global gateway settings | `GATEWAY_DEFAULT_TIMEOUT=5000` |
|
|
256
|
+
| `GATEWAY_CB_*` | Default circuit breaker | `GATEWAY_CB_THRESHOLD=5` |
|
|
257
|
+
| `<SERVICE>_SVC_*` | Per-service overrides | `USER_SVC_RATE_LIMIT_MAX=100` |
|
|
258
|
+
| `<SERVICE>_CANARY_*` | Canary deployment | `ORDER_CANARY_ERROR_THRESHOLD=5` |
|
|
259
|
+
| `<SERVICE>_VERSION_*` | Version routing | `PAYMENT_DEFAULT_VERSION=v1` |
|
|
252
260
|
|
|
253
261
|
## License
|
|
254
262
|
|
package/dist/gateway.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEtE,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,YAAY,EACZ,aAAa,EAGd,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAa3D,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,eAAe;IAQ5D;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,aAAa;IAQtF;;OAEG;IACH,MAAM,CAAC,SAAS,CACd,YAAY,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EACjD,OAAO,CAAC,EAAE,eAAe,GACxB,aAAa;IAuBhB;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,sBAAsB,GAAG,IAAI;IA8ClD;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEtE,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,YAAY,EACZ,aAAa,EAGd,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAa3D,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,eAAe;IAQ5D;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,aAAa;IAQtF;;OAEG;IACH,MAAM,CAAC,SAAS,CACd,YAAY,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EACjD,OAAO,CAAC,EAAE,eAAe,GACxB,aAAa;IAuBhB;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,sBAAsB,GAAG,IAAI;IA8ClD;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAgGlE;;OAEG;IACH,aAAa,IAAI,IAAI;IAQrB;;OAEG;IACH,IAAI,IAAI,IAAI;IASZ;;OAEG;IACH,UAAU,IAAI,cAAc;IAI5B;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI5D;;OAEG;IACH,SAAS,IAAI,MAAM,EAAE;IAIrB;;OAEG;IACH,kBAAkB,IAAI,eAAe;IAMrC,OAAO,CAAC,WAAW;YAUL,mBAAmB;YAoCnB,sBAAsB;IAgCpC,OAAO,CAAC,kBAAkB;CA2B3B"}
|
package/dist/gateway.js
CHANGED
|
@@ -163,13 +163,16 @@ class GatewayServer extends events_1.EventEmitter {
|
|
|
163
163
|
});
|
|
164
164
|
// Return 429 for rate limit exceeded (RFC 6585)
|
|
165
165
|
if (error instanceof resilience_1.RateLimitError) {
|
|
166
|
-
const
|
|
166
|
+
const rateLimitErr = error;
|
|
167
|
+
const retryAfterSec = rateLimitErr.retryAfterMs
|
|
168
|
+
? Math.ceil(rateLimitErr.retryAfterMs / 1000)
|
|
169
|
+
: 60;
|
|
167
170
|
return {
|
|
168
171
|
status: 429,
|
|
169
172
|
headers: { 'Retry-After': String(retryAfterSec) },
|
|
170
173
|
body: {
|
|
171
174
|
error: 'Too Many Requests',
|
|
172
|
-
message:
|
|
175
|
+
message: rateLimitErr.message,
|
|
173
176
|
retryAfter: retryAfterSec,
|
|
174
177
|
},
|
|
175
178
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hazeljs/gateway",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"description": "Intelligent API Gateway for HazelJS - Version routing, canary deployments, circuit breaking, and traffic management",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
"clean": "rm -rf dist"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@hazeljs/core": "^0.
|
|
22
|
-
"@hazeljs/discovery": "^0.
|
|
23
|
-
"@hazeljs/resilience": "^0.
|
|
21
|
+
"@hazeljs/core": "^0.8.1",
|
|
22
|
+
"@hazeljs/discovery": "^0.8.1",
|
|
23
|
+
"@hazeljs/resilience": "^0.8.1",
|
|
24
24
|
"axios": "^1.14.0",
|
|
25
25
|
"reflect-metadata": "^0.2.2"
|
|
26
26
|
},
|
|
@@ -38,7 +38,10 @@
|
|
|
38
38
|
"typescript": "^5.9.3"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
|
-
"@hazeljs/config": "*"
|
|
41
|
+
"@hazeljs/config": "*",
|
|
42
|
+
"@hazeljs/core": ">=0.2.0-beta.0",
|
|
43
|
+
"@hazeljs/discovery": ">=0.2.0-beta.0",
|
|
44
|
+
"@hazeljs/resilience": ">=0.2.0-beta.0"
|
|
42
45
|
},
|
|
43
46
|
"peerDependenciesMeta": {
|
|
44
47
|
"@hazeljs/config": {
|
|
@@ -70,5 +73,5 @@
|
|
|
70
73
|
"url": "https://github.com/hazeljs/hazel-js/issues"
|
|
71
74
|
},
|
|
72
75
|
"homepage": "https://hazeljs.ai",
|
|
73
|
-
"gitHead": "
|
|
76
|
+
"gitHead": "8b7685d1250c4622f25d83992f58e13a59bb3dba"
|
|
74
77
|
}
|