@fluojs/platform-fastify 1.0.0-beta.5 → 1.0.0-beta.7
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/adapter.d.ts.map +1 -1
- package/dist/adapter.js +59 -70
- package/package.json +3 -3
package/dist/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,IAAI,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAOtE,OAAO,EAOL,KAAK,WAAW,EAChB,KAAK,UAAU,EAIf,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC5B,MAAM,cAAc,CAAC;AAOtB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/adapter.js
CHANGED
|
@@ -4,6 +4,7 @@ import fastify from 'fastify';
|
|
|
4
4
|
import { createServerBackedHttpAdapterRealtimeCapability, createErrorResponse, HttpException, InternalServerErrorException, PayloadTooLargeException } from '@fluojs/http';
|
|
5
5
|
import { attachFrameworkRequestNativeRouteHandoff, bindRawRequestNativeRouteHandoff, consumeRawRequestNativeRouteHandoff, isRoutePathNormalizationSensitive } from '@fluojs/http/internal';
|
|
6
6
|
import { createNodeShutdownSignalRegistration, defaultNodeShutdownSignals } from '@fluojs/runtime/node';
|
|
7
|
+
import { cloneHeaderValue, createDeferredFrameworkRequestShell, createMemoizedAsyncValue, createMemoizedValue, parseQueryParamsFromSearch, snapshotSimpleQueryRecord, splitRawRequestUrl } from '@fluojs/runtime/internal-node';
|
|
7
8
|
import { bootstrapHttpAdapterApplication, runHttpAdapterApplication } from '@fluojs/runtime/internal/http-adapter';
|
|
8
9
|
import { dispatchWithRequestResponseFactory } from '@fluojs/runtime/internal/request-response-factory';
|
|
9
10
|
|
|
@@ -160,6 +161,9 @@ function createFastifyRequestResponseFactory(multipartOptions, maxBodySize = DEF
|
|
|
160
161
|
createResponse(reply) {
|
|
161
162
|
return createFrameworkResponse(reply);
|
|
162
163
|
},
|
|
164
|
+
async materializeRequest(request) {
|
|
165
|
+
await materializeFrameworkRequestBody(request);
|
|
166
|
+
},
|
|
163
167
|
resolveRequestId(request) {
|
|
164
168
|
return resolveRequestIdFromHeaders(request.raw.headers);
|
|
165
169
|
},
|
|
@@ -268,11 +272,15 @@ export async function runFastifyApplication(rootModule, options) {
|
|
|
268
272
|
}, adapter);
|
|
269
273
|
}
|
|
270
274
|
function createFrameworkResponse(reply) {
|
|
275
|
+
let activeStream;
|
|
271
276
|
return {
|
|
272
277
|
committed: reply.sent,
|
|
273
278
|
headers: {},
|
|
274
279
|
raw: reply,
|
|
275
|
-
stream
|
|
280
|
+
get stream() {
|
|
281
|
+
activeStream ??= createFrameworkResponseStream(reply);
|
|
282
|
+
return activeStream;
|
|
283
|
+
},
|
|
276
284
|
redirect(status, location) {
|
|
277
285
|
this.setStatus(status);
|
|
278
286
|
this.setHeader('Location', location);
|
|
@@ -297,12 +305,11 @@ function createFrameworkResponse(reply) {
|
|
|
297
305
|
this.committed = true;
|
|
298
306
|
return;
|
|
299
307
|
}
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
reply.header('content-type', serialized.defaultContentType);
|
|
308
|
+
if (!reply.hasHeader('content-type')) {
|
|
309
|
+
reply.header('content-type', 'application/json; charset=utf-8');
|
|
303
310
|
}
|
|
304
311
|
this.committed = true;
|
|
305
|
-
await reply.send(
|
|
312
|
+
await reply.send(JSON.stringify(body));
|
|
306
313
|
},
|
|
307
314
|
setHeader(name, value) {
|
|
308
315
|
const lowerName = name.toLowerCase();
|
|
@@ -382,45 +389,57 @@ function createFrameworkResponseStream(reply) {
|
|
|
382
389
|
};
|
|
383
390
|
}
|
|
384
391
|
async function createFrameworkRequest(request, signal, multipartOptions, maxBodySize = DEFAULT_MAX_BODY_SIZE, preserveRawBody = false) {
|
|
392
|
+
return createDeferredFrameworkRequest(request, signal, multipartOptions, maxBodySize, preserveRawBody);
|
|
393
|
+
}
|
|
394
|
+
function createDeferredFrameworkRequest(request, signal, multipartOptions, maxBodySize = DEFAULT_MAX_BODY_SIZE, preserveRawBody = false) {
|
|
385
395
|
const rawUrl = request.raw.url ?? '/';
|
|
386
|
-
const
|
|
387
|
-
const
|
|
388
|
-
const
|
|
389
|
-
const
|
|
390
|
-
|
|
391
|
-
let
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
396
|
+
const urlParts = splitRawRequestUrl(rawUrl);
|
|
397
|
+
const headerSnapshot = cloneRequestHeaders(request.headers);
|
|
398
|
+
const headers = createMemoizedValue(() => normalizeHeaders(headerSnapshot));
|
|
399
|
+
const querySnapshot = snapshotSimpleQueryRecord(request.query);
|
|
400
|
+
const isMultipart = isMultipartRequestContentType(headerSnapshot['content-type']);
|
|
401
|
+
let frameworkRequest;
|
|
402
|
+
const materializeBody = createMemoizedAsyncValue(async () => {
|
|
403
|
+
let body = request.body;
|
|
404
|
+
let files;
|
|
405
|
+
if (isMultipart) {
|
|
406
|
+
const parsed = await parseMultipartRequest(request, {
|
|
407
|
+
...multipartOptions,
|
|
408
|
+
maxTotalSize: multipartOptions?.maxTotalSize ?? maxBodySize
|
|
409
|
+
});
|
|
410
|
+
body = parsed.fields;
|
|
411
|
+
files = parsed.files;
|
|
412
|
+
}
|
|
413
|
+
frameworkRequest.body = body;
|
|
414
|
+
if (files) {
|
|
415
|
+
frameworkRequest.files = files;
|
|
416
|
+
}
|
|
417
|
+
if (preserveRawBody && !isMultipart) {
|
|
418
|
+
const rawBodyValue = request.rawBody;
|
|
419
|
+
if (rawBodyValue !== undefined) {
|
|
420
|
+
frameworkRequest.rawBody = rawBodyValue;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
frameworkRequest = createDeferredFrameworkRequestShell({
|
|
425
|
+
cookieHeader: cloneHeaderValue(headerSnapshot.cookie),
|
|
426
|
+
headersFactory: headers,
|
|
427
|
+
materializeBody,
|
|
404
428
|
method: request.method,
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
429
|
+
path: urlParts.path,
|
|
430
|
+
query: querySnapshot,
|
|
431
|
+
queryFactory: () => parseQueryParamsFromSearch(urlParts.search),
|
|
408
432
|
raw: request.raw,
|
|
409
433
|
signal,
|
|
410
|
-
url:
|
|
411
|
-
};
|
|
412
|
-
if (files) {
|
|
413
|
-
frameworkRequest.files = files;
|
|
414
|
-
}
|
|
415
|
-
if (preserveRawBody && !isMultipart) {
|
|
416
|
-
const rawBodyValue = request.rawBody;
|
|
417
|
-
if (rawBodyValue !== undefined) {
|
|
418
|
-
frameworkRequest.rawBody = rawBodyValue;
|
|
419
|
-
}
|
|
420
|
-
}
|
|
434
|
+
url: urlParts.path + urlParts.search
|
|
435
|
+
});
|
|
421
436
|
const nativeRouteHandoff = consumeRawRequestNativeRouteHandoff(request.raw);
|
|
422
437
|
return nativeRouteHandoff ? attachFrameworkRequestNativeRouteHandoff(frameworkRequest, nativeRouteHandoff) : frameworkRequest;
|
|
423
438
|
}
|
|
439
|
+
async function materializeFrameworkRequestBody(request) {
|
|
440
|
+
await request.materializeBody?.();
|
|
441
|
+
delete request.materializeBody;
|
|
442
|
+
}
|
|
424
443
|
function normalizeNativeRouteParams(params) {
|
|
425
444
|
if (typeof params !== 'object' || params === null) {
|
|
426
445
|
return {};
|
|
@@ -448,7 +467,7 @@ function collectVersionSensitiveRouteKeys(descriptors) {
|
|
|
448
467
|
return new Set([...grouped.entries()].filter(([, current]) => current.count > 1 || current.hasVersioned).map(([routeKey]) => routeKey));
|
|
449
468
|
}
|
|
450
469
|
function readRequestPathFromRawUrl(rawUrl) {
|
|
451
|
-
return
|
|
470
|
+
return splitRawRequestUrl(rawUrl ?? '/').path;
|
|
452
471
|
}
|
|
453
472
|
async function parseMultipartRequest(request, options = {}) {
|
|
454
473
|
const fields = {};
|
|
@@ -543,38 +562,8 @@ function normalizeHeaders(headers) {
|
|
|
543
562
|
}
|
|
544
563
|
return normalized;
|
|
545
564
|
}
|
|
546
|
-
function
|
|
547
|
-
|
|
548
|
-
for (const [key, value] of searchParams.entries()) {
|
|
549
|
-
const current = query[key];
|
|
550
|
-
if (current === undefined) {
|
|
551
|
-
query[key] = value;
|
|
552
|
-
continue;
|
|
553
|
-
}
|
|
554
|
-
if (Array.isArray(current)) {
|
|
555
|
-
current.push(value);
|
|
556
|
-
continue;
|
|
557
|
-
}
|
|
558
|
-
query[key] = [current, value];
|
|
559
|
-
}
|
|
560
|
-
return query;
|
|
561
|
-
}
|
|
562
|
-
function parseCookieHeader(cookieHeader) {
|
|
563
|
-
if (!cookieHeader) {
|
|
564
|
-
return {};
|
|
565
|
-
}
|
|
566
|
-
return Object.fromEntries(cookieHeader.split(';').map(pair => pair.trim()).filter(Boolean).map(pair => {
|
|
567
|
-
const index = pair.indexOf('=');
|
|
568
|
-
if (index === -1) {
|
|
569
|
-
return [pair.trim(), ''];
|
|
570
|
-
}
|
|
571
|
-
const rawValue = pair.slice(index + 1).trim();
|
|
572
|
-
try {
|
|
573
|
-
return [pair.slice(0, index).trim(), decodeURIComponent(rawValue)];
|
|
574
|
-
} catch {
|
|
575
|
-
return [pair.slice(0, index).trim(), rawValue];
|
|
576
|
-
}
|
|
577
|
-
}));
|
|
565
|
+
function cloneRequestHeaders(headers) {
|
|
566
|
+
return Object.fromEntries(Object.entries(headers).map(([name, value]) => [name, cloneHeaderValue(value)]));
|
|
578
567
|
}
|
|
579
568
|
function setMultiValue(target, key, value) {
|
|
580
569
|
const existing = target[key];
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"platform",
|
|
9
9
|
"server"
|
|
10
10
|
],
|
|
11
|
-
"version": "1.0.0-beta.
|
|
11
|
+
"version": "1.0.0-beta.7",
|
|
12
12
|
"private": false,
|
|
13
13
|
"license": "MIT",
|
|
14
14
|
"repository": {
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"@fastify/multipart": "^9.2.1",
|
|
39
39
|
"fastify": "^5.8.5",
|
|
40
40
|
"fastify-raw-body": "^5.0.0",
|
|
41
|
-
"@fluojs/http": "^1.0.0-beta.
|
|
42
|
-
"@fluojs/runtime": "^1.0.0-beta.
|
|
41
|
+
"@fluojs/http": "^1.0.0-beta.5",
|
|
42
|
+
"@fluojs/runtime": "^1.0.0-beta.7"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"vitest": "^3.2.4",
|