@fluojs/runtime 1.0.0-beta.4 → 1.0.0-beta.6
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.ko.md +12 -1
- package/README.md +12 -1
- package/dist/adapters/request-response-factory.d.ts.map +1 -1
- package/dist/adapters/request-response-factory.js +4 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +7 -1
- package/dist/node/internal-node-request.js +13 -4
- package/dist/node/internal-node.d.ts +1 -5
- package/dist/node/internal-node.d.ts.map +1 -1
- package/dist/node/internal-node.js +8 -5
- package/dist/web.d.ts +7 -1
- package/dist/web.d.ts.map +1 -1
- package/dist/web.js +21 -3
- package/package.json +3 -3
package/README.ko.md
CHANGED
|
@@ -123,6 +123,7 @@ class UsersModule {}
|
|
|
123
123
|
## 동작 계약
|
|
124
124
|
|
|
125
125
|
- 요청 바디 파싱은 Web 표준 요청과 Node 기반 요청 모두에서 바이트가 스트리밍되는 동안 `maxBodySize`를 강제합니다.
|
|
126
|
+
- `@fluojs/runtime/node`에서는 Node 요청 바디 파싱 전에 primary `content-type` media type을 normalize한 뒤 JSON 및 멀티파트 여부를 판단하므로, 대소문자가 섞인 JSON/멀티파트 헤더도 문서화된 파서 동작을 그대로 유지합니다.
|
|
126
127
|
- Node 기반 및 Web 표준 요청 wrapper는 바디 파싱 전에 저비용 요청 metadata를 snapshot으로 고정한 뒤 dispatch 경계에서 `body`/`rawBody`를 한 번 materialize하므로 userland는 계속 동기 parsed 값을 관찰합니다.
|
|
127
128
|
- Node 기반 쿠키/쿼리 값과 Web 표준 헤더는 요청 wrapper가 생성되는 시점에 snapshot으로 고정된 뒤 요청별로 lazy하게 normalize되고 memoize됩니다. 이후 upstream 객체가 변경되어도 `FrameworkRequest` view는 바뀌지 않습니다.
|
|
128
129
|
- `ApplicationContext.get()`과 `Application.get()`은 bootstrap 시점에 알려진 직접 root singleton class/factory provider 조회만 memoize하며, alias, request, transient, 종료 이후, multi-provider, `container.override()` 해석 의미는 그대로 유지합니다.
|
|
@@ -131,6 +132,7 @@ class UsersModule {}
|
|
|
131
132
|
- 애플리케이션 또는 컨텍스트 bootstrap이 런타임 리소스나 lifecycle instance 생성 이후 실패하면 fluo는 readiness를 초기화하고, 등록된 runtime cleanup callback을 실행하며, 그 시점까지 해석된 instance의 shutdown hook을 `bootstrap-failed`로 호출하고, 컨테이너를 dispose하고, cleanup 실패를 로그로 남긴 뒤 원래 bootstrap error를 다시 던집니다.
|
|
132
133
|
- Bootstrap은 독립적인 singleton lifecycle provider를 병렬로 해석한 뒤 lifecycle hook은 결정적인 provider 순서대로 실행합니다.
|
|
133
134
|
- 멀티파트 파싱은 누적 바디 크기가 설정된 `multipart.maxTotalSize`를 넘으면 즉시 거부되며, 런타임 어댑터는 별도 재정의가 없으면 이 한도를 `maxBodySize`와 동일하게 맞춥니다.
|
|
135
|
+
- `createNodeHttpAdapter(...)`, `bootstrapNodeApplication(...)`, `runNodeApplication(...)`는 `maxBodySize`를 0 이상의 정수 바이트 수로만 받으며, 값이 잘못되면 어댑터 생성/부트스트랩 단계에서 즉시 실패합니다.
|
|
134
136
|
- 응답 스트림 백프레셔 헬퍼는 `drain`, `close`, `error` 중 어느 경우에도 `waitForDrain()`을 완료시켜 끊어진 연결에서 스트리밍 작성기가 멈추지 않도록 합니다.
|
|
135
137
|
- 런타임 health 모듈은 bootstrap이 ready로 표시하기 전까지 `/ready`를 HTTP 503과 `starting`으로 보고하며, 애플리케이션/컨텍스트 종료가 시작되는 즉시, 종료 시도가 실패하더라도 다시 `starting`으로 내려갑니다.
|
|
136
138
|
- 시그널 기반 종료 헬퍼는 bounded drain semantics를 유지하면서 timeout/실패 상황을 로그와 `process.exitCode`로 보고하지만, 최종 프로세스 종료 소유권은 주변 호스트 런타임에 남겨 둡니다.
|
|
@@ -170,9 +172,18 @@ import {
|
|
|
170
172
|
} from '@fluojs/runtime/node';
|
|
171
173
|
```
|
|
172
174
|
|
|
175
|
+
```typescript
|
|
176
|
+
const adapter = createNodeHttpAdapter({
|
|
177
|
+
port: 3000,
|
|
178
|
+
maxBodySize: 1_048_576,
|
|
179
|
+
});
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
공개 Node 런타임 surface에서 `maxBodySize`는 바이트 수를 나타내는 숫자만 허용합니다. `'1mb'` 같은 값은 나중에 암묵 변환되지 않고 어댑터 생성 시점에 즉시 거부됩니다.
|
|
183
|
+
|
|
173
184
|
- `createConsoleApplicationLogger()`: `process.stdout`/`process.stderr`를 사용하는 컬러 콘솔 로거.
|
|
174
185
|
- `createJsonApplicationLogger()`: `process.stdout`/`process.stderr`를 사용하는 구조화된 JSON 로거.
|
|
175
|
-
- `createNodeHttpAdapter()`: 어댑터 우선 런타임 구성을 위한 raw Node `http`/`https` 어댑터
|
|
186
|
+
- `createNodeHttpAdapter()`: 어댑터 우선 런타임 구성을 위한 raw Node `http`/`https` 어댑터 팩토리입니다. primary Node 요청 `content-type`을 JSON/멀티파트 판별 전에 normalize하며, `maxBodySize`는 숫자 바이트 수만 받습니다.
|
|
176
187
|
- `bootstrapNodeApplication()` / `runNodeApplication()`: 호환 패키지와 직접 Node 런타임 흐름에서 사용하는 Node 전용 부트스트랩 헬퍼.
|
|
177
188
|
- `createNodeShutdownSignalRegistration()`, `defaultNodeShutdownSignals()`, `registerShutdownSignals()`: 호스트가 명시적으로 시그널 wiring을 제어할 때 쓰는 종료 등록 헬퍼.
|
|
178
189
|
|
package/README.md
CHANGED
|
@@ -123,6 +123,7 @@ class UsersModule {}
|
|
|
123
123
|
## Behavioral Contracts
|
|
124
124
|
|
|
125
125
|
- Request body parsing enforces `maxBodySize` while bytes are still streaming for both Web-standard and Node-backed requests.
|
|
126
|
+
- On `@fluojs/runtime/node`, Node request body parsing normalizes the primary `content-type` media type before JSON and multipart detection, so mixed-case JSON and multipart headers preserve the documented parser behavior.
|
|
126
127
|
- Node-backed and Web-standard request wrappers snapshot cheap request metadata before body parsing, then materialize `body`/`rawBody` once at the dispatch boundary so userland continues to observe synchronous parsed values.
|
|
127
128
|
- Node-backed cookies/query values and Web-standard headers are snapshotted when the request wrapper is created, then lazily normalized and memoized per request; later upstream object mutations do not change the `FrameworkRequest` view.
|
|
128
129
|
- `ApplicationContext.get()` and `Application.get()` memoize only direct root singleton class/factory provider lookups known at bootstrap, while preserving alias, request, transient, post-close, multi-provider, and `container.override()` resolution semantics.
|
|
@@ -131,6 +132,7 @@ class UsersModule {}
|
|
|
131
132
|
- If application or context bootstrap fails after runtime resources or lifecycle instances have been created, fluo resets readiness, runs registered runtime cleanup callbacks, invokes shutdown hooks for instances resolved so far with `bootstrap-failed`, disposes the container, logs cleanup failures, and rethrows the original bootstrap error.
|
|
132
133
|
- Bootstrap resolves independent singleton lifecycle providers concurrently, then runs lifecycle hooks in deterministic provider order.
|
|
133
134
|
- Multipart parsing rejects payloads when the cumulative body size exceeds the configured `multipart.maxTotalSize`; runtime adapters default that limit to `maxBodySize` unless you override it.
|
|
135
|
+
- `createNodeHttpAdapter(...)`, `bootstrapNodeApplication(...)`, and `runNodeApplication(...)` accept `maxBodySize` only as a non-negative integer byte count and fail fast during adapter creation/bootstrap when the value is invalid.
|
|
134
136
|
- Response stream backpressure helpers settle `waitForDrain()` on `drain`, `close`, or `error` so streaming writers do not hang on dead connections.
|
|
135
137
|
- Runtime health modules report `/ready` as `starting` with HTTP 503 until bootstrap marks them ready, and they return to `starting` as soon as application/context shutdown begins, including failed shutdown attempts.
|
|
136
138
|
- Signal-driven shutdown helpers preserve bounded drain semantics, log timeout/failure conditions, and set `process.exitCode` when shutdown does not finish cleanly, but they leave final process termination ownership to the surrounding host runtime.
|
|
@@ -170,9 +172,18 @@ import {
|
|
|
170
172
|
} from '@fluojs/runtime/node';
|
|
171
173
|
```
|
|
172
174
|
|
|
175
|
+
```typescript
|
|
176
|
+
const adapter = createNodeHttpAdapter({
|
|
177
|
+
port: 3000,
|
|
178
|
+
maxBodySize: 1_048_576,
|
|
179
|
+
});
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
For the public Node runtime surface, `maxBodySize` is a byte-count number only. Values such as `'1mb'` are rejected immediately during adapter creation instead of being coerced later.
|
|
183
|
+
|
|
173
184
|
- `createConsoleApplicationLogger()`: Colorized console logger using `process.stdout`/`process.stderr`.
|
|
174
185
|
- `createJsonApplicationLogger()`: Structured JSON logger using `process.stdout`/`process.stderr`.
|
|
175
|
-
- `createNodeHttpAdapter()`: Raw Node `http`/`https` adapter factory for adapter-first runtime setup.
|
|
186
|
+
- `createNodeHttpAdapter()`: Raw Node `http`/`https` adapter factory for adapter-first runtime setup. The helper normalizes the primary Node request `content-type` before JSON/multipart detection and accepts `maxBodySize` only as numeric bytes.
|
|
176
187
|
- `bootstrapNodeApplication()` / `runNodeApplication()`: Node-specific bootstrap helpers used by compatibility packages and direct Node runtime flows.
|
|
177
188
|
- `createNodeShutdownSignalRegistration()`, `defaultNodeShutdownSignals()`, `registerShutdownSignals()`: Shutdown registration helpers for hosts that need explicit signal wiring.
|
|
178
189
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-response-factory.d.ts","sourceRoot":"","sources":["../../src/adapters/request-response-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEpF,kFAAkF;AAClF,MAAM,WAAW,sBAAsB,CACrC,UAAU,EACV,WAAW,EACX,QAAQ,SAAS,iBAAiB,GAAG,iBAAiB;IAEtD,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtF,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAAC;IAC3D,cAAc,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC3E,kBAAkB,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;IAC7D,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3F;AAED,2FAA2F;AAC3F,MAAM,WAAW,yCAAyC,CACxD,UAAU,EACV,WAAW,EACX,QAAQ,SAAS,iBAAiB,GAAG,iBAAiB;IAEtD,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,yBAAyB,EAAE,MAAM,CAAC;IAClC,OAAO,EAAE,sBAAsB,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACnE,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,kCAAkC,CACtD,UAAU,EACV,WAAW,EACX,QAAQ,SAAS,iBAAiB,GAAG,iBAAiB,EACtD,EACA,UAAU,EACV,yBAAyB,EACzB,OAAO,EACP,UAAU,EACV,WAAW,GACZ,EAAE,yCAAyC,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"request-response-factory.d.ts","sourceRoot":"","sources":["../../src/adapters/request-response-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEpF,kFAAkF;AAClF,MAAM,WAAW,sBAAsB,CACrC,UAAU,EACV,WAAW,EACX,QAAQ,SAAS,iBAAiB,GAAG,iBAAiB;IAEtD,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtF,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAAC;IAC3D,cAAc,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC3E,kBAAkB,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;IAC7D,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3F;AAED,2FAA2F;AAC3F,MAAM,WAAW,yCAAyC,CACxD,UAAU,EACV,WAAW,EACX,QAAQ,SAAS,iBAAiB,GAAG,iBAAiB;IAEtD,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,yBAAyB,EAAE,MAAM,CAAC;IAClC,OAAO,EAAE,sBAAsB,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACnE,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,kCAAkC,CACtD,UAAU,EACV,WAAW,EACX,QAAQ,SAAS,iBAAiB,GAAG,iBAAiB,EACtD,EACA,UAAU,EACV,yBAAyB,EACzB,OAAO,EACP,UAAU,EACV,WAAW,GACZ,EAAE,yCAAyC,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CA+BlG"}
|
|
@@ -19,7 +19,10 @@ export async function dispatchWithRequestResponseFactory({
|
|
|
19
19
|
const signal = factory.createRequestSignal(rawResponse);
|
|
20
20
|
try {
|
|
21
21
|
const frameworkRequest = await factory.createRequest(rawRequest, signal);
|
|
22
|
-
|
|
22
|
+
const materializeRequest = factory.materializeRequest;
|
|
23
|
+
if (materializeRequest) {
|
|
24
|
+
await materializeRequest(frameworkRequest);
|
|
25
|
+
}
|
|
23
26
|
if (!dispatcher) {
|
|
24
27
|
throw new Error(dispatcherNotReadyMessage);
|
|
25
28
|
}
|
package/dist/bootstrap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EAEX,uBAAuB,EAGvB,2BAA2B,EAC3B,sBAAsB,EACtB,eAAe,EAGf,wBAAwB,EACxB,+BAA+B,EAC/B,yBAAyB,EAEzB,gBAAgB,EAChB,UAAU,EAKX,MAAM,YAAY,CAAC;AA2apB;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,gBAAgB,GAAG,CAAC,CAIjG;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,sBAA2B,GAAG,eAAe,CA+B7G;
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EAEX,uBAAuB,EAGvB,2BAA2B,EAC3B,sBAAsB,EACtB,eAAe,EAGf,wBAAwB,EACxB,+BAA+B,EAC/B,yBAAyB,EAEzB,gBAAgB,EAChB,UAAU,EAKX,MAAM,YAAY,CAAC;AA2apB;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,gBAAgB,GAAG,CAAC,CAIjG;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,sBAA2B,GAAG,eAAe,CA+B7G;AAmqBD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,WAAW,CAAC,CAqHrG;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB;;;;;;;OAOG;WACU,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,WAAW,CAAC;IAOzG;;;;;;;OAOG;WACU,wBAAwB,CACnC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC,kBAAkB,CAAC;IAoG9B;;;;;;;;OAQG;WACU,kBAAkB,CAC7B,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,uBAAuB,CAAC;CAuBpC;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,oBAAc,CAAC"}
|
package/dist/bootstrap.js
CHANGED
|
@@ -796,15 +796,21 @@ function createFilterErrorHandler(filters) {
|
|
|
796
796
|
return async (error, request, response, requestId) => runExceptionFilters(filters, error, request, response, requestId);
|
|
797
797
|
}
|
|
798
798
|
function createRuntimeDispatcherOptions(bootstrapped, options, handlerMapping, errorHandler, logger) {
|
|
799
|
+
const converters = options.converters ?? [];
|
|
799
800
|
const dispatcherOptions = {
|
|
800
801
|
appMiddleware: options.middleware ?? [],
|
|
801
|
-
binder: new DefaultBinder(options.converters ?? []),
|
|
802
802
|
handlerMapping,
|
|
803
803
|
interceptors: options.interceptors ?? [],
|
|
804
804
|
logger,
|
|
805
805
|
observers: options.observers ?? [],
|
|
806
|
+
requestScope: {
|
|
807
|
+
converterDefinitions: converters
|
|
808
|
+
},
|
|
806
809
|
rootContainer: bootstrapped.container
|
|
807
810
|
};
|
|
811
|
+
if (converters.length > 0) {
|
|
812
|
+
dispatcherOptions.binder = new DefaultBinder(converters);
|
|
813
|
+
}
|
|
808
814
|
if (errorHandler) {
|
|
809
815
|
dispatcherOptions.onError = errorHandler;
|
|
810
816
|
}
|
|
@@ -56,8 +56,8 @@ export function createDeferredFrameworkRequest(request, signal, multipartOptions
|
|
|
56
56
|
const searchParams = new URLSearchParams(url.searchParams);
|
|
57
57
|
const cookies = createMemoizedValue(() => parseCookieHeader(cookieHeader));
|
|
58
58
|
const query = createMemoizedValue(() => parseQueryParams(searchParams));
|
|
59
|
-
const contentType =
|
|
60
|
-
const isMultipart =
|
|
59
|
+
const contentType = normalizePrimaryContentType(headers['content-type']);
|
|
60
|
+
const isMultipart = contentType === 'multipart/form-data';
|
|
61
61
|
const materializeBody = createMemoizedAsyncValue(async () => {
|
|
62
62
|
if (isMultipart) {
|
|
63
63
|
const result = await parseMultipart({
|
|
@@ -204,6 +204,15 @@ function readPrimaryHeaderValue(headerValue) {
|
|
|
204
204
|
}
|
|
205
205
|
return headerValue;
|
|
206
206
|
}
|
|
207
|
+
function normalizePrimaryContentType(headerValue) {
|
|
208
|
+
const primaryHeaderValue = readPrimaryHeaderValue(headerValue);
|
|
209
|
+
if (typeof primaryHeaderValue !== 'string') {
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
const [mediaType] = primaryHeaderValue.split(';', 1);
|
|
213
|
+
const normalizedMediaType = mediaType?.trim().toLowerCase();
|
|
214
|
+
return normalizedMediaType && normalizedMediaType.length > 0 ? normalizedMediaType : undefined;
|
|
215
|
+
}
|
|
207
216
|
function decodeCookieValue(raw) {
|
|
208
217
|
try {
|
|
209
218
|
return decodeURIComponent(raw);
|
|
@@ -248,8 +257,8 @@ async function readRequestBody(request, contentType, maxBodySize = 1 * 1024 * 10
|
|
|
248
257
|
rawBody: preserveRawBody ? rawBody : undefined
|
|
249
258
|
};
|
|
250
259
|
}
|
|
251
|
-
const primaryContentType =
|
|
252
|
-
if (
|
|
260
|
+
const primaryContentType = normalizePrimaryContentType(contentType);
|
|
261
|
+
if (primaryContentType === 'application/json') {
|
|
253
262
|
try {
|
|
254
263
|
return {
|
|
255
264
|
body: JSON.parse(bodyText),
|
|
@@ -73,17 +73,13 @@ export declare class NodeHttpApplicationAdapter implements HttpApplicationAdapte
|
|
|
73
73
|
private readonly host;
|
|
74
74
|
private readonly retryDelayMs;
|
|
75
75
|
private readonly retryLimit;
|
|
76
|
-
private readonly compression;
|
|
77
76
|
private readonly httpsOptions;
|
|
78
|
-
private readonly multipartOptions?;
|
|
79
|
-
private readonly maxBodySize;
|
|
80
|
-
private readonly preserveRawBody;
|
|
81
77
|
private readonly shutdownTimeoutMs;
|
|
82
78
|
private readonly server;
|
|
83
79
|
private dispatcher?;
|
|
84
80
|
private readonly requestResponseFactory;
|
|
85
81
|
private readonly sockets;
|
|
86
|
-
constructor(port: number, host: string | undefined, retryDelayMs: number | undefined, retryLimit: number | undefined, compression: boolean | undefined, httpsOptions: HttpsServerOptions | undefined, multipartOptions?: MultipartOptions
|
|
82
|
+
constructor(port: number, host: string | undefined, retryDelayMs: number | undefined, retryLimit: number | undefined, compression: boolean | undefined, httpsOptions: HttpsServerOptions | undefined, multipartOptions?: MultipartOptions, maxBodySize?: number, preserveRawBody?: boolean, shutdownTimeoutMs?: number);
|
|
87
83
|
getServer(): NodeServer;
|
|
88
84
|
getRealtimeCapability(): import("@fluojs/http").ServerBackedHttpAdapterRealtimeCapability;
|
|
89
85
|
getListenTarget(): NodeListenTarget;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal-node.d.ts","sourceRoot":"","sources":["../../src/node/internal-node.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"internal-node.d.ts","sourceRoot":"","sources":["../../src/node/internal-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAA6C,MAAM,WAAW,CAAC;AACxG,OAAO,EAAE,YAAY,IAAI,iBAAiB,EAAE,KAAK,aAAa,IAAI,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGzG,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC5B,MAAM,cAAc,CAAC;AAMtB,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACrB,MAAM,gCAAgC,CAAC;AAaxC,OAAO,EACL,oCAAoC,EACpC,0BAA0B,EAC1B,uBAAuB,EACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKtE,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAExG,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,gBAAgB;QACxB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;QACvB,OAAO,CAAC,EAAE,UAAU,CAAC;KACtB;CACF;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,WAAW,CAAC;AAIhE;;GAEG;AACH,MAAM,WAAW,+BAAgC,SAAQ,IAAI,CAAC,wBAAwB,EAAE,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC1H,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,KAAK,GAAG,sBAAsB,CAAC;IACjD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,+BAA+B;IAChF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,KAAK,GAAG,SAAS,qBAAqB,EAAE,CAAC;CAC5D;AAED,UAAU,gBAAgB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AASD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAG7F;;GAEG;AACH,qBAAa,0BAA2B,YAAW,sBAAsB;IAWrE,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAE3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAI7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAnBpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAIrC;IACF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAG1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,YAAY,oBAAM,EAClB,UAAU,oBAAK,EAChC,WAAW,qBAAQ,EACF,YAAY,EAAE,kBAAkB,GAAG,SAAS,EAC7D,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,WAAW,SAAkB,EAC7B,eAAe,UAAQ,EACN,iBAAiB,SAA8B;IAmBlE,SAAS,IAAI,UAAU;IAIvB,qBAAqB;IAIrB,eAAe,IAAI,gBAAgB;IAI7B,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAad,aAAa;CAY5B;AAiDD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,EAAE,WAAW,UAAQ,EAAE,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,sBAAsB,CAa5J;AAED;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,WAAW,CAAC,CAMtB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,WAAW,CAAC,CAQtB;AAED,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,oCAAoC,EACpC,0BAA0B,EAC1B,uBAAuB,GACxB,CAAC"}
|
|
@@ -43,11 +43,7 @@ export class NodeHttpApplicationAdapter {
|
|
|
43
43
|
this.host = host;
|
|
44
44
|
this.retryDelayMs = retryDelayMs;
|
|
45
45
|
this.retryLimit = retryLimit;
|
|
46
|
-
this.compression = compression;
|
|
47
46
|
this.httpsOptions = httpsOptions;
|
|
48
|
-
this.multipartOptions = multipartOptions;
|
|
49
|
-
this.maxBodySize = maxBodySize;
|
|
50
|
-
this.preserveRawBody = preserveRawBody;
|
|
51
47
|
this.shutdownTimeoutMs = shutdownTimeoutMs;
|
|
52
48
|
this.requestResponseFactory = createNodeRequestResponseFactory(compression, multipartOptions, maxBodySize, preserveRawBody);
|
|
53
49
|
this.server = createNodeServer(this.httpsOptions, (request, response) => {
|
|
@@ -132,7 +128,7 @@ function createNodeRequestResponseFactory(compression, multipartOptions, maxBody
|
|
|
132
128
|
* @returns The create node http adapter result.
|
|
133
129
|
*/
|
|
134
130
|
export function createNodeHttpAdapter(options = {}, compression = false, multipartOptions) {
|
|
135
|
-
return new NodeHttpApplicationAdapter(resolveNodePort(options.port), options.host, options.retryDelayMs, options.retryLimit, compression, options.https, multipartOptions, options.maxBodySize, options.rawBody, options.shutdownTimeoutMs);
|
|
131
|
+
return new NodeHttpApplicationAdapter(resolveNodePort(options.port), options.host, options.retryDelayMs, options.retryLimit, compression, options.https, multipartOptions, resolveNodeMaxBodySize(options.maxBodySize), options.rawBody, options.shutdownTimeoutMs);
|
|
136
132
|
}
|
|
137
133
|
|
|
138
134
|
/**
|
|
@@ -259,4 +255,11 @@ function resolveNodePort(value) {
|
|
|
259
255
|
throw new Error(`Invalid PORT value: ${String(value ?? 3000)}.`);
|
|
260
256
|
}
|
|
261
257
|
return port;
|
|
258
|
+
}
|
|
259
|
+
function resolveNodeMaxBodySize(value) {
|
|
260
|
+
const maxBodySize = value ?? 1 * 1024 * 1024;
|
|
261
|
+
if (!Number.isInteger(maxBodySize) || maxBodySize < 0) {
|
|
262
|
+
throw new Error(`Invalid maxBodySize value: ${String(value ?? 1 * 1024 * 1024)}. Expected a non-negative integer number of bytes.`);
|
|
263
|
+
}
|
|
264
|
+
return maxBodySize;
|
|
262
265
|
}
|
package/dist/web.d.ts
CHANGED
|
@@ -21,6 +21,12 @@ export interface CreateWebRequestResponseFactoryOptions {
|
|
|
21
21
|
export interface DispatchWebRequestOptions extends CreateWebRequestResponseFactoryOptions {
|
|
22
22
|
dispatcher?: Dispatcher;
|
|
23
23
|
dispatcherNotReadyMessage?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Factory reused by adapters that share one stable Web parsing configuration across requests.
|
|
26
|
+
*
|
|
27
|
+
* When provided, the factory owns parsing configuration and `maxBodySize`, `multipart`, and `rawBody` are ignored.
|
|
28
|
+
*/
|
|
29
|
+
factory?: RequestResponseFactory<Request, AbortSignal | undefined, WebFrameworkResponse>;
|
|
24
30
|
request: Request;
|
|
25
31
|
}
|
|
26
32
|
/**
|
|
@@ -43,7 +49,7 @@ export declare function createWebRequestResponseFactory(options?: CreateWebReque
|
|
|
43
49
|
* @param options - Dispatch configuration including the request and runtime parsing options.
|
|
44
50
|
* @returns The native Web response produced by the dispatcher.
|
|
45
51
|
*/
|
|
46
|
-
export declare function dispatchWebRequest({ dispatcher, dispatcherNotReadyMessage, request, ...options }: DispatchWebRequestOptions): Promise<Response>;
|
|
52
|
+
export declare function dispatchWebRequest({ dispatcher, dispatcherNotReadyMessage, factory, request, ...options }: DispatchWebRequestOptions): Promise<Response>;
|
|
47
53
|
/**
|
|
48
54
|
* Creates a framework request from a native Web request.
|
|
49
55
|
*
|
package/dist/web.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAC;AAMtB,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,wCAAwC,CAAC;AAEhD,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,gBAAgB;QACxB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;QACvB,OAAO,CAAC,EAAE,UAAU,CAAC;KACtB;CACF;AAOD;;GAEG;AACH,MAAM,WAAW,sCAAsC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,sCAAsC;IACvF,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC;;;;OAIG;IACH,OAAO,CAAC,EAAE,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACzF,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D,UAAU,IAAI,QAAQ,CAAC;CACxB;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAiNhD;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,GAAE,sCAA2C,GACnD,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,EAAE,oBAAoB,CAAC,CA6BhF;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,EACvC,UAAU,EACV,yBAAiG,EACjG,OAAO,EACP,OAAO,EACP,GAAG,OAAO,EACX,EAAE,yBAAyB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAU/C;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,WAAW,EACnB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,WAAW,SAAwB,EACnC,eAAe,UAAQ,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAW3B"}
|
package/dist/web.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BadRequestException, createErrorResponse, HttpException, InternalServerErrorException, PayloadTooLargeException } from '@fluojs/http';
|
|
2
|
+
import { attachFrameworkRequestNativeRouteHandoff, consumeRawRequestNativeRouteHandoff } from '@fluojs/http/internal';
|
|
2
3
|
import { parseMultipart } from './multipart.js';
|
|
3
4
|
import { dispatchWithRequestResponseFactory } from './adapters/request-response-factory.js';
|
|
4
5
|
const DEFAULT_MAX_BODY_SIZE = 1 * 1024 * 1024;
|
|
@@ -116,6 +117,17 @@ class MutableWebFrameworkResponse {
|
|
|
116
117
|
this.responseBody = serialized.payload;
|
|
117
118
|
this.committed = true;
|
|
118
119
|
}
|
|
120
|
+
async sendSimpleJson(body) {
|
|
121
|
+
if (this.finalizedResponse) {
|
|
122
|
+
this.committed = true;
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (!hasHeader(this.headers, 'content-type')) {
|
|
126
|
+
this.setHeader('Content-Type', 'application/json; charset=utf-8');
|
|
127
|
+
}
|
|
128
|
+
this.responseBody = JSON.stringify(body);
|
|
129
|
+
this.committed = true;
|
|
130
|
+
}
|
|
119
131
|
setHeader(name, value) {
|
|
120
132
|
const existingHeaderName = findHeaderName(this.headers, name) ?? name;
|
|
121
133
|
if (name.toLowerCase() === 'set-cookie') {
|
|
@@ -135,7 +147,8 @@ class MutableWebFrameworkResponse {
|
|
|
135
147
|
status: this.statusCode ?? 200
|
|
136
148
|
};
|
|
137
149
|
const responseBody = this.responseBody instanceof Uint8Array ? this.responseBody.slice().buffer : this.responseBody;
|
|
138
|
-
|
|
150
|
+
const nativeResponseBody = isResponseBodyForbidden(init.status) ? undefined : responseBody ?? '';
|
|
151
|
+
this.finalizedResponse = this.streamActive ? new Response(this.getOrCreateResponseStream().readable, init) : new Response(nativeResponseBody, init);
|
|
139
152
|
this.raw = this.finalizedResponse;
|
|
140
153
|
this.committed = true;
|
|
141
154
|
}
|
|
@@ -189,13 +202,14 @@ export function createWebRequestResponseFactory(options = {}) {
|
|
|
189
202
|
export async function dispatchWebRequest({
|
|
190
203
|
dispatcher,
|
|
191
204
|
dispatcherNotReadyMessage = 'Web adapter received a request before dispatcher binding completed.',
|
|
205
|
+
factory,
|
|
192
206
|
request,
|
|
193
207
|
...options
|
|
194
208
|
}) {
|
|
195
209
|
const frameworkResponse = await dispatchWithRequestResponseFactory({
|
|
196
210
|
dispatcher,
|
|
197
211
|
dispatcherNotReadyMessage,
|
|
198
|
-
factory: createWebRequestResponseFactory(options),
|
|
212
|
+
factory: factory ?? createWebRequestResponseFactory(options),
|
|
199
213
|
rawRequest: request,
|
|
200
214
|
rawResponse: request.signal
|
|
201
215
|
});
|
|
@@ -284,7 +298,8 @@ function createDeferredWebFrameworkRequest(request, signal, multipartOptions, ma
|
|
|
284
298
|
url: url.pathname + url.search,
|
|
285
299
|
materializeBody
|
|
286
300
|
};
|
|
287
|
-
|
|
301
|
+
const nativeRouteHandoff = consumeRawRequestNativeRouteHandoff(request);
|
|
302
|
+
return nativeRouteHandoff ? attachFrameworkRequestNativeRouteHandoff(frameworkRequest, nativeRouteHandoff) : frameworkRequest;
|
|
288
303
|
}
|
|
289
304
|
function validateWebRequestContentLength(request, maxBodySize) {
|
|
290
305
|
const contentLength = request.headers.get('content-length');
|
|
@@ -452,6 +467,9 @@ function findHeaderName(headers, name) {
|
|
|
452
467
|
function hasHeader(headers, name) {
|
|
453
468
|
return findHeaderName(headers, name) !== undefined;
|
|
454
469
|
}
|
|
470
|
+
function isResponseBodyForbidden(status) {
|
|
471
|
+
return status === 204 || status === 205 || status === 304;
|
|
472
|
+
}
|
|
455
473
|
function toResponseHeaders(headers) {
|
|
456
474
|
const responseHeaders = new Headers();
|
|
457
475
|
for (const [name, value] of Object.entries(headers)) {
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"module-graph",
|
|
10
10
|
"orchestration"
|
|
11
11
|
],
|
|
12
|
-
"version": "1.0.0-beta.
|
|
12
|
+
"version": "1.0.0-beta.6",
|
|
13
13
|
"private": false,
|
|
14
14
|
"license": "MIT",
|
|
15
15
|
"repository": {
|
|
@@ -69,8 +69,8 @@
|
|
|
69
69
|
"dependencies": {
|
|
70
70
|
"@fluojs/config": "^1.0.0-beta.3",
|
|
71
71
|
"@fluojs/core": "^1.0.0-beta.2",
|
|
72
|
-
"@fluojs/di": "^1.0.0-beta.
|
|
73
|
-
"@fluojs/http": "^1.0.0-beta.
|
|
72
|
+
"@fluojs/di": "^1.0.0-beta.5",
|
|
73
|
+
"@fluojs/http": "^1.0.0-beta.4"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
76
|
"vitest": "^3.2.4",
|