@fluojs/platform-fastify 1.0.0-beta.5 → 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/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +115 -37
- package/package.json +2 -2
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;AAczB,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,qBAAqB;IACpC,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,0EAA0E;AAC1E,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC5D,wEAAwE;AACxE,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,WAAW,CAAC;AAYhE;;;GAGG;AACH,MAAM,WAAW,kCAAmC,SAAQ,IAAI,CAAC,wBAAwB,EAAE,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC7H,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,4BAA6B,SAAQ,kCAAkC;IACtF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,KAAK,GAAG,SAAS,wBAAwB,EAAE,CAAC;CAC/D;AAED,UAAU,mBAAmB;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/adapter.js
CHANGED
|
@@ -160,6 +160,9 @@ function createFastifyRequestResponseFactory(multipartOptions, maxBodySize = DEF
|
|
|
160
160
|
createResponse(reply) {
|
|
161
161
|
return createFrameworkResponse(reply);
|
|
162
162
|
},
|
|
163
|
+
async materializeRequest(request) {
|
|
164
|
+
await materializeFrameworkRequestBody(request);
|
|
165
|
+
},
|
|
163
166
|
resolveRequestId(request) {
|
|
164
167
|
return resolveRequestIdFromHeaders(request.raw.headers);
|
|
165
168
|
},
|
|
@@ -268,11 +271,15 @@ export async function runFastifyApplication(rootModule, options) {
|
|
|
268
271
|
}, adapter);
|
|
269
272
|
}
|
|
270
273
|
function createFrameworkResponse(reply) {
|
|
274
|
+
let activeStream;
|
|
271
275
|
return {
|
|
272
276
|
committed: reply.sent,
|
|
273
277
|
headers: {},
|
|
274
278
|
raw: reply,
|
|
275
|
-
stream
|
|
279
|
+
get stream() {
|
|
280
|
+
activeStream ??= createFrameworkResponseStream(reply);
|
|
281
|
+
return activeStream;
|
|
282
|
+
},
|
|
276
283
|
redirect(status, location) {
|
|
277
284
|
this.setStatus(status);
|
|
278
285
|
this.setHeader('Location', location);
|
|
@@ -297,12 +304,11 @@ function createFrameworkResponse(reply) {
|
|
|
297
304
|
this.committed = true;
|
|
298
305
|
return;
|
|
299
306
|
}
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
reply.header('content-type', serialized.defaultContentType);
|
|
307
|
+
if (!reply.hasHeader('content-type')) {
|
|
308
|
+
reply.header('content-type', 'application/json; charset=utf-8');
|
|
303
309
|
}
|
|
304
310
|
this.committed = true;
|
|
305
|
-
await reply.send(
|
|
311
|
+
await reply.send(JSON.stringify(body));
|
|
306
312
|
},
|
|
307
313
|
setHeader(name, value) {
|
|
308
314
|
const lowerName = name.toLowerCase();
|
|
@@ -382,45 +388,64 @@ function createFrameworkResponseStream(reply) {
|
|
|
382
388
|
};
|
|
383
389
|
}
|
|
384
390
|
async function createFrameworkRequest(request, signal, multipartOptions, maxBodySize = DEFAULT_MAX_BODY_SIZE, preserveRawBody = false) {
|
|
391
|
+
return createDeferredFrameworkRequest(request, signal, multipartOptions, maxBodySize, preserveRawBody);
|
|
392
|
+
}
|
|
393
|
+
function createDeferredFrameworkRequest(request, signal, multipartOptions, maxBodySize = DEFAULT_MAX_BODY_SIZE, preserveRawBody = false) {
|
|
385
394
|
const rawUrl = request.raw.url ?? '/';
|
|
386
|
-
const
|
|
387
|
-
const
|
|
388
|
-
const
|
|
389
|
-
const
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
395
|
+
const urlParts = splitRawRequestUrl(rawUrl);
|
|
396
|
+
const headerSnapshot = cloneRequestHeaders(request.headers);
|
|
397
|
+
const headers = createMemoizedValue(() => normalizeHeaders(headerSnapshot));
|
|
398
|
+
const cookieHeader = cloneHeaderValue(headerSnapshot.cookie);
|
|
399
|
+
const cookies = createMemoizedValue(() => parseCookieHeader(cookieHeader));
|
|
400
|
+
const query = createMemoizedValue(() => parseQueryParamsFromSearch(urlParts.search));
|
|
401
|
+
const isMultipart = isMultipartRequestContentType(headerSnapshot['content-type']);
|
|
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
|
+
});
|
|
400
424
|
const frameworkRequest = {
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
425
|
+
get cookies() {
|
|
426
|
+
return cookies();
|
|
427
|
+
},
|
|
428
|
+
get headers() {
|
|
429
|
+
return headers();
|
|
430
|
+
},
|
|
404
431
|
method: request.method,
|
|
405
432
|
params: {},
|
|
406
|
-
path:
|
|
407
|
-
query
|
|
433
|
+
path: urlParts.path,
|
|
434
|
+
get query() {
|
|
435
|
+
return query();
|
|
436
|
+
},
|
|
408
437
|
raw: request.raw,
|
|
409
438
|
signal,
|
|
410
|
-
url:
|
|
439
|
+
url: urlParts.path + urlParts.search,
|
|
440
|
+
materializeBody
|
|
411
441
|
};
|
|
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
|
-
}
|
|
421
442
|
const nativeRouteHandoff = consumeRawRequestNativeRouteHandoff(request.raw);
|
|
422
443
|
return nativeRouteHandoff ? attachFrameworkRequestNativeRouteHandoff(frameworkRequest, nativeRouteHandoff) : frameworkRequest;
|
|
423
444
|
}
|
|
445
|
+
async function materializeFrameworkRequestBody(request) {
|
|
446
|
+
await request.materializeBody?.();
|
|
447
|
+
delete request.materializeBody;
|
|
448
|
+
}
|
|
424
449
|
function normalizeNativeRouteParams(params) {
|
|
425
450
|
if (typeof params !== 'object' || params === null) {
|
|
426
451
|
return {};
|
|
@@ -448,7 +473,7 @@ function collectVersionSensitiveRouteKeys(descriptors) {
|
|
|
448
473
|
return new Set([...grouped.entries()].filter(([, current]) => current.count > 1 || current.hasVersioned).map(([routeKey]) => routeKey));
|
|
449
474
|
}
|
|
450
475
|
function readRequestPathFromRawUrl(rawUrl) {
|
|
451
|
-
return
|
|
476
|
+
return splitRawRequestUrl(rawUrl ?? '/').path;
|
|
452
477
|
}
|
|
453
478
|
async function parseMultipartRequest(request, options = {}) {
|
|
454
479
|
const fields = {};
|
|
@@ -543,6 +568,9 @@ function normalizeHeaders(headers) {
|
|
|
543
568
|
}
|
|
544
569
|
return normalized;
|
|
545
570
|
}
|
|
571
|
+
function parseQueryParamsFromSearch(search) {
|
|
572
|
+
return parseQueryParams(new URLSearchParams(search));
|
|
573
|
+
}
|
|
546
574
|
function parseQueryParams(searchParams) {
|
|
547
575
|
const query = {};
|
|
548
576
|
for (const [key, value] of searchParams.entries()) {
|
|
@@ -560,10 +588,11 @@ function parseQueryParams(searchParams) {
|
|
|
560
588
|
return query;
|
|
561
589
|
}
|
|
562
590
|
function parseCookieHeader(cookieHeader) {
|
|
563
|
-
|
|
591
|
+
const normalizedCookieHeader = Array.isArray(cookieHeader) ? cookieHeader.join('; ') : cookieHeader;
|
|
592
|
+
if (!normalizedCookieHeader) {
|
|
564
593
|
return {};
|
|
565
594
|
}
|
|
566
|
-
return Object.fromEntries(
|
|
595
|
+
return Object.fromEntries(normalizedCookieHeader.split(';').map(pair => pair.trim()).filter(Boolean).map(pair => {
|
|
567
596
|
const index = pair.indexOf('=');
|
|
568
597
|
if (index === -1) {
|
|
569
598
|
return [pair.trim(), ''];
|
|
@@ -576,6 +605,55 @@ function parseCookieHeader(cookieHeader) {
|
|
|
576
605
|
}
|
|
577
606
|
}));
|
|
578
607
|
}
|
|
608
|
+
function createMemoizedValue(factory) {
|
|
609
|
+
let initialized = false;
|
|
610
|
+
let value;
|
|
611
|
+
return () => {
|
|
612
|
+
if (!initialized) {
|
|
613
|
+
value = factory();
|
|
614
|
+
initialized = true;
|
|
615
|
+
}
|
|
616
|
+
return value;
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
function createMemoizedAsyncValue(factory) {
|
|
620
|
+
let promise;
|
|
621
|
+
return () => {
|
|
622
|
+
promise ??= factory();
|
|
623
|
+
return promise;
|
|
624
|
+
};
|
|
625
|
+
}
|
|
626
|
+
function cloneHeaderValue(value) {
|
|
627
|
+
return Array.isArray(value) ? [...value] : value;
|
|
628
|
+
}
|
|
629
|
+
function cloneRequestHeaders(headers) {
|
|
630
|
+
return Object.fromEntries(Object.entries(headers).map(([name, value]) => [name, cloneHeaderValue(value)]));
|
|
631
|
+
}
|
|
632
|
+
function splitRawRequestUrl(rawUrl) {
|
|
633
|
+
if (rawUrl.startsWith('http://') || rawUrl.startsWith('https://')) {
|
|
634
|
+
const url = new URL(rawUrl);
|
|
635
|
+
return {
|
|
636
|
+
path: url.pathname,
|
|
637
|
+
search: url.search
|
|
638
|
+
};
|
|
639
|
+
}
|
|
640
|
+
const queryStart = rawUrl.indexOf('?');
|
|
641
|
+
const hashStart = rawUrl.indexOf('#');
|
|
642
|
+
const pathEndCandidates = [queryStart, hashStart].filter(index => index >= 0);
|
|
643
|
+
const pathEnd = pathEndCandidates.length > 0 ? Math.min(...pathEndCandidates) : rawUrl.length;
|
|
644
|
+
const path = rawUrl.slice(0, pathEnd) || '/';
|
|
645
|
+
if (queryStart === -1) {
|
|
646
|
+
return {
|
|
647
|
+
path,
|
|
648
|
+
search: ''
|
|
649
|
+
};
|
|
650
|
+
}
|
|
651
|
+
const searchEnd = hashStart >= 0 && hashStart > queryStart ? hashStart : rawUrl.length;
|
|
652
|
+
return {
|
|
653
|
+
path,
|
|
654
|
+
search: rawUrl.slice(queryStart, searchEnd)
|
|
655
|
+
};
|
|
656
|
+
}
|
|
579
657
|
function setMultiValue(target, key, value) {
|
|
580
658
|
const existing = target[key];
|
|
581
659
|
if (existing === undefined) {
|
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.6",
|
|
12
12
|
"private": false,
|
|
13
13
|
"license": "MIT",
|
|
14
14
|
"repository": {
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"fastify": "^5.8.5",
|
|
40
40
|
"fastify-raw-body": "^5.0.0",
|
|
41
41
|
"@fluojs/http": "^1.0.0-beta.4",
|
|
42
|
-
"@fluojs/runtime": "^1.0.0-beta.
|
|
42
|
+
"@fluojs/runtime": "^1.0.0-beta.6"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"vitest": "^3.2.4",
|