@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.
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
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: createFrameworkResponseStream(reply),
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
- const serialized = serializeResponseBody(body);
301
- if (!reply.hasHeader('content-type') && serialized.defaultContentType) {
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(serialized.payload);
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 url = new URL(rawUrl, 'http://localhost');
387
- const headers = normalizeHeaders(request.headers);
388
- const contentType = headers['content-type'];
389
- const isMultipart = typeof contentType === 'string' && contentType.includes('multipart/form-data');
390
- let body = request.body;
391
- let files;
392
- if (isMultipart) {
393
- const parsed = await parseMultipartRequest(request, {
394
- ...multipartOptions,
395
- maxTotalSize: multipartOptions?.maxTotalSize ?? maxBodySize
396
- });
397
- body = parsed.fields;
398
- files = parsed.files;
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
- body,
402
- cookies: parseCookieHeader(Array.isArray(headers.cookie) ? headers.cookie[0] : headers.cookie),
403
- headers,
425
+ get cookies() {
426
+ return cookies();
427
+ },
428
+ get headers() {
429
+ return headers();
430
+ },
404
431
  method: request.method,
405
432
  params: {},
406
- path: url.pathname,
407
- query: parseQueryParams(url.searchParams),
433
+ path: urlParts.path,
434
+ get query() {
435
+ return query();
436
+ },
408
437
  raw: request.raw,
409
438
  signal,
410
- url: url.pathname + url.search
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 new URL(rawUrl ?? '/', 'http://localhost').pathname;
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
- if (!cookieHeader) {
591
+ const normalizedCookieHeader = Array.isArray(cookieHeader) ? cookieHeader.join('; ') : cookieHeader;
592
+ if (!normalizedCookieHeader) {
564
593
  return {};
565
594
  }
566
- return Object.fromEntries(cookieHeader.split(';').map(pair => pair.trim()).filter(Boolean).map(pair => {
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.5",
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.5"
42
+ "@fluojs/runtime": "^1.0.0-beta.6"
43
43
  },
44
44
  "devDependencies": {
45
45
  "vitest": "^3.2.4",