exisjs 0.7.1 → 0.7.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/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +10 -0
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +258 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +7 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +26 -19
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/index.js +15 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/manifest.d.ts.map +1 -1
- package/dist/cli/manifest.js +3 -1
- package/dist/cli/manifest.js.map +1 -1
- package/dist/cli/resolve-aliases.d.ts +12 -0
- package/dist/cli/resolve-aliases.d.ts.map +1 -1
- package/dist/cli/resolve-aliases.js +119 -45
- package/dist/cli/resolve-aliases.js.map +1 -1
- package/dist/cli/routes.d.ts +8 -1
- package/dist/cli/routes.d.ts.map +1 -1
- package/dist/cli/routes.js +96 -47
- package/dist/cli/routes.js.map +1 -1
- package/dist/config/config.d.ts +2 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +1 -0
- package/dist/config/config.js.map +1 -1
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +6 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/types.d.ts +4 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/docs/content/cli/commands.mdx +36 -3
- package/dist/docs/content/cli/overview.mdx +1 -0
- package/dist/docs/content/config.mdx +8 -1
- package/dist/docs/content/errors.mdx +14 -14
- package/dist/docs/content/responses.mdx +106 -0
- package/dist/docs/content/routing.mdx +20 -15
- package/dist/docs/content/security.mdx +6 -1
- package/dist/docs/content/structure.mdx +12 -6
- package/dist/lib/start-server.js +8 -0
- package/dist/lib/start-server.js.map +1 -1
- package/dist/middleware/compression.d.ts.map +1 -1
- package/dist/middleware/compression.js +20 -5
- package/dist/middleware/compression.js.map +1 -1
- package/dist/middleware/middleware.d.ts +3 -0
- package/dist/middleware/middleware.d.ts.map +1 -1
- package/dist/middleware/middleware.js +112 -46
- package/dist/middleware/middleware.js.map +1 -1
- package/dist/middleware/security.d.ts.map +1 -1
- package/dist/middleware/security.js +55 -10
- package/dist/middleware/security.js.map +1 -1
- package/dist/router/boundary.d.ts +5 -1
- package/dist/router/boundary.d.ts.map +1 -1
- package/dist/router/boundary.js.map +1 -1
- package/dist/router/index.d.ts +2 -0
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +5 -1
- package/dist/router/index.js.map +1 -1
- package/dist/router/route-builder.d.ts +25 -19
- package/dist/router/route-builder.d.ts.map +1 -1
- package/dist/router/route-builder.js.map +1 -1
- package/dist/router/route-scanner.d.ts.map +1 -1
- package/dist/router/route-scanner.js +48 -15
- package/dist/router/route-scanner.js.map +1 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +9 -2
- package/dist/router/router.js.map +1 -1
- package/dist/sanitize/index.d.ts +9 -9
- package/dist/sanitize/index.d.ts.map +1 -1
- package/dist/sanitize/index.js +19 -10
- package/dist/sanitize/index.js.map +1 -1
- package/dist/sanitize/sanitize.d.ts +11 -11
- package/dist/sanitize/sanitize.d.ts.map +1 -1
- package/dist/sanitize/sanitize.js +22 -13
- package/dist/sanitize/sanitize.js.map +1 -1
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +18 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/response.d.ts +27 -0
- package/dist/server/response.d.ts.map +1 -1
- package/dist/server/response.js +109 -4
- package/dist/server/response.js.map +1 -1
- package/dist/server/sse.d.ts +82 -0
- package/dist/server/sse.d.ts.map +1 -0
- package/dist/server/sse.js +216 -0
- package/dist/server/sse.js.map +1 -0
- package/dist/testing/client.d.ts.map +1 -1
- package/dist/testing/client.js +33 -5
- package/dist/testing/client.js.map +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +2 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/validator/index.d.ts +2 -0
- package/dist/validator/index.d.ts.map +1 -1
- package/dist/validator/index.js.map +1 -1
- package/dist/validator/tex-types.d.ts +2 -2
- package/dist/validator/tex-types.d.ts.map +1 -1
- package/dist/validator/tex.d.ts.map +1 -1
- package/dist/validator/tex.js +1 -0
- package/dist/validator/tex.js.map +1 -1
- package/package.json +1 -1
package/dist/config/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC/E,cAAc,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC/E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC/D,cAAc,aAAa,CAAA"}
|
package/dist/config/index.js
CHANGED
|
@@ -14,11 +14,16 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.defaultConfig = exports.loadConfig = exports.mergeConfig = exports.defineConfig = void 0;
|
|
17
|
+
exports.parseEnv = exports.resetEnv = exports.processEnv = exports.loadEnv = exports.defaultConfig = exports.loadConfig = exports.mergeConfig = exports.defineConfig = void 0;
|
|
18
18
|
var config_1 = require("./config");
|
|
19
19
|
Object.defineProperty(exports, "defineConfig", { enumerable: true, get: function () { return config_1.defineConfig; } });
|
|
20
20
|
Object.defineProperty(exports, "mergeConfig", { enumerable: true, get: function () { return config_1.mergeConfig; } });
|
|
21
21
|
Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_1.loadConfig; } });
|
|
22
22
|
Object.defineProperty(exports, "defaultConfig", { enumerable: true, get: function () { return config_1.defaultConfig; } });
|
|
23
|
+
var env_1 = require("./env");
|
|
24
|
+
Object.defineProperty(exports, "loadEnv", { enumerable: true, get: function () { return env_1.loadEnv; } });
|
|
25
|
+
Object.defineProperty(exports, "processEnv", { enumerable: true, get: function () { return env_1.processEnv; } });
|
|
26
|
+
Object.defineProperty(exports, "resetEnv", { enumerable: true, get: function () { return env_1.resetEnv; } });
|
|
27
|
+
Object.defineProperty(exports, "parseEnv", { enumerable: true, get: function () { return env_1.parseEnv; } });
|
|
23
28
|
__exportStar(require("./constants"), exports);
|
|
24
29
|
//# sourceMappingURL=index.js.map
|
package/dist/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,mCAA+E;AAAtE,sGAAA,YAAY,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,uGAAA,aAAa,OAAA;AAC7D,8CAA2B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,mCAA+E;AAAtE,sGAAA,YAAY,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,uGAAA,aAAa,OAAA;AAC7D,6BAA+D;AAAtD,8FAAA,OAAO,OAAA;AAAE,iGAAA,UAAU,OAAA;AAAE,+FAAA,QAAQ,OAAA;AAAE,+FAAA,QAAQ,OAAA;AAChD,8CAA2B"}
|
package/dist/config/types.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { ExisPlugin } from '../plugin/types';
|
|
2
2
|
import type { SslConfig } from '../types';
|
|
3
|
+
export type CorsOriginCallback = (err: Error | null, allow?: boolean) => void;
|
|
4
|
+
export type CorsOriginFn = (origin: string, callback?: CorsOriginCallback) => boolean | Promise<boolean> | void;
|
|
3
5
|
export interface CorsConfig {
|
|
4
|
-
origin?: boolean | string | RegExp | (string | RegExp)[] |
|
|
6
|
+
origin?: boolean | string | RegExp | (string | RegExp)[] | CorsOriginFn;
|
|
5
7
|
methods?: string[];
|
|
6
8
|
allowedHeaders?: string[];
|
|
7
9
|
exposedHeaders?: string[];
|
|
@@ -78,6 +80,7 @@ export interface ExisConfig {
|
|
|
78
80
|
};
|
|
79
81
|
debugRouting?: boolean;
|
|
80
82
|
asyncContext?: boolean;
|
|
83
|
+
transformResponse?: boolean | ((data: any, req: any, res: any) => any);
|
|
81
84
|
/**
|
|
82
85
|
* Defines the HTTP server backend.
|
|
83
86
|
* 'node' uses the native Node.js HTTP module.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAIzC,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -85,13 +85,14 @@ $ npx exisjs g <type> <name> [options]
|
|
|
85
85
|
|
|
86
86
|
| Option | Description |
|
|
87
87
|
| :--- | :--- |
|
|
88
|
+
| `-n, --named` | Names generated files using the feature prefix (e.g. `<name>.route.ts`, `<name>.schema.ts`, `<name>.service.ts`). |
|
|
88
89
|
| `--oop` | Generates using Class-Based (OOP) decorators instead of Functional syntax. |
|
|
89
90
|
|
|
90
91
|
**Supported Schematics**
|
|
91
92
|
|
|
92
93
|
| Schematic | Alias | Description | Output Path |
|
|
93
94
|
| :--- | :--- | :--- | :--- |
|
|
94
|
-
| `resource` | | Complete domain slice (`schema.ts`, `service.ts`, `
|
|
95
|
+
| `resource` | | Complete domain slice (`schema.ts`, `service.ts`, `route.ts` or feature-prefixed named files) | `src/http/<name>/` |
|
|
95
96
|
| `route` | `r`, `c`, `controller` | HTTP route file | `src/http/<name>/route.ts` |
|
|
96
97
|
| `service` | `s` | Injectable service / business logic | `src/http/<name>/service.ts` |
|
|
97
98
|
| `schema` | `sc` | Validation schemas powered by `tex` | `src/http/<name>/schema.ts` |
|
|
@@ -104,7 +105,7 @@ $ npx exisjs g <type> <name> [options]
|
|
|
104
105
|
|
|
105
106
|
### `exisjs routes`
|
|
106
107
|
|
|
107
|
-
Analyzes and prints the application routing table to the terminal.
|
|
108
|
+
Analyzes and prints the application routing table to the terminal in an interactive, formatted grid with method badges and dynamic parameter highlighting.
|
|
108
109
|
|
|
109
110
|
```bash
|
|
110
111
|
$ npx exisjs routes [options]
|
|
@@ -114,7 +115,17 @@ $ npx exisjs routes [options]
|
|
|
114
115
|
|
|
115
116
|
| Option | Description |
|
|
116
117
|
| :--- | :--- |
|
|
117
|
-
| `-e, --entry <file>` | Custom entry file path to bootstrap the app from. |
|
|
118
|
+
| `-e, --entry <file>` | Custom entry file path to bootstrap the app from (default: `src/http/server.ts`). |
|
|
119
|
+
| `-m, --method <method>` | Filter endpoints by HTTP method (e.g. `GET`, `POST`, `PUT`, `DELETE`). |
|
|
120
|
+
| `-f, --filter <keyword>` | Filter endpoints matching path, method, or source file keyword. |
|
|
121
|
+
| `--json` | Output the parsed routes and middleware metadata directly as structured JSON. |
|
|
122
|
+
|
|
123
|
+
**Features**
|
|
124
|
+
- **Method Badges**: Visually styled badges (`GET`, `POST`, `PUT`, `PATCH`, `DEL`, `ALL`).
|
|
125
|
+
- **Parameter Highlighting**: Dynamically distinguishes path parameters (`:id`, `*slug`).
|
|
126
|
+
- **Middleware Counting**: Displays total attached middleware / boundary steps.
|
|
127
|
+
- **Source Resolution**: Displays relative file source path (e.g. `src/http/users/user.route.ts`).
|
|
128
|
+
- **Summary Metrics**: Displays total endpoint counts and method breakdown.
|
|
118
129
|
|
|
119
130
|
---
|
|
120
131
|
|
|
@@ -155,6 +166,12 @@ $ npx exisjs repl [options]
|
|
|
155
166
|
$ npx exisjs console [options]
|
|
156
167
|
```
|
|
157
168
|
|
|
169
|
+
**Options**
|
|
170
|
+
|
|
171
|
+
| Option | Description |
|
|
172
|
+
| :--- | :--- |
|
|
173
|
+
| `-e, --entry <file>` | Custom entry file path to bootstrap the REPL context. |
|
|
174
|
+
|
|
158
175
|
---
|
|
159
176
|
|
|
160
177
|
### `exisjs exports`
|
|
@@ -174,3 +191,19 @@ Displays runtime environment, Node.js version, platform, architecture, and ExisJ
|
|
|
174
191
|
```bash
|
|
175
192
|
$ npx exisjs info
|
|
176
193
|
```
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
### `exisjs doctor`
|
|
198
|
+
|
|
199
|
+
Performs an end-to-end diagnostic audit of the local project environment, verifying Node.js version compatibility, native Rust hardware acceleration (`@exisjs/rs`), `tsconfig.json` strictness, entry-point resolution, route naming patterns, and file-system route counts.
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
$ npx exisjs doctor
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**Diagnostic Checks**
|
|
206
|
+
- **Runtime**: Validates Node.js engine compatibility (v18+ recommended for N-API and worker thread pools).
|
|
207
|
+
- **Native Engine**: Verifies `@exisjs/rs` compiled native binaries are active for hardware-accelerated radix tree traversal, off-heap caching, and native JSON serialization.
|
|
208
|
+
- **Project Configuration**: Checks `package.json` root and `tsconfig.json` strict mode.
|
|
209
|
+
- **Routes & Pipeline**: Confirms application entry point (`src/http/server.ts`), discovers active route slices, and flags non-standard or orphan file naming conventions.
|
|
@@ -79,4 +79,5 @@ $ npx exisjs g r users --oop
|
|
|
79
79
|
| `repl` | `console` | Starts an interactive Node.js REPL loaded with the application context. |
|
|
80
80
|
| `exports` | | Displays all available `@exisjs` and `exisjs/*` subpath exports. |
|
|
81
81
|
| `info` | | Displays system, Node.js, and ExisJS runtime information. |
|
|
82
|
+
| `doctor` | | Performs system, native Rust acceleration, TypeScript, and routing diagnostics. |
|
|
82
83
|
| `init` | | Initializes a new ExisJS application in the current directory. |
|
|
@@ -140,7 +140,14 @@ Here is a full breakdown of the configuration schema:
|
|
|
140
140
|
|
|
141
141
|
### Global Middleware
|
|
142
142
|
|
|
143
|
-
- `cors` _(object | boolean)_: Global CORS policy configuration
|
|
143
|
+
- `cors` _(object | boolean)_: Global CORS policy configuration. Supports:
|
|
144
|
+
- Exact string origins (e.g. `'https://example.com'` or `'*'`).
|
|
145
|
+
- Regular expressions (e.g. `/localhost:\d+/`).
|
|
146
|
+
- Arrays mixing strings and regexes (`['https://app.example.com', /https:\/\/.*\.domain\.com/']`).
|
|
147
|
+
- Dynamic callbacks: `(origin, cb) => ...` or async functions: `async (origin) => boolean` for multi-tenant setups.
|
|
148
|
+
- `transformResponse` _(boolean | function)_: Automatically wraps all successful handler responses into a standardized envelope:
|
|
149
|
+
- When `true`: `{ success: true, data: ..., timestamp: ... }` (matching `HttpError`'s `{ success: false, error: ... }`).
|
|
150
|
+
- When a function: `(data, req, res) => ({ ... })` to provide your own custom envelope.
|
|
144
151
|
- `helmet` _(object | boolean)_: Automatically secures your app with standard HTTP headers. (Enabled by default).
|
|
145
152
|
- `compression` _(object | boolean)_: Enables Gzip/Brotli compression for all HTTP responses.
|
|
146
153
|
- `logger` _(object | boolean)_: Configures the internal Pino-based logger (`level`, `pretty`).
|
|
@@ -247,8 +247,8 @@ You can use the `metrics` middleware to track request durations and counts.
|
|
|
247
247
|
|
|
248
248
|
### Functional Paradigm
|
|
249
249
|
|
|
250
|
-
```typescript filename="src/http/
|
|
251
|
-
import {
|
|
250
|
+
```typescript filename="src/http/boundary.ts"
|
|
251
|
+
import { defineBoundary } from 'exisjs/router'
|
|
252
252
|
import { metrics } from 'exisjs/observability'
|
|
253
253
|
|
|
254
254
|
const myPrometheusAdapter = {
|
|
@@ -261,15 +261,15 @@ const myPrometheusAdapter = {
|
|
|
261
261
|
}
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
-
export
|
|
264
|
+
export const config = defineBoundary({
|
|
265
265
|
middleware: [metrics(myPrometheusAdapter)]
|
|
266
266
|
})
|
|
267
267
|
```
|
|
268
268
|
|
|
269
269
|
### Class-Based (OOP) Paradigm
|
|
270
270
|
|
|
271
|
-
```typescript filename="src/http/
|
|
272
|
-
import {
|
|
271
|
+
```typescript filename="src/http/boundary.ts"
|
|
272
|
+
import { Boundary } from 'exisjs/decorators'
|
|
273
273
|
import { metrics } from 'exisjs/observability'
|
|
274
274
|
|
|
275
275
|
const myPrometheusAdapter = {
|
|
@@ -280,10 +280,10 @@ const myPrometheusAdapter = {
|
|
|
280
280
|
}
|
|
281
281
|
}
|
|
282
282
|
|
|
283
|
-
@
|
|
283
|
+
@Boundary({
|
|
284
284
|
middleware: [metrics(myPrometheusAdapter)]
|
|
285
285
|
})
|
|
286
|
-
export default class
|
|
286
|
+
export default class RootBoundary {}
|
|
287
287
|
```
|
|
288
288
|
|
|
289
289
|
*Note: ExisJS normalizes dynamic paths (e.g., turning `/users/123` into `/users/:id`) to prevent metrics cardinality issues.*
|
|
@@ -294,8 +294,8 @@ ExisJS seamlessly integrates with OpenTelemetry (OTel) via the `tracing` middlew
|
|
|
294
294
|
|
|
295
295
|
### Functional Paradigm
|
|
296
296
|
|
|
297
|
-
```typescript filename="src/http/
|
|
298
|
-
import {
|
|
297
|
+
```typescript filename="src/http/boundary.ts"
|
|
298
|
+
import { defineBoundary } from 'exisjs/router'
|
|
299
299
|
import { tracing } from 'exisjs/observability'
|
|
300
300
|
|
|
301
301
|
const myOtelAdapter = {
|
|
@@ -312,15 +312,15 @@ const myOtelAdapter = {
|
|
|
312
312
|
}
|
|
313
313
|
}
|
|
314
314
|
|
|
315
|
-
export
|
|
315
|
+
export const config = defineBoundary({
|
|
316
316
|
middleware: [tracing(myOtelAdapter)]
|
|
317
317
|
})
|
|
318
318
|
```
|
|
319
319
|
|
|
320
320
|
### Class-Based (OOP) Paradigm
|
|
321
321
|
|
|
322
|
-
```typescript filename="src/http/
|
|
323
|
-
import {
|
|
322
|
+
```typescript filename="src/http/boundary.ts"
|
|
323
|
+
import { Boundary } from 'exisjs/decorators'
|
|
324
324
|
import { tracing } from 'exisjs/observability'
|
|
325
325
|
|
|
326
326
|
const myOtelAdapter = {
|
|
@@ -335,10 +335,10 @@ const myOtelAdapter = {
|
|
|
335
335
|
}
|
|
336
336
|
}
|
|
337
337
|
|
|
338
|
-
@
|
|
338
|
+
@Boundary({
|
|
339
339
|
middleware: [tracing(myOtelAdapter)]
|
|
340
340
|
})
|
|
341
|
-
export default class
|
|
341
|
+
export default class RootBoundary {}
|
|
342
342
|
```
|
|
343
343
|
|
|
344
344
|
By providing these standard interfaces natively, your application metrics and traces are bound to the ExisJS router lifecycle.
|
|
@@ -269,3 +269,109 @@ ExisJS features native, automatic ETag generation.
|
|
|
269
269
|
If the client sends an `If-None-Match` header matching the ETag of the current response, ExisJS will immediately abort serialization and send a `304 Not Modified` header with an empty body, saving bandwidth and CPU cycles.
|
|
270
270
|
|
|
271
271
|
*Note: ETag generation is disabled by default, but can be enabled globally in your `exis()` config, or manually per-route via `res.etagEnabled = true`.*
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## 7. Server-Sent Events (SSE) & AI Streaming
|
|
276
|
+
|
|
277
|
+
ExisJS provides a first-class `res.sse()` method for real-time live events and AI chat completions (OpenAI, Anthropic, Ollama, LangChain).
|
|
278
|
+
|
|
279
|
+
When called, `res.sse()` automatically configures and flushes the required HTTP headers:
|
|
280
|
+
- `Content-Type: text/event-stream; charset=utf-8`
|
|
281
|
+
- `Cache-Control: no-cache, no-transform`
|
|
282
|
+
- `Connection: keep-alive`
|
|
283
|
+
- `X-Accel-Buffering: no` (disables NGINX proxy buffering)
|
|
284
|
+
|
|
285
|
+
You can import `SSEStream`, `formatSSEEvent`, `SSEMessage`, and `SSEOptions` from `exisjs/router`.
|
|
286
|
+
|
|
287
|
+
### Basic SSE Stream
|
|
288
|
+
|
|
289
|
+
#### Functional Paradigm
|
|
290
|
+
|
|
291
|
+
```typescript filename="src/http/events/route.ts"
|
|
292
|
+
import { controller, route } from 'exisjs/router'
|
|
293
|
+
|
|
294
|
+
export default controller({
|
|
295
|
+
liveEvents: route.get('/', {
|
|
296
|
+
handle(req, res) {
|
|
297
|
+
// Initialize the stream (heartbeat ping every 15s by default)
|
|
298
|
+
const sse = res.sse()
|
|
299
|
+
|
|
300
|
+
sse.send({ event: 'connected', data: { timestamp: Date.now() } })
|
|
301
|
+
|
|
302
|
+
const interval = setInterval(() => {
|
|
303
|
+
sse.send({ event: 'price-update', data: { symbol: 'BTC', price: 95000 } })
|
|
304
|
+
}, 1000)
|
|
305
|
+
|
|
306
|
+
// Automatically clean up intervals when the client disconnects or closes the tab
|
|
307
|
+
sse.onClose(() => {
|
|
308
|
+
clearInterval(interval)
|
|
309
|
+
})
|
|
310
|
+
}
|
|
311
|
+
})
|
|
312
|
+
})
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
#### Class-Based (OOP) Paradigm
|
|
316
|
+
|
|
317
|
+
```typescript filename="src/http/events/route.ts"
|
|
318
|
+
import { Controller, Get, Res } from 'exisjs/decorators'
|
|
319
|
+
import type { Response } from 'exisjs/router'
|
|
320
|
+
|
|
321
|
+
@Controller()
|
|
322
|
+
export default class EventsController {
|
|
323
|
+
@Get('/events')
|
|
324
|
+
streamEvents(@Res() res: Response) {
|
|
325
|
+
const sse = res.sse()
|
|
326
|
+
|
|
327
|
+
sse.send({ event: 'connected', data: { status: 'ok' } })
|
|
328
|
+
|
|
329
|
+
sse.onClose(() => {
|
|
330
|
+
console.log('Client disconnected from SSE stream')
|
|
331
|
+
})
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### AI / LLM Streaming with `sse.pipeFrom()`
|
|
337
|
+
|
|
338
|
+
You can directly stream chunks from any `AsyncIterable` (such as the OpenAI SDK or custom generators) using `sse.pipeFrom()`:
|
|
339
|
+
|
|
340
|
+
```typescript filename="src/http/ai/route.ts"
|
|
341
|
+
import { controller, route } from 'exisjs/router'
|
|
342
|
+
|
|
343
|
+
export default controller({
|
|
344
|
+
chat: route.post('/', {
|
|
345
|
+
handle(req, res) {
|
|
346
|
+
res.sse(async (sse) => {
|
|
347
|
+
// Stream directly from an async generator or AI SDK
|
|
348
|
+
async function* generateTokens() {
|
|
349
|
+
yield 'Hello'
|
|
350
|
+
yield ' from'
|
|
351
|
+
yield ' ExisJS'
|
|
352
|
+
yield ' AI streaming!'
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
await sse.pipeFrom(generateTokens(), (token) => ({
|
|
356
|
+
event: 'delta',
|
|
357
|
+
data: { text: token }
|
|
358
|
+
}))
|
|
359
|
+
|
|
360
|
+
sse.close()
|
|
361
|
+
})
|
|
362
|
+
}
|
|
363
|
+
})
|
|
364
|
+
})
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### SSE Options & Methods
|
|
368
|
+
|
|
369
|
+
- `res.sse(options?)`: Options include:
|
|
370
|
+
- `heartbeat`: Heartbeat interval in milliseconds (default: `15000`). Pass `false` to disable.
|
|
371
|
+
- `heartbeatComment`: Custom comment string for keep-alive pings (default: `": ping\n\n"`).
|
|
372
|
+
- `headers`: Additional custom HTTP headers.
|
|
373
|
+
- `sse.send(message)`: Sends an event. Accepts string, number, object (auto JSON-stringified), or `{ event, data, id, retry }`.
|
|
374
|
+
- `sse.comment(text)`: Sends a raw SSE comment line (e.g. `: ping\n\n`) without triggering client-side event listeners.
|
|
375
|
+
- `sse.onClose(callback)`: Registers a callback fired when the client disconnects.
|
|
376
|
+
- `sse.close()`: Gracefully terminates the stream and closes the HTTP response.
|
|
377
|
+
|
|
@@ -15,11 +15,11 @@ ExisJS natively supports both a **Functional Paradigm** and a **Class-Based OOP
|
|
|
15
15
|
|
|
16
16
|
ExisJS uses **folder-based file-system routing** instead of programmatic route declaration in a single entry file.
|
|
17
17
|
|
|
18
|
-
For a folder to become an accessible API endpoint, it must contain a `route.ts` file that exports a route definition.
|
|
18
|
+
For a folder to become an accessible API endpoint, it must contain a `route.ts` or `<feature>.route.ts` (e.g. `user.route.ts`) file that exports a route definition.
|
|
19
19
|
|
|
20
20
|
In addition to `route.ts`, the ExisJS router utilizes two other special gatekeeper files:
|
|
21
21
|
- **`server.ts`**: Placed at the root of your `http` directory, it is the entry point that boots your application, registers global plugins, and connects to databases.
|
|
22
|
-
- **`
|
|
22
|
+
- **`boundary.ts`** (or `*.boundary.ts`): Can be placed in any folder. It acts as a gatekeeper and request pipeline, automatically configuring middleware, CORS, headers, and dependencies for *all* routes within its directory and subdirectories.
|
|
23
23
|
|
|
24
24
|
### Routing Conventions
|
|
25
25
|
|
|
@@ -38,9 +38,9 @@ The `server.ts` file acts as the root configuration for your application. It pro
|
|
|
38
38
|
import { exis } from 'exisjs'
|
|
39
39
|
|
|
40
40
|
export default exis({
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
providers: [
|
|
42
|
+
['LoggerService', { useValue: console }]
|
|
43
|
+
]
|
|
44
44
|
})
|
|
45
45
|
```
|
|
46
46
|
|
|
@@ -59,27 +59,27 @@ export default class RootServer {
|
|
|
59
59
|
}
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
-
### Folder
|
|
62
|
+
### Folder Boundaries (`boundary.ts`)
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
Boundaries apply configurations, security policies, and request pipelines to all routes in their directory and subdirectories.
|
|
65
65
|
|
|
66
66
|
#### Functional Paradigm
|
|
67
|
-
```typescript filename="src/http/admin/
|
|
68
|
-
import {
|
|
67
|
+
```typescript filename="src/http/admin/boundary.ts"
|
|
68
|
+
import { defineBoundary } from 'exisjs/router'
|
|
69
69
|
|
|
70
|
-
export
|
|
70
|
+
export const config = defineBoundary({
|
|
71
71
|
headers: { 'X-Admin-Area': 'true' }
|
|
72
72
|
})
|
|
73
73
|
```
|
|
74
74
|
|
|
75
75
|
#### Class-Based (OOP) Paradigm
|
|
76
|
-
```typescript filename="src/http/admin/
|
|
77
|
-
import {
|
|
76
|
+
```typescript filename="src/http/admin/boundary.ts"
|
|
77
|
+
import { Boundary } from 'exisjs/decorators'
|
|
78
78
|
|
|
79
|
-
@
|
|
79
|
+
@Boundary({
|
|
80
80
|
headers: { 'X-Admin-Area': 'true' }
|
|
81
81
|
})
|
|
82
|
-
export default class
|
|
82
|
+
export default class AdminBoundary {}
|
|
83
83
|
```
|
|
84
84
|
|
|
85
85
|
### Route Definitions (`route.ts`)
|
|
@@ -264,13 +264,18 @@ export default controller({
|
|
|
264
264
|
}),
|
|
265
265
|
getSingle: route.get('/:id', {
|
|
266
266
|
handle({ params }) {
|
|
267
|
+
// params.id is automatically inferred as string with full autocomplete!
|
|
267
268
|
const { id } = params
|
|
268
|
-
return { message:
|
|
269
|
+
return { message: `Fetching user ${id}` }
|
|
269
270
|
}
|
|
270
271
|
})
|
|
271
272
|
})
|
|
272
273
|
```
|
|
273
274
|
|
|
275
|
+
<Info title="Automatic Route Parameter Type Inference">
|
|
276
|
+
In ExisJS v0.7+, paths with named parameters like `route.get('/users/:userId/posts/:postId', ...)` automatically parse the path string literal to infer `params: { userId: string; postId: string }` on the `handle` context. No manual casting or boilerplate interfaces required.
|
|
277
|
+
</Info>
|
|
278
|
+
|
|
274
279
|
|
|
275
280
|
#### Class-Based (OOP) Paradigm
|
|
276
281
|
|
|
@@ -16,18 +16,23 @@ The following security middlewares are available from `exisjs/middleware` and ca
|
|
|
16
16
|
- `helmet(options?)`: Sets 14+ secure HTTP headers (Strict-Transport-Security, X-Content-Type-Options: nosniff, X-Frame-Options: DENY, and CSP).
|
|
17
17
|
- `csrf(options)`: Enforces the Signed Double Submit Cookie pattern to protect state-changing requests (POST, PUT, DELETE) from CSRF attacks.
|
|
18
18
|
- `hpp()`: Protects against HTTP Parameter Pollution attacks by ensuring array query parameters/form fields are safely handled.
|
|
19
|
+
- `mongoSanitize()`: Strips MongoDB operator keys (keys starting with `$` or containing `.`) from `req.body`, `req.query`, and `req.params`.
|
|
19
20
|
- `dbSanitize(options?)`: Protects against NoSQL query operator injection (`$where` and other malicious keys) before reaching database layers.
|
|
20
21
|
- `timeout(ms)`: Automatically terminates requests that exceed the specified timeout limit, returning a 503 response.
|
|
21
22
|
|
|
23
|
+
> [!TIP]
|
|
24
|
+
> Security middlewares like `hpp()`, `mongoSanitize()`, and `dbSanitize()` automatically synchronize with the request body parser. If registered globally before route handlers, they safely await the body and sanitize it deterministically without runtime crashes.
|
|
25
|
+
|
|
22
26
|
```typescript filename="src/http/server.ts"
|
|
23
27
|
import { exis } from 'exisjs'
|
|
24
|
-
import { helmet, csrf, timeout, hpp } from 'exisjs/middleware'
|
|
28
|
+
import { helmet, csrf, timeout, hpp, mongoSanitize } from 'exisjs/middleware'
|
|
25
29
|
|
|
26
30
|
export default exis({
|
|
27
31
|
async onStart(app) {
|
|
28
32
|
app.use(helmet())
|
|
29
33
|
app.use(timeout(10000))
|
|
30
34
|
app.use(hpp())
|
|
35
|
+
app.use(mongoSanitize())
|
|
31
36
|
}
|
|
32
37
|
})
|
|
33
38
|
```
|
|
@@ -60,12 +60,18 @@ my-backend/
|
|
|
60
60
|
A file's name declares its role. Functional vs. class-based (OOP) only changes
|
|
61
61
|
_syntax_, never _responsibility_.
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
63
|
+
ExisJS supports two naming conventions seamlessly:
|
|
64
|
+
1. **Standard Flat Names** (default): `route.ts`, `schema.ts`, `service.ts`, `boundary.ts`.
|
|
65
|
+
2. **Feature-Prefixed Named Files**: `<name>.route.ts`, `<name>.schema.ts`, `<name>.service.ts`, `<name>.boundary.ts` (e.g., `user.route.ts`, `user.schema.ts`, `user.service.ts`).
|
|
66
|
+
|
|
67
|
+
Both styles are automatically detected by the route scanner, CLI manifest generator, and development watcher with 100% parity.
|
|
68
|
+
|
|
69
|
+
| File Pattern | Role | Never contains |
|
|
70
|
+
| :--- | :--- | :--- |
|
|
71
|
+
| `route.ts` / `*.route.ts` | Binds a URL + method to a handler. | Business logic, validation logic |
|
|
72
|
+
| `schema.ts` / `*.schema.ts` | `tex` validation schemas, imported by route files. Mandatory for every route accepting input. | Handlers, routing |
|
|
73
|
+
| `service.ts` / `*.service.ts` | Business logic and data access. DI-injectable. | Routing, response shaping |
|
|
74
|
+
| `boundary.ts` / `*.boundary.ts` | Folder-scoped config + request pipeline for everything in this folder and below. | — |
|
|
69
75
|
|
|
70
76
|
---
|
|
71
77
|
|
package/dist/lib/start-server.js
CHANGED
|
@@ -61,6 +61,14 @@ async function start() {
|
|
|
61
61
|
// 1. Load .env files so process.env is populated
|
|
62
62
|
const { loadEnv } = await Promise.resolve().then(() => __importStar(require('../config/env.js')));
|
|
63
63
|
loadEnv(cwd);
|
|
64
|
+
// Register path aliases loader
|
|
65
|
+
try {
|
|
66
|
+
const { registerPathAliasLoader } = await Promise.resolve().then(() => __importStar(require('../cli/resolve-aliases.js')));
|
|
67
|
+
registerPathAliasLoader(cwd);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// ignore
|
|
71
|
+
}
|
|
64
72
|
// 2. Auto-load Environment variables validation file if it exists
|
|
65
73
|
const envFiles = [
|
|
66
74
|
path.join(cwd, 'src', 'config', 'env.ts'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-server.js","sourceRoot":"","sources":["../../src/lib/start-server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sDAAwB;AACxB,uCAAwC;AACxC,qDAAmD;AAEnD,KAAK,UAAU,KAAK;IAClB,2EAA2E;IAC3E,WAAW,CAAC,GAAG,EAAE;QACf,MAAM,KAAK,GAAG,iBAAE,CAAC,iBAAiB,EAAE,CAAA;QACpC,IAAI,KAAK,CAAC,cAAc,GAAG,GAAG,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;YACvD,OAAO,CAAC,KAAK,CACX,6EAA6E,CAC9E,CAAA;YACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,+BAA+B;QACnD,CAAC;IACH,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAA,CAAC,6BAA6B;IAE/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAA;IAE7C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAA;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,wDAAa,SAAS,GAAC,CAAA;QAClC,MAAM,IAAI,GAAG,wDAAa,WAAW,GAAC,CAAA;QACtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;QAEzB,MAAM,aAAa,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC,CAAA;QAE3E,iDAAiD;QACjD,MAAM,EAAE,OAAO,EAAE,GAAG,wDAAa,kBAAkB,GAAC,CAAA;QACpD,OAAO,CAAC,GAAG,CAAC,CAAA;QAEZ,kEAAkE;QAClE,MAAM,QAAQ,GAAG;YACf,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC;SAC1C,CAAA;QAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,aAAa,CAAC,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAA;gBAChD,MAAK,CAAC,gCAAgC;YACxC,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,IAAA,wBAAa,EAAC,SAAS,CAAC,CAAC,IAAI,CAAA;QACzC,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAA;QAEpC,0EAA0E;QAC1E,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,CAAA;QAChC,IAAI,QAAQ,GAA0C,IAAI,CAAA;QAC1D,MAAM,EAAE,oBAAoB,EAAE,GAAG,wDAAa,kBAAkB,GAAC,CAAA;QAEjE,IAAI,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,CAAC;YACpC,oDAAoD;YACpD,MAAM,QAAQ,GAAG,CAAC,wDAAa,kBAAkB,GAAC,CAAC,CAAC,GAAG,CAAA;YACvD,QAAQ,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACpC,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,QAAQ,CAAC,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAA;YAC5C,CAAC;YACD,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,QAAQ,CAAC,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAA;YAC5C,CAAC;YACD,GAAG,GAAG,QAAQ,CAAA;YACd,oBAAoB,CAAC,QAAQ,CAAC,CAAA;QAChC,CAAC;QACD,+CAA+C;aAC1C,IACH,GAAG;YACH,OAAO,GAAG,KAAK,UAAU;YACzB,GAAG,CAAC,SAAS;YACb,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,EACjD,CAAC;YACD,MAAM,YAAY,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAA;YACtE,MAAM,QAAQ,GAAG,CAAC,wDAAa,kBAAkB,GAAC,CAAC,CAAC,GAAG,CAAA;YACvD,QAAQ,GAAG,IAAI,QAAQ,CAAC;gBACtB,OAAO,EAAE,YAAY,CAAC,OAAO;aAC9B,CAAC,CAAA;YAEF,MAAM,cAAc,GAAG,IAAI,GAAG,EAAE,CAAA;YAChC,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;gBAC3B,KAAK,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;oBACvC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC9B,CAAC;YACH,CAAC;YAED,QAAQ,CAAC,WAAW,GAAG,KAAK,IAAI,EAAE;gBAChC,IAAI,OAAO,cAAc,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;oBACjD,MAAM,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;gBACxC,CAAC;YACH,CAAC,CAAA;YAED,QAAQ,CAAC,WAAW,GAAG,KAAK,IAAI,EAAE;gBAChC,IAAI,OAAO,cAAc,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;oBACjD,MAAM,cAAc,CAAC,OAAO,CAAC,QAAS,CAAC,CAAA;gBACzC,CAAC;YACH,CAAC,CAAA;YAED,GAAG,GAAG,QAAQ,CAAA;YACd,oBAAoB,CAAC,QAAQ,CAAC,CAAA;QAChC,CAAC;QAED,IACE,GAAG;YACH,OAAO,GAAG,CAAC,MAAM,KAAK,UAAU;YAChC,OAAO,GAAG,CAAC,MAAM,KAAK,UAAU,EAChC,CAAC;YACD,MAAM,GAAG,CAAC,MAAM,EAAE,CAAA;YAElB,6EAA6E;YAC7E,IACE,GAAG;gBACH,GAAG,CAAC,OAAO;gBACX,GAAG,CAAC,OAAO,CAAC,SAAS;gBACrB,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAC7B,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,wDAAa,mBAAmB,GAAC,CAAA;oBACnD,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;gBAChD,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;wBACxC,OAAO,CAAC,IAAI,CACV,mJAAmJ,CACpJ,CAAA;oBACH,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAAA;oBAChE,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;gBAC1C,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;YAC5B,CAAC;YACD,MAAM,GAAG,CAAC,MAAM,EAAE,CAAA;YAElB,4EAA4E;YAC5E,qEAAqE;YACrE,qEAAqE;YACrE,+CAA+C;YAC/C,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;gBACxC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;gBACrE,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CACX,YAAY,MAAM,wCAAwC,CAC3D,CAAA;gBACH,CAAC;gBACD,IAAI,CAAC;oBACH,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;wBACpC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAA;oBACnB,CAAC;oBACD,IAAI,CAAC,KAAK;wBAAE,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAA;oBAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,KAAK;wBAAE,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAA;oBAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,CAAC;YACH,CAAC,CAAA;YAED,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAA;YAClD,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;YAEhD,4EAA4E;YAC5E,mGAAmG;YACnG,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;gBAClC,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;oBAC1C,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,MAAM,CAAC,CAAA;gBAClE,CAAC,CAAC,CAAA;gBACF,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;oBACxC,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAA;gBACpE,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,0DAA0D;AAC1D,+EAA+E;AAC/E,sEAAsE;AACtE,KAAK,UAAU,SAAS;IACtB,IAAI,OAAO,GAA4B,CAAC,CAAA;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,wDAAa,kBAAkB,GAAC,CAAA;QACpD,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QAEtB,MAAM,EAAE,UAAU,EAAE,GAAG,wDAAa,qBAAqB,GAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QAC9C,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC7C,OAAO;gBACL,MAAM,CAAC,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAA;QACtE,CAAC;aAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1B,qCAAqC;YACrC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QAC1B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,0DAA0D;IAC5D,CAAC;IAED,IAAA,yBAAY,EACV,GAAG,EAAE;QACH,KAAK,EAAE,CAAA;IACT,CAAC,EACD,EAAE,OAAO,EAAE,CACZ,CAAA;AACH,CAAC;AAED,SAAS,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"start-server.js","sourceRoot":"","sources":["../../src/lib/start-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../src/middleware/compression.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,UAAU,CAAA;AAE1D;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../src/middleware/compression.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,UAAU,CAAA;AAE1D;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAgGrC"}
|
|
@@ -59,21 +59,36 @@ function compression() {
|
|
|
59
59
|
res.raw.setHeader('Vary', 'Accept-Encoding');
|
|
60
60
|
// Remove Content-Length since compressed size will differ
|
|
61
61
|
res.raw.removeHeader('Content-Length');
|
|
62
|
-
// Compress
|
|
62
|
+
// Compress using hardware-accelerated Rust engine (@exisjs/rs) if available, with graceful zlib fallback
|
|
63
63
|
let compressed;
|
|
64
64
|
try {
|
|
65
65
|
if (selectedEncoding === 'br') {
|
|
66
|
-
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
67
|
+
const rs = require('@exisjs/rs');
|
|
68
|
+
compressed =
|
|
69
|
+
typeof rs.brotliCompress === 'function'
|
|
70
|
+
? rs.brotliCompress(buf)
|
|
71
|
+
: node_zlib_1.default.brotliCompressSync(buf);
|
|
67
72
|
}
|
|
68
73
|
else if (selectedEncoding === 'gzip') {
|
|
69
|
-
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
75
|
+
const rs = require('@exisjs/rs');
|
|
76
|
+
compressed =
|
|
77
|
+
typeof rs.gzipCompress === 'function'
|
|
78
|
+
? rs.gzipCompress(buf)
|
|
79
|
+
: node_zlib_1.default.gzipSync(buf);
|
|
70
80
|
}
|
|
71
81
|
else {
|
|
72
|
-
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
83
|
+
const rs = require('@exisjs/rs');
|
|
84
|
+
compressed =
|
|
85
|
+
typeof rs.deflateCompress === 'function'
|
|
86
|
+
? rs.deflateCompress(buf)
|
|
87
|
+
: node_zlib_1.default.deflateSync(buf);
|
|
73
88
|
}
|
|
74
89
|
}
|
|
75
90
|
catch {
|
|
76
|
-
// If compression fails, send uncompressed
|
|
91
|
+
// If native or zlib compression fails, send uncompressed
|
|
77
92
|
originalEnd(data);
|
|
78
93
|
return;
|
|
79
94
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/middleware/compression.ts"],"names":[],"mappings":";;;;;AAeA,
|
|
1
|
+
{"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/middleware/compression.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,9 @@ export * from './guard';
|
|
|
18
18
|
export * from './pipe';
|
|
19
19
|
export declare function serveStatic(root: string, options?: {
|
|
20
20
|
maxAge?: number;
|
|
21
|
+
etag?: boolean;
|
|
22
|
+
brotli?: boolean;
|
|
23
|
+
gzip?: boolean;
|
|
21
24
|
}): Handler;
|
|
22
25
|
export interface ValidateSchema {
|
|
23
26
|
body?: TexEngine<any>;
|