@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.
@@ -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":"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;AAuBzB,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;AAmBD;;;;;GAKG;AACH,qBAAa,6BAA8B,YAAW,sBAAsB;IAYxE,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAnBpC,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IACjD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAIrC;gBAGiB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,YAAY,oBAAM,EAClB,UAAU,oBAAK,EACf,YAAY,EAAE,kBAAkB,GAAG,SAAS,EAC5C,gBAAgB,CAAC,EAAE,gBAAgB,YAAA,EACnC,WAAW,SAAwB,EACnC,eAAe,UAAQ,EACvB,iBAAiB,SAA8B;IAUlE,SAAS,IAAI,OAAO;IAIpB,qBAAqB;IAIrB,eAAe,IAAI,mBAAmB;IAIhC,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAyBd,wBAAwB;IAiBtC,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,6BAA6B;YAMvB,eAAe;YAkBf,aAAa;CAS5B;AAgHD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,qBAA0B,EACnC,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,sBAAsB,CAYxB;AAED;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,WAAW,CAAC,CAMtB;AAED;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,WAAW,CAAC,CAQtB;AAqUD;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAgBvE"}
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: createFrameworkResponseStream(reply),
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
- const serialized = serializeResponseBody(body);
301
- if (!reply.hasHeader('content-type') && serialized.defaultContentType) {
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(serialized.payload);
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 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
- }
400
- const frameworkRequest = {
401
- body,
402
- cookies: parseCookieHeader(Array.isArray(headers.cookie) ? headers.cookie[0] : headers.cookie),
403
- headers,
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
- params: {},
406
- path: url.pathname,
407
- query: parseQueryParams(url.searchParams),
429
+ path: urlParts.path,
430
+ query: querySnapshot,
431
+ queryFactory: () => parseQueryParamsFromSearch(urlParts.search),
408
432
  raw: request.raw,
409
433
  signal,
410
- url: url.pathname + url.search
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 new URL(rawUrl ?? '/', 'http://localhost').pathname;
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 parseQueryParams(searchParams) {
547
- const query = {};
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.5",
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.4",
42
- "@fluojs/runtime": "^1.0.0-beta.5"
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",