@furystack/rest-service 14.1.2 → 14.1.4
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/CHANGELOG.md +42 -0
- package/README.md +26 -6
- package/esm/add-cors-header.d.ts.map +1 -1
- package/esm/add-cors-header.js +11 -0
- package/esm/add-cors-header.js.map +1 -1
- package/esm/add-cors-header.spec.js +25 -4
- package/esm/add-cors-header.spec.js.map +1 -1
- package/esm/endpoint-generators/create-patch-endpoint.d.ts.map +1 -1
- package/esm/endpoint-generators/create-patch-endpoint.js +2 -3
- package/esm/endpoint-generators/create-patch-endpoint.js.map +1 -1
- package/esm/endpoint-generators/create-post-endpoint.d.ts.map +1 -1
- package/esm/endpoint-generators/create-post-endpoint.js +2 -3
- package/esm/endpoint-generators/create-post-endpoint.js.map +1 -1
- package/esm/helpers.d.ts +18 -4
- package/esm/helpers.d.ts.map +1 -1
- package/esm/helpers.js +12 -6
- package/esm/helpers.js.map +1 -1
- package/esm/http-authentication-settings.d.ts +14 -0
- package/esm/http-authentication-settings.d.ts.map +1 -1
- package/esm/http-authentication-settings.js +2 -0
- package/esm/http-authentication-settings.js.map +1 -1
- package/esm/http-server-pool.d.ts +6 -0
- package/esm/http-server-pool.d.ts.map +1 -1
- package/esm/http-server-pool.js +19 -1
- package/esm/http-server-pool.js.map +1 -1
- package/esm/http-server-pool.spec.js +25 -0
- package/esm/http-server-pool.spec.js.map +1 -1
- package/esm/http-user-context.d.ts.map +1 -1
- package/esm/http-user-context.js +14 -2
- package/esm/http-user-context.js.map +1 -1
- package/esm/http-user-context.spec.js +40 -1
- package/esm/http-user-context.spec.js.map +1 -1
- package/esm/read-post-body.d.ts +14 -3
- package/esm/read-post-body.d.ts.map +1 -1
- package/esm/read-post-body.js +40 -15
- package/esm/read-post-body.js.map +1 -1
- package/esm/read-post-body.spec.d.ts +2 -0
- package/esm/read-post-body.spec.d.ts.map +1 -0
- package/esm/read-post-body.spec.js +80 -0
- package/esm/read-post-body.spec.js.map +1 -0
- package/esm/rest-api-runtime.d.ts +4 -0
- package/esm/rest-api-runtime.d.ts.map +1 -1
- package/esm/rest-api-runtime.js +55 -15
- package/esm/rest-api-runtime.js.map +1 -1
- package/esm/rest-service.integration.spec.js +74 -0
- package/esm/rest-service.integration.spec.js.map +1 -1
- package/esm/static-server-manager.spec.js +33 -0
- package/esm/static-server-manager.spec.js.map +1 -1
- package/esm/static-site-runtime.d.ts.map +1 -1
- package/esm/static-site-runtime.js +39 -6
- package/esm/static-site-runtime.js.map +1 -1
- package/esm/static-site-runtime.spec.js +36 -0
- package/esm/static-site-runtime.spec.js.map +1 -1
- package/package.json +15 -15
- package/src/add-cors-header.spec.ts +31 -4
- package/src/add-cors-header.ts +11 -0
- package/src/endpoint-generators/create-patch-endpoint.ts +3 -4
- package/src/endpoint-generators/create-post-endpoint.ts +2 -3
- package/src/helpers.ts +26 -5
- package/src/http-authentication-settings.ts +16 -0
- package/src/http-server-pool.spec.ts +27 -0
- package/src/http-server-pool.ts +20 -1
- package/src/http-user-context.spec.ts +55 -1
- package/src/http-user-context.ts +15 -2
- package/src/read-post-body.spec.ts +94 -0
- package/src/read-post-body.ts +52 -15
- package/src/rest-api-runtime.ts +60 -13
- package/src/rest-service.integration.spec.ts +76 -0
- package/src/static-server-manager.spec.ts +39 -0
- package/src/static-site-runtime.spec.ts +37 -0
- package/src/static-site-runtime.ts +41 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [14.1.4] - 2026-11-14
|
|
4
|
+
|
|
5
|
+
### 🐛 Bug Fixes
|
|
6
|
+
|
|
7
|
+
- Prevent path traversal in static file serving by rejecting resolved paths outside the configured root directory
|
|
8
|
+
- Set `SameSite`, optional `Secure`, and `Max-Age` attributes on session cookies and apply the same attributes when clearing them
|
|
9
|
+
- `addCorsHeaders` now adds/merges `Vary: Origin` when returning origin-specific CORS headers to avoid incorrect cache reuse
|
|
10
|
+
- Set `SameSite`, optional `Secure`, and `Max-Age` attributes on session cookies and apply the same attributes when clearing them.
|
|
11
|
+
- Enforce `Secure` when `SameSite=None` to prevent browsers rejecting cross-site session cookies.
|
|
12
|
+
- Enforced a configurable maximum request body size (default 1 MiB) when reading POST bodies, returning `413 Payload Too Large` for oversized requests
|
|
13
|
+
- Added `maxBodyBytes` option to `useRestService` for per-API configuration
|
|
14
|
+
- Switched request body reading to buffered chunks with single decode to avoid unbounded string growth
|
|
15
|
+
- Added configurable HTTP server timeouts (`requestTimeout`, `headersTimeout`, `keepAliveTimeout`) to limit slow client connections on the shared listener
|
|
16
|
+
- Added `actionTimeoutMs` to request handling to return `504 Request Timeout` for stuck actions and prevent late writes/unhandled errors after timeout
|
|
17
|
+
- Exposed the new timeout options through `useRestService`
|
|
18
|
+
- Fixed sendFile in static file serving to resolve/reject from the response stream lifecycle and clean up the read stream on disconnect or error, preventing requests from hanging when clients abort downloads.
|
|
19
|
+
|
|
20
|
+
### ⬆️ Dependencies
|
|
21
|
+
|
|
22
|
+
- Patch release to include updated `@furystack/security` dependency.
|
|
23
|
+
- Updated dependencies
|
|
24
|
+
|
|
25
|
+
### Documentation
|
|
26
|
+
|
|
27
|
+
- Clarified `useRestService` usage and authentication setup prerequisites in the README and linked to the public REST and validation guides
|
|
28
|
+
- Improved JSDoc for `useHttpAuthentication` to document required store/dataset bindings and setup expectations
|
|
29
|
+
- Added guidance for end-to-end app bootstrap and cross-linked the in-repo [full-stack monorepo guide](../../docs/getting-started/fullstack-monorepo.md) (auth prerequisites/order, validation, and integration notes)
|
|
30
|
+
|
|
31
|
+
### ?? Bug Fixes
|
|
32
|
+
|
|
33
|
+
- Prevent path traversal in static file serving by rejecting resolved paths outside the configured root directory
|
|
34
|
+
|
|
35
|
+
### ?? Dependencies
|
|
36
|
+
|
|
37
|
+
- Updated dependencies
|
|
38
|
+
|
|
39
|
+
## [14.1.3] - 2026-09-18
|
|
40
|
+
|
|
41
|
+
### ⬆️ Dependencies
|
|
42
|
+
|
|
43
|
+
- Updated dependencies
|
|
44
|
+
|
|
3
45
|
## [14.1.2] - 2026-08-26
|
|
4
46
|
|
|
5
47
|
### ⬆️ Dependencies
|
package/README.md
CHANGED
|
@@ -12,7 +12,9 @@ yarn add @furystack/rest-service
|
|
|
12
12
|
|
|
13
13
|
## Usage
|
|
14
14
|
|
|
15
|
-
Start by importing your custom API endpoint interface (see `@furystack/rest`) and
|
|
15
|
+
Start by importing your custom API endpoint interface (see `@furystack/rest`) and call `useRestService<MyApi>(...)` with your injector and API implementation. You can define multiple REST services per injector (even on the same port).
|
|
16
|
+
|
|
17
|
+
For a guided walkthrough, see the [REST getting-started guide](https://furystack.github.io/getting-started/rest/) and [Build from scratch](https://furystack.github.io/getting-started/from-scratch/). For an in-repo, versioned recipe covering `common` + `backend` + `frontend` wiring, auth bootstrap order, seeding, validation, and dev/prod integration, see [Full-stack monorepo app](../../docs/getting-started/fullstack-monorepo.md). For runtime payload validation, see [Data Validation](https://furystack.github.io/getting-started/data-validation/).
|
|
16
18
|
|
|
17
19
|
### Implementing a Custom API
|
|
18
20
|
|
|
@@ -36,6 +38,7 @@ await useRestService<MyApi>({
|
|
|
36
38
|
injector: myInjector,
|
|
37
39
|
port: 8080, // The port to listen on
|
|
38
40
|
root: '/api', // Routes will be joined on this root path
|
|
41
|
+
maxBodyBytes: 1024 * 1024, // Optional body size limit in bytes (default: 1 MiB)
|
|
39
42
|
cors: {
|
|
40
43
|
// Enable CORS
|
|
41
44
|
credentials: true, // Enable cookies for CORS
|
|
@@ -60,6 +63,8 @@ Endpoint generators now take a `DataSetToken` directly. Define the token
|
|
|
60
63
|
once with `defineDataSet` in a shared module and import it in both the
|
|
61
64
|
server and any generators that need it.
|
|
62
65
|
|
|
66
|
+
Request bodies are limited to 1 MiB by default to prevent unbounded memory use. Configure `maxBodyBytes` in `useRestService` (per API) to change the limit. Requests exceeding the limit are rejected with `413 Payload Too Large`.
|
|
67
|
+
|
|
63
68
|
### Endpoint Generators (Based on DataSets)
|
|
64
69
|
|
|
65
70
|
If you use the underlying layers of FuryStack (`defineStore` → `defineDataSet`) for an entity type, you can easily create some CRUD endpoints for them. These include:
|
|
@@ -211,7 +216,13 @@ In that way, you will get full validation for _all_ defined endpoint data (heade
|
|
|
211
216
|
|
|
212
217
|
### Authentication and HttpUserContext
|
|
213
218
|
|
|
214
|
-
You can use the built-in authentication that comes with this package. It contains a session (~cookie) based authentication and Basic Auth.
|
|
219
|
+
You can use the built-in authentication that comes with this package. It contains a session (~cookie) based authentication and Basic Auth. Use the `useHttpAuthentication()` helper after wiring the required dependencies.
|
|
220
|
+
|
|
221
|
+
**Prerequisites (important):**
|
|
222
|
+
|
|
223
|
+
- Bind `UserStore` and `SessionStore` to persistent store implementations (they throw by default).
|
|
224
|
+
- Provide a `userDataSet` token (`DataSetToken` / `ApplicationUserDataSet`) that backs user lookups.
|
|
225
|
+
- Ensure the backing stores/datasets are registered on the injector before calling `useHttpAuthentication()`.
|
|
215
226
|
|
|
216
227
|
```ts
|
|
217
228
|
import { createInjector } from '@furystack/inject'
|
|
@@ -235,10 +246,19 @@ await useRestService<MyApi>({ injector: myInjector, ...apiOptions })
|
|
|
235
246
|
```
|
|
236
247
|
|
|
237
248
|
`useHttpAuthentication` binds the `HttpAuthenticationSettings` and
|
|
238
|
-
`HttpUserContext` tokens. Your app
|
|
239
|
-
`UserStore` / `SessionStore` tokens
|
|
240
|
-
|
|
241
|
-
|
|
249
|
+
`HttpUserContext` tokens. Your app remains responsible for binding the
|
|
250
|
+
`UserStore` / `SessionStore` tokens to concrete persistent implementations and
|
|
251
|
+
for passing the `DataSetToken` that backs user lookups. For JWT-based auth, see
|
|
252
|
+
[`@furystack/auth-jwt`](../auth-jwt/README.md). For an end-to-end example, see
|
|
253
|
+
the [REST guide](https://furystack.github.io/getting-started/rest/).
|
|
254
|
+
|
|
255
|
+
Session cookie options (set via `HttpAuthenticationSettings` / `useHttpAuthentication`):
|
|
256
|
+
|
|
257
|
+
- `cookieSameSite` (`'Lax' | 'Strict' | 'None'`, default `'Lax'`)
|
|
258
|
+
- `cookieSecure` (`boolean`, default `false`, set `true` for HTTPS-only cookies; plain HTTP remains supported by default)
|
|
259
|
+
- `cookieMaxAgeSeconds` (`number`, optional) adds `Max-Age` to align the cookie with your session lifetime
|
|
260
|
+
|
|
261
|
+
`SameSite=None` requires `Secure` in modern browsers; the cookie builder enforces this by adding `Secure` automatically when `cookieSameSite` is `'None'`.
|
|
242
262
|
|
|
243
263
|
### Static File Serving
|
|
244
264
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-cors-header.d.ts","sourceRoot":"","sources":["../src/add-cors-header.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,cAAc,YAChB,WAAW,mBACH,eAAe,kBAChB,cAAc,
|
|
1
|
+
{"version":3,"file":"add-cors-header.d.ts","sourceRoot":"","sources":["../src/add-cors-header.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,cAAc,YAChB,WAAW,mBACH,eAAe,kBAChB,cAAc,SA6B/B,CAAA"}
|
package/esm/add-cors-header.js
CHANGED
|
@@ -9,6 +9,17 @@ export const addCorsHeaders = (options, incomingMessage, serverResponse) => {
|
|
|
9
9
|
incomingMessage.headers.origin !== incomingMessage.headers.host &&
|
|
10
10
|
options.origins.some((origin) => origin === incomingMessage.headers.origin)) {
|
|
11
11
|
serverResponse.setHeader('Access-Control-Allow-Origin', incomingMessage.headers.origin);
|
|
12
|
+
const existingVary = serverResponse.getHeader('Vary');
|
|
13
|
+
const varyValues = Array.isArray(existingVary)
|
|
14
|
+
? existingVary.flatMap((value) => `${value}`.split(','))
|
|
15
|
+
: `${existingVary ?? ''}`.split(',');
|
|
16
|
+
const normalizedVary = varyValues.map((value) => value.trim()).filter(Boolean);
|
|
17
|
+
if (!normalizedVary.some((value) => value.toLowerCase() === 'origin')) {
|
|
18
|
+
normalizedVary.push('Origin');
|
|
19
|
+
}
|
|
20
|
+
if (normalizedVary.length) {
|
|
21
|
+
serverResponse.setHeader('Vary', normalizedVary.join(', '));
|
|
22
|
+
}
|
|
12
23
|
if (options.credentials) {
|
|
13
24
|
serverResponse.setHeader('Access-Control-Allow-Credentials', 'true');
|
|
14
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-cors-header.js","sourceRoot":"","sources":["../src/add-cors-header.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,OAAoB,EACpB,eAAgC,EAChC,cAA8B,EAC9B,EAAE;IACF,IACE,eAAe,CAAC,OAAO;QACvB,eAAe,CAAC,OAAO,CAAC,MAAM,KAAK,eAAe,CAAC,OAAO,CAAC,IAAI;QAC/D,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAC3E,CAAC;QACD,cAAc,CAAC,SAAS,CAAC,6BAA6B,EAAE,eAAe,CAAC,OAAO,CAAC,MAAgB,CAAC,CAAA;QACjG,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,cAAc,CAAC,SAAS,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAA;QACtE,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC9C,cAAc,CAAC,SAAS,CAAC,8BAA8B,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACtF,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC9C,cAAc,CAAC,SAAS,CAAC,8BAA8B,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACtF,CAAC;IACH,CAAC;AACH,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"add-cors-header.js","sourceRoot":"","sources":["../src/add-cors-header.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,OAAoB,EACpB,eAAgC,EAChC,cAA8B,EAC9B,EAAE;IACF,IACE,eAAe,CAAC,OAAO;QACvB,eAAe,CAAC,OAAO,CAAC,MAAM,KAAK,eAAe,CAAC,OAAO,CAAC,IAAI;QAC/D,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAC3E,CAAC;QACD,cAAc,CAAC,SAAS,CAAC,6BAA6B,EAAE,eAAe,CAAC,OAAO,CAAC,MAAgB,CAAC,CAAA;QACjG,MAAM,YAAY,GAAG,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QACrD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;YAC5C,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxD,CAAC,CAAC,GAAG,YAAY,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACtC,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC9E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC;YACtE,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC/B,CAAC;QACD,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;YAC1B,cAAc,CAAC,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC7D,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,cAAc,CAAC,SAAS,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAA;QACtE,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC9C,cAAc,CAAC,SAAS,CAAC,8BAA8B,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACtF,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC9C,cAAc,CAAC,SAAS,CAAC,8BAA8B,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACtF,CAAC;IACH,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -35,12 +35,14 @@ describe('AddCorsHeaders', () => {
|
|
|
35
35
|
};
|
|
36
36
|
const resp = {
|
|
37
37
|
setHeader: vi.fn(),
|
|
38
|
+
getHeader: vi.fn(),
|
|
38
39
|
};
|
|
39
40
|
addCorsHeaders({
|
|
40
41
|
origins: ['http://localhost/'],
|
|
41
42
|
}, req, resp);
|
|
42
|
-
expect(resp.setHeader).toBeCalledTimes(
|
|
43
|
+
expect(resp.setHeader).toBeCalledTimes(2);
|
|
43
44
|
expect(resp.setHeader).toBeCalledWith('Access-Control-Allow-Origin', 'http://localhost/');
|
|
45
|
+
expect(resp.setHeader).toBeCalledWith('Vary', 'Origin');
|
|
44
46
|
});
|
|
45
47
|
it('Should add allow-credentials header if enabled', () => {
|
|
46
48
|
const req = {
|
|
@@ -48,6 +50,7 @@ describe('AddCorsHeaders', () => {
|
|
|
48
50
|
};
|
|
49
51
|
const resp = {
|
|
50
52
|
setHeader: vi.fn(),
|
|
53
|
+
getHeader: vi.fn(),
|
|
51
54
|
};
|
|
52
55
|
addCorsHeaders({
|
|
53
56
|
origins: ['http://localhost/'],
|
|
@@ -55,8 +58,9 @@ describe('AddCorsHeaders', () => {
|
|
|
55
58
|
// headers: ['my-custom-header', 'header-2'],
|
|
56
59
|
// methods: ['DELETE', 'GET', 'POST', 'PUT', 'PATCH'],
|
|
57
60
|
}, req, resp);
|
|
58
|
-
expect(resp.setHeader).toBeCalledTimes(
|
|
61
|
+
expect(resp.setHeader).toBeCalledTimes(3);
|
|
59
62
|
expect(resp.setHeader).toBeCalledWith('Access-Control-Allow-Origin', 'http://localhost/');
|
|
63
|
+
expect(resp.setHeader).toBeCalledWith('Vary', 'Origin');
|
|
60
64
|
expect(resp.setHeader).toBeCalledWith('Access-Control-Allow-Credentials', 'true');
|
|
61
65
|
// expect(resp.setHeader).toBeCalledWith('Access-Control-Allow-Headers', 'my-custom-header, header-2')
|
|
62
66
|
// expect(resp.setHeader).toBeCalledWith('Access-Control-Allow-Methods', 'DELETE, GET, POST, PUT, PATCH')
|
|
@@ -67,14 +71,16 @@ describe('AddCorsHeaders', () => {
|
|
|
67
71
|
};
|
|
68
72
|
const resp = {
|
|
69
73
|
setHeader: vi.fn(),
|
|
74
|
+
getHeader: vi.fn(),
|
|
70
75
|
};
|
|
71
76
|
addCorsHeaders({
|
|
72
77
|
origins: ['http://localhost/'],
|
|
73
78
|
headers: ['my-custom-header', 'header-2'],
|
|
74
79
|
// methods: ['DELETE', 'GET', 'POST', 'PUT', 'PATCH'],
|
|
75
80
|
}, req, resp);
|
|
76
|
-
expect(resp.setHeader).toBeCalledTimes(
|
|
81
|
+
expect(resp.setHeader).toBeCalledTimes(3);
|
|
77
82
|
expect(resp.setHeader).toBeCalledWith('Access-Control-Allow-Origin', 'http://localhost/');
|
|
83
|
+
expect(resp.setHeader).toBeCalledWith('Vary', 'Origin');
|
|
78
84
|
expect(resp.setHeader).toBeCalledWith('Access-Control-Allow-Headers', 'my-custom-header, header-2');
|
|
79
85
|
// expect(resp.setHeader).toBeCalledWith('Access-Control-Allow-Methods', 'DELETE, GET, POST, PUT, PATCH')
|
|
80
86
|
});
|
|
@@ -84,14 +90,29 @@ describe('AddCorsHeaders', () => {
|
|
|
84
90
|
};
|
|
85
91
|
const resp = {
|
|
86
92
|
setHeader: vi.fn(),
|
|
93
|
+
getHeader: vi.fn(),
|
|
87
94
|
};
|
|
88
95
|
addCorsHeaders({
|
|
89
96
|
origins: ['http://localhost/'],
|
|
90
97
|
methods: ['DELETE', 'GET', 'POST', 'PUT', 'PATCH'],
|
|
91
98
|
}, req, resp);
|
|
92
|
-
expect(resp.setHeader).toBeCalledTimes(
|
|
99
|
+
expect(resp.setHeader).toBeCalledTimes(3);
|
|
93
100
|
expect(resp.setHeader).toBeCalledWith('Access-Control-Allow-Origin', 'http://localhost/');
|
|
101
|
+
expect(resp.setHeader).toBeCalledWith('Vary', 'Origin');
|
|
94
102
|
expect(resp.setHeader).toBeCalledWith('Access-Control-Allow-Methods', 'DELETE, GET, POST, PUT, PATCH');
|
|
95
103
|
});
|
|
104
|
+
it('Should merge Origin into existing Vary header', () => {
|
|
105
|
+
const req = {
|
|
106
|
+
headers: { origin: 'http://localhost/', host: 'http://github.com' },
|
|
107
|
+
};
|
|
108
|
+
const resp = {
|
|
109
|
+
setHeader: vi.fn(),
|
|
110
|
+
getHeader: vi.fn().mockReturnValue('Accept-Encoding'),
|
|
111
|
+
};
|
|
112
|
+
addCorsHeaders({
|
|
113
|
+
origins: ['http://localhost/'],
|
|
114
|
+
}, req, resp);
|
|
115
|
+
expect(resp.setHeader).toBeCalledWith('Vary', 'Accept-Encoding, Origin');
|
|
116
|
+
});
|
|
96
117
|
});
|
|
97
118
|
//# sourceMappingURL=add-cors-header.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-cors-header.spec.js","sourceRoot":"","sources":["../src/add-cors-header.spec.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,GAAG,GAAoB;YAC3B,OAAO,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,kBAAkB,EAAE;SACzC,CAAA;QAC3B,MAAM,IAAI,GAAmB;YAC3B,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;SACU,CAAA;QAE9B,cAAc,CACZ;YACE,OAAO,EAAE,CAAC,oBAAoB,CAAC;YAC/B,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,CAAC,kBAAkB,EAAE,UAAU,CAAC;SAC1C,EACD,GAAG,EACH,IAAI,CACL,CAAA;QACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,GAAG,GAAoB;YAC3B,OAAO,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,EAAE;SAC1C,CAAA;QAC3B,MAAM,IAAI,GAAmB;YAC3B,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;SACU,CAAA;QAE9B,cAAc,CACZ;YACE,OAAO,EAAE,CAAC,oBAAoB,CAAC;YAC/B,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,CAAC,kBAAkB,EAAE,UAAU,CAAC;SAC1C,EACD,GAAG,EACH,IAAI,CACL,CAAA;QACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,GAAG,GAAoB;YAC3B,OAAO,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,EAAE;SAC1C,CAAA;QAC3B,MAAM,IAAI,GAAmB;YAC3B,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;SACU,CAAA;QAE9B,cAAc,CACZ;YACE,OAAO,EAAE,CAAC,mBAAmB,CAAC;SAC/B,EACD,GAAG,EACH,IAAI,CACL,CAAA;QACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACzC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,6BAA6B,EAAE,mBAAmB,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"add-cors-header.spec.js","sourceRoot":"","sources":["../src/add-cors-header.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-patch-endpoint.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/create-patch-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"create-patch-endpoint.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/create-patch-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,qCAAqC,CAAA;AAEpF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,CAAC,SAAS,MAAM,EAChB,WAAW,SAAS,MAAM,CAAC,EAC3B,aAAa,GAAG,cAAc,CAAC,CAAC,EAAE,WAAW,CAAC,WAErC,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,KACnD,aAAa,CAAC,aAAa,CAAC,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,CAQ5D,CAAA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { readPostBody } from '../read-post-body.js';
|
|
2
1
|
import { JsonResult } from '../request-action-implementation.js';
|
|
3
2
|
/**
|
|
4
3
|
* Creates a PATCH endpoint that applies a partial update to an entity
|
|
@@ -6,9 +5,9 @@ import { JsonResult } from '../request-action-implementation.js';
|
|
|
6
5
|
* supplied {@link DataSetToken}.
|
|
7
6
|
*/
|
|
8
7
|
export const createPatchEndpoint = (dataSet) => {
|
|
9
|
-
return async ({ injector,
|
|
8
|
+
return async ({ injector, getBody, getUrlParams }) => {
|
|
10
9
|
const { id } = getUrlParams();
|
|
11
|
-
const patchData = await
|
|
10
|
+
const patchData = await getBody();
|
|
12
11
|
const ds = injector.get(dataSet);
|
|
13
12
|
await ds.update(injector, id, patchData);
|
|
14
13
|
return JsonResult({});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-patch-endpoint.js","sourceRoot":"","sources":["../../src/endpoint-generators/create-patch-endpoint.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"create-patch-endpoint.js","sourceRoot":"","sources":["../../src/endpoint-generators/create-patch-endpoint.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAsB,MAAM,qCAAqC,CAAA;AAEpF;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAKjC,OAAoD,EACS,EAAE;IAC/D,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE;QACnD,MAAM,EAAE,EAAE,EAAE,GAAG,YAAY,EAAE,CAAA;QAC7B,MAAM,SAAS,GAAG,MAAM,OAAO,EAAE,CAAA;QACjC,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAChC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,SAAkC,CAAC,CAAA;QACjE,OAAO,UAAU,CAAC,EAAE,CAAC,CAAA;IACvB,CAAC,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-post-endpoint.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/create-post-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"create-post-endpoint.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/create-post-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEnD,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,qCAAqC,CAAA;AAEpF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,CAAC,SAAS,MAAM,EAChB,WAAW,SAAS,MAAM,CAAC,EAC3B,aAAa,GAAG,cAAc,CAAC,CAAC,EAAE,WAAW,CAAC,WAErC,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,KACnD,aAAa,CAAC,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,CAU3D,CAAA"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { RequestError } from '@furystack/rest';
|
|
2
|
-
import { readPostBody } from '../read-post-body.js';
|
|
3
2
|
import { JsonResult } from '../request-action-implementation.js';
|
|
4
3
|
/**
|
|
5
4
|
* Creates a POST endpoint that inserts a new entity into the DataSet
|
|
@@ -7,9 +6,9 @@ import { JsonResult } from '../request-action-implementation.js';
|
|
|
7
6
|
* `RequestError(404)` when the underlying store returns no created entity.
|
|
8
7
|
*/
|
|
9
8
|
export const createPostEndpoint = (dataSet) => {
|
|
10
|
-
return async ({ injector,
|
|
9
|
+
return async ({ injector, getBody }) => {
|
|
11
10
|
const ds = injector.get(dataSet);
|
|
12
|
-
const entityToCreate = await
|
|
11
|
+
const entityToCreate = await getBody();
|
|
13
12
|
const { created } = await ds.add(injector, entityToCreate);
|
|
14
13
|
if (!created || !created.length) {
|
|
15
14
|
throw new RequestError('Entity not found', 404);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-post-endpoint.js","sourceRoot":"","sources":["../../src/endpoint-generators/create-post-endpoint.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"create-post-endpoint.js","sourceRoot":"","sources":["../../src/endpoint-generators/create-post-endpoint.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAsB,MAAM,qCAAqC,CAAA;AAEpF;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAKhC,OAAoD,EACQ,EAAE;IAC9D,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;QACrC,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAChC,MAAM,cAAc,GAAG,MAAM,OAAO,EAAE,CAAA;QACtC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;QAC1D,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAA;QACjD,CAAC;QACD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACpC,CAAC,CAAA;AACH,CAAC,CAAA"}
|
package/esm/helpers.d.ts
CHANGED
|
@@ -34,12 +34,22 @@ export interface ImplementApiOptions<T extends RestApi> {
|
|
|
34
34
|
description?: string;
|
|
35
35
|
/** OpenAPI version. */
|
|
36
36
|
version?: string;
|
|
37
|
+
/** Maximum request body size in bytes. Defaults to 1 MiB. */
|
|
38
|
+
maxBodyBytes?: number;
|
|
39
|
+
/** Maximum time in ms for handling a request action. When exceeded, responds with 504. Does not abort in-progress body reads. */
|
|
40
|
+
actionTimeoutMs?: number;
|
|
41
|
+
/** Socket inactivity timeout in ms for the underlying HTTP server (shared per listening port). */
|
|
42
|
+
requestTimeout?: number;
|
|
43
|
+
/** Time allowed for receiving request headers in ms (shared per listening port). */
|
|
44
|
+
headersTimeout?: number;
|
|
45
|
+
/** Keep-alive idle timeout in ms (shared per listening port). */
|
|
46
|
+
keepAliveTimeout?: number;
|
|
37
47
|
}
|
|
38
48
|
/**
|
|
39
49
|
* Acquires a pooled HTTP server (creating one if needed), compiles `api`
|
|
40
50
|
* and attaches a {@link ServerApi} that dispatches matching requests.
|
|
41
51
|
* Multiple `useRestService` calls on the same `port` + `hostName` share a
|
|
42
|
-
* single underlying HTTP server.
|
|
52
|
+
* single underlying HTTP server. Server timeout options apply to that shared server.
|
|
43
53
|
*/
|
|
44
54
|
export declare const useRestService: <T extends RestApi>(options: ImplementApiOptions<T>) => Promise<ServerApi>;
|
|
45
55
|
/**
|
|
@@ -47,9 +57,13 @@ export declare const useRestService: <T extends RestApi>(options: ImplementApiOp
|
|
|
47
57
|
* chain (Basic + Cookie by default), appends any caller-provided providers
|
|
48
58
|
* and rebinds {@link HttpAuthenticationSettings}.
|
|
49
59
|
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
60
|
+
* Prerequisites:
|
|
61
|
+
* - Bind {@link UserStore} and {@link SessionStore} to persistent store implementations first.
|
|
62
|
+
* - Ensure the backing user/session stores and datasets are registered on the injector.
|
|
63
|
+
* - Provide `overrides.userDataSet` (or configure a valid `HttpAuthenticationSettings.userDataSet`)
|
|
64
|
+
* so user lookups can be resolved.
|
|
65
|
+
*
|
|
66
|
+
* The Basic and Cookie providers read users/sessions during setup, so missing bindings will fail early.
|
|
53
67
|
*/
|
|
54
68
|
export declare const useHttpAuthentication: (injector: Injector, overrides?: Partial<HttpAuthenticationSettings>) => void;
|
|
55
69
|
/**
|
package/esm/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAS9C,OAAO,EAAqC,0BAA0B,EAAE,MAAM,mCAAmC,CAAA;AACjH,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAE3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAgC,KAAK,qBAAqB,EAAqB,MAAM,uBAAuB,CAAA;AAEnH,OAAO,EAA4B,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAG7F;;;;GAIG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,OAAO;IACpD,4CAA4C;IAC5C,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAA;IAC7B,uFAAuF;IACvF,QAAQ,EAAE,QAAQ,CAAA;IAClB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAA;IACZ,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,oEAAoE;IACpE,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,mDAAmD;IACnD,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnE,yEAAyE;IACzE,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAS9C,OAAO,EAAqC,0BAA0B,EAAE,MAAM,mCAAmC,CAAA;AACjH,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAE3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAgC,KAAK,qBAAqB,EAAqB,MAAM,uBAAuB,CAAA;AAEnH,OAAO,EAA4B,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAG7F;;;;GAIG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,OAAO;IACpD,4CAA4C;IAC5C,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAA;IAC7B,uFAAuF;IACvF,QAAQ,EAAE,QAAQ,CAAA;IAClB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAA;IACZ,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,oEAAoE;IACpE,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,mDAAmD;IACnD,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnE,yEAAyE;IACzE,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iIAAiI;IACjI,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,kGAAkG;IAClG,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,oFAAoF;IACpF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAU,CAAC,SAAS,OAAO,WAAW,mBAAmB,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,SAAS,CA+D1G,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,aAAc,QAAQ,cAAc,OAAO,CAAC,0BAA0B,CAAC,KAAG,IA+B3G,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,YAAmB;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAAG,mBAAmB,KAAG,OAAO,CAAC,SAAS,CAO7G,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,YAAmB;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAAG,YAAY,KAAG,OAAO,CAAC,SAAS,CAQhG,CAAA"}
|
package/esm/helpers.js
CHANGED
|
@@ -17,10 +17,10 @@ import { buildStaticSiteServerApi } from './static-site-runtime.js';
|
|
|
17
17
|
* Acquires a pooled HTTP server (creating one if needed), compiles `api`
|
|
18
18
|
* and attaches a {@link ServerApi} that dispatches matching requests.
|
|
19
19
|
* Multiple `useRestService` calls on the same `port` + `hostName` share a
|
|
20
|
-
* single underlying HTTP server.
|
|
20
|
+
* single underlying HTTP server. Server timeout options apply to that shared server.
|
|
21
21
|
*/
|
|
22
22
|
export const useRestService = async (options) => {
|
|
23
|
-
const { injector, api, hostName, port, root, cors, deserializeQueryParams, enableGetSchema, name, description, version, } = options;
|
|
23
|
+
const { injector, api, hostName, port, root, cors, deserializeQueryParams, enableGetSchema, name, description, version, maxBodyBytes, actionTimeoutMs, requestTimeout, headersTimeout, keepAliveTimeout, } = options;
|
|
24
24
|
const extendedApi = enableGetSchema
|
|
25
25
|
? {
|
|
26
26
|
...api,
|
|
@@ -51,10 +51,12 @@ export const useRestService = async (options) => {
|
|
|
51
51
|
injector,
|
|
52
52
|
hostName,
|
|
53
53
|
deserializeQueryParams,
|
|
54
|
+
maxBodyBytes,
|
|
55
|
+
actionTimeoutMs,
|
|
54
56
|
}),
|
|
55
57
|
};
|
|
56
58
|
const pool = injector.get(HttpServerPoolToken);
|
|
57
|
-
const record = await pool.acquire({ port, hostName });
|
|
59
|
+
const record = await pool.acquire({ port, hostName, requestTimeout, headersTimeout, keepAliveTimeout });
|
|
58
60
|
record.apis.push(serverApi);
|
|
59
61
|
return serverApi;
|
|
60
62
|
};
|
|
@@ -63,9 +65,13 @@ export const useRestService = async (options) => {
|
|
|
63
65
|
* chain (Basic + Cookie by default), appends any caller-provided providers
|
|
64
66
|
* and rebinds {@link HttpAuthenticationSettings}.
|
|
65
67
|
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
68
|
+
* Prerequisites:
|
|
69
|
+
* - Bind {@link UserStore} and {@link SessionStore} to persistent store implementations first.
|
|
70
|
+
* - Ensure the backing user/session stores and datasets are registered on the injector.
|
|
71
|
+
* - Provide `overrides.userDataSet` (or configure a valid `HttpAuthenticationSettings.userDataSet`)
|
|
72
|
+
* so user lookups can be resolved.
|
|
73
|
+
*
|
|
74
|
+
* The Basic and Cookie providers read users/sessions during setup, so missing bindings will fail early.
|
|
69
75
|
*/
|
|
70
76
|
export const useHttpAuthentication = (injector, overrides) => {
|
|
71
77
|
const mergedSettings = {
|
package/esm/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAG1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mDAAmD,CAAA;AAC3F,OAAO,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAA;AAC7F,OAAO,EAAE,2BAA2B,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAA;AACpH,OAAO,EAAE,8BAA8B,EAAE,MAAM,6DAA6D,CAAA;AAC5G,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAA;AACzF,OAAO,EAAE,iCAAiC,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAA;AACjH,OAAO,EAAE,mBAAmB,EAAkB,MAAM,uBAAuB,CAAA;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,OAAO,EAAE,mBAAmB,EAAqB,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAA8B,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACnH,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,wBAAwB,EAA4B,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,6 +47,20 @@ export interface HttpAuthenticationSettings {
|
|
|
47
47
|
* {@link DEFAULT_USER_CACHE_CAPACITY} is used by `UserResolutionCache`.
|
|
48
48
|
*/
|
|
49
49
|
userCacheCapacity?: number;
|
|
50
|
+
/**
|
|
51
|
+
* SameSite attribute for the session cookie. Defaults to `'Lax'`.
|
|
52
|
+
*/
|
|
53
|
+
cookieSameSite?: 'Lax' | 'Strict' | 'None';
|
|
54
|
+
/**
|
|
55
|
+
* When `true`, adds the `Secure` attribute so browsers only send the cookie
|
|
56
|
+
* over HTTPS. Defaults to `false` to allow plain HTTP development setups.
|
|
57
|
+
*/
|
|
58
|
+
cookieSecure?: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Max-Age in seconds for the session cookie. Omit to create a session cookie
|
|
61
|
+
* without an explicit lifetime attribute.
|
|
62
|
+
*/
|
|
63
|
+
cookieMaxAgeSeconds?: number;
|
|
50
64
|
}
|
|
51
65
|
/** Default TTL applied to the user-resolution cache (30 seconds). */
|
|
52
66
|
export declare const DEFAULT_USER_CACHE_TTL_MS = 30000;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-authentication-settings.d.ts","sourceRoot":"","sources":["../src/http-authentication-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAiB,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uDAAuD,CAAA;AAGnG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAGjE;;;;;;;;;GASG;AACH,MAAM,WAAW,0BAA0B;IACzC,uCAAuC;IACvC,WAAW,EAAE,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IAC3C,0CAA0C;IAC1C,cAAc,EAAE,YAAY,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA;IACzD,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAA;IAClB,8FAA8F;IAC9F,eAAe,EAAE,OAAO,CAAA;IACxB;;;;OAIG;IACH,uBAAuB,EAAE,sBAAsB,EAAE,CAAA;IACjD;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"http-authentication-settings.d.ts","sourceRoot":"","sources":["../src/http-authentication-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAiB,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uDAAuD,CAAA;AAGnG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAGjE;;;;;;;;;GASG;AACH,MAAM,WAAW,0BAA0B;IACzC,uCAAuC;IACvC,WAAW,EAAE,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IAC3C,0CAA0C;IAC1C,cAAc,EAAE,YAAY,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA;IACzD,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAA;IAClB,8FAA8F;IAC9F,eAAe,EAAE,OAAO,CAAA;IACxB;;;;OAIG;IACH,uBAAuB,EAAE,sBAAsB,EAAE,CAAA;IACjD;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;IAC1C;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,qEAAqE;AACrE,eAAO,MAAM,yBAAyB,QAAS,CAAA;AAE/C,kEAAkE;AAClE,eAAO,MAAM,2BAA2B,QAAS,CAAA;AAEjD;;;GAGG;AACH,eAAO,MAAM,iCAAiC,QAAO,0BAUnD,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,EAAE,KAAK,CAAC,0BAA0B,EAAE,WAAW,CAIpF,CAAA"}
|
|
@@ -16,6 +16,8 @@ export const defaultHttpAuthenticationSettings = () => ({
|
|
|
16
16
|
authenticationProviders: [],
|
|
17
17
|
userCacheTtlMs: DEFAULT_USER_CACHE_TTL_MS,
|
|
18
18
|
userCacheCapacity: DEFAULT_USER_CACHE_CAPACITY,
|
|
19
|
+
cookieSameSite: 'Lax',
|
|
20
|
+
cookieSecure: false,
|
|
19
21
|
});
|
|
20
22
|
/**
|
|
21
23
|
* DI token carrying the current {@link HttpAuthenticationSettings}. Rebind
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-authentication-settings.js","sourceRoot":"","sources":["../src/http-authentication-settings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAc,MAAM,mBAAmB,CAAA;AAM7D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"http-authentication-settings.js","sourceRoot":"","sources":["../src/http-authentication-settings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAc,MAAM,mBAAmB,CAAA;AAM7D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AA8D7D,qEAAqE;AACrE,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAA;AAE/C,kEAAkE;AAClE,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAA;AAEjD;;;GAGG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,GAA+B,EAAE,CAAC,CAAC;IAClF,WAAW,EAAE,WAAW;IACxB,cAAc,EAAE,cAAc;IAC9B,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE,IAAI;IACrB,uBAAuB,EAAE,EAAE;IAC3B,cAAc,EAAE,yBAAyB;IACzC,iBAAiB,EAAE,2BAA2B;IAC9C,cAAc,EAAE,KAAK;IACrB,YAAY,EAAE,KAAK;CACpB,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAmD,aAAa,CAAC;IACtG,IAAI,EAAE,mDAAmD;IACzD,QAAQ,EAAE,WAAW;IACrB,OAAO,EAAE,GAAG,EAAE,CAAC,iCAAiC,EAAE;CACnD,CAAC,CAAA"}
|
|
@@ -7,6 +7,12 @@ import type { Duplex } from 'stream';
|
|
|
7
7
|
export interface ServerOptions {
|
|
8
8
|
hostName?: string;
|
|
9
9
|
port: number;
|
|
10
|
+
/** Socket inactivity timeout in ms. Defaults to Node's `server.requestTimeout`. */
|
|
11
|
+
requestTimeout?: number;
|
|
12
|
+
/** Time allowed for receiving request headers in ms. Defaults to Node's `server.headersTimeout`. */
|
|
13
|
+
headersTimeout?: number;
|
|
14
|
+
/** Keep-alive idle timeout in ms. Defaults to Node's `server.keepAliveTimeout`. */
|
|
15
|
+
keepAliveTimeout?: number;
|
|
10
16
|
}
|
|
11
17
|
/** Payload passed to every {@link ServerApi.onRequest} invocation. */
|
|
12
18
|
export interface OnRequest {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-server-pool.d.ts","sourceRoot":"","sources":["../src/http-server-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAGnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAGpC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"http-server-pool.d.ts","sourceRoot":"","sources":["../src/http-server-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAGnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAGpC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,mFAAmF;IACnF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,oGAAoG;IACpG,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,mFAAmF;IACnF,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,sEAAsE;AACtE,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,eAAe,CAAA;IACpB,GAAG,EAAE,cAAc,CAAA;CACpB;AAED,sEAAsE;AACtE,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,eAAe,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,KAAK,OAAO,CAAA;IAC3C,SAAS,EAAE,CAAC,OAAO,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAChD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAClD;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,SAAS,EAAE,CAAA;CAClB;AAED,eAAO,MAAM,YAAY,cAAc,CAAA;AAIvC;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CACvD;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,cAAc,EAAE,QAAQ,CA0G9D,CAAA"}
|
package/esm/http-server-pool.js
CHANGED
|
@@ -31,6 +31,12 @@ export const HttpServerPoolToken = defineService({
|
|
|
31
31
|
}
|
|
32
32
|
res.destroy();
|
|
33
33
|
});
|
|
34
|
+
if (options.requestTimeout !== undefined)
|
|
35
|
+
server.requestTimeout = options.requestTimeout;
|
|
36
|
+
if (options.headersTimeout !== undefined)
|
|
37
|
+
server.headersTimeout = options.headersTimeout;
|
|
38
|
+
if (options.keepAliveTimeout !== undefined)
|
|
39
|
+
server.keepAliveTimeout = options.keepAliveTimeout;
|
|
34
40
|
server.on('upgrade', (req, socket, head) => {
|
|
35
41
|
const apiMatch = apis.find((api) => api.shouldExec({ req, res: {} }));
|
|
36
42
|
if (apiMatch?.onUpgrade) {
|
|
@@ -74,16 +80,28 @@ export const HttpServerPoolToken = defineService({
|
|
|
74
80
|
})));
|
|
75
81
|
servers.clear();
|
|
76
82
|
});
|
|
83
|
+
const applyServerTimeouts = (server, options) => {
|
|
84
|
+
// shortcut: timeout values are per listening server (shared by port); later explicit values override
|
|
85
|
+
if (options.requestTimeout !== undefined)
|
|
86
|
+
server.requestTimeout = options.requestTimeout;
|
|
87
|
+
if (options.headersTimeout !== undefined)
|
|
88
|
+
server.headersTimeout = options.headersTimeout;
|
|
89
|
+
if (options.keepAliveTimeout !== undefined)
|
|
90
|
+
server.keepAliveTimeout = options.keepAliveTimeout;
|
|
91
|
+
};
|
|
77
92
|
return {
|
|
78
93
|
acquire: async (options) => {
|
|
79
94
|
const url = buildHostUrl(options);
|
|
80
95
|
const existing = servers.get(url);
|
|
81
96
|
if (existing) {
|
|
97
|
+
applyServerTimeouts(existing.server, options);
|
|
82
98
|
return existing;
|
|
83
99
|
}
|
|
84
100
|
const pending = pendingCreates.get(url);
|
|
85
101
|
if (pending) {
|
|
86
|
-
|
|
102
|
+
const record = await pending;
|
|
103
|
+
applyServerTimeouts(record.server, options);
|
|
104
|
+
return record;
|
|
87
105
|
}
|
|
88
106
|
const createPromise = createRecord(url, options);
|
|
89
107
|
pendingCreates.set(url, createPromise);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-server-pool.js","sourceRoot":"","sources":["../src/http-server-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAc,MAAM,mBAAmB,CAAA;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AAGnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"http-server-pool.js","sourceRoot":"","sources":["../src/http-server-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -189,5 +189,30 @@ describe('HttpServerPool', () => {
|
|
|
189
189
|
await injector[Symbol.asyncDispose]();
|
|
190
190
|
}
|
|
191
191
|
});
|
|
192
|
+
it('Should apply explicit server timeout options', async () => {
|
|
193
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
194
|
+
const pool = injector.get(HttpServerPoolToken);
|
|
195
|
+
const port = getPort();
|
|
196
|
+
const record = await pool.acquire({
|
|
197
|
+
port,
|
|
198
|
+
requestTimeout: 12_345,
|
|
199
|
+
headersTimeout: 23_456,
|
|
200
|
+
keepAliveTimeout: 3_456,
|
|
201
|
+
});
|
|
202
|
+
expect(record.server.requestTimeout).toBe(12_345);
|
|
203
|
+
expect(record.server.headersTimeout).toBe(23_456);
|
|
204
|
+
expect(record.server.keepAliveTimeout).toBe(3_456);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
it('Should reapply timeout options when acquiring an existing server', async () => {
|
|
208
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
209
|
+
const pool = injector.get(HttpServerPoolToken);
|
|
210
|
+
const port = getPort();
|
|
211
|
+
await pool.acquire({ port, requestTimeout: 10_000 });
|
|
212
|
+
const record = await pool.acquire({ port, requestTimeout: 20_000, headersTimeout: 30_000 });
|
|
213
|
+
expect(record.server.requestTimeout).toBe(20_000);
|
|
214
|
+
expect(record.server.headersTimeout).toBe(30_000);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
192
217
|
});
|
|
193
218
|
//# sourceMappingURL=http-server-pool.spec.js.map
|