@mastra/fastify 1.3.19-alpha.3 → 1.3.19-alpha.5

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/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @mastra/fastify
2
2
 
3
+ ## 1.3.19-alpha.5
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`bae019e`](https://github.com/mastra-ai/mastra/commit/bae019ecb6694da96909f7ec7b9eb3a0a33aa887), [`33f5061`](https://github.com/mastra-ai/mastra/commit/33f5061cd1c0335020c3faae61ce96de822854fa), [`99869ec`](https://github.com/mastra-ai/mastra/commit/99869ecb1f2aa6dfcc44fa4e843e5ee0344efa64), [`d86f031`](https://github.com/mastra-ai/mastra/commit/d86f031eb6b0b2570145afafea664e59bf688962)]:
8
+ - @mastra/core@1.33.0-alpha.5
9
+ - @mastra/server@1.33.0-alpha.5
10
+
11
+ ## 1.3.19-alpha.4
12
+
13
+ ### Patch Changes
14
+
15
+ - Fixed Fastify stream cleanup and route abort signals when clients disconnect before streamed responses finish. ([#16308](https://github.com/mastra-ai/mastra/pull/16308))
16
+
17
+ - Updated dependencies [[`9f17410`](https://github.com/mastra-ai/mastra/commit/9f1741080def23d42ee50b39887a385ae316a3c6), [`c6eb39e`](https://github.com/mastra-ai/mastra/commit/c6eb39ea6dca381c6563cb240237fbe608e02f93), [`900d086`](https://github.com/mastra-ai/mastra/commit/900d086bb737b9cf2fcf68f11b0389b801a2738c), [`4c0e286`](https://github.com/mastra-ai/mastra/commit/4c0e28637c9cfb4f416549b55e97ebfa13319dfc), [`c6eb39e`](https://github.com/mastra-ai/mastra/commit/c6eb39ea6dca381c6563cb240237fbe608e02f93), [`25184ff`](https://github.com/mastra-ai/mastra/commit/25184ffaf1293ec95119426eb1a1f8d38831b96c), [`25184ff`](https://github.com/mastra-ai/mastra/commit/25184ffaf1293ec95119426eb1a1f8d38831b96c), [`aebde9c`](https://github.com/mastra-ai/mastra/commit/aebde9cfacf56592c6b6350cae721740fe090b8a)]:
18
+ - @mastra/core@1.33.0-alpha.4
19
+ - @mastra/server@1.33.0-alpha.4
20
+
3
21
  ## 1.3.19-alpha.3
4
22
 
5
23
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -306,9 +306,12 @@ function toWebRequest2(request) {
306
306
  headers
307
307
  });
308
308
  }
309
+ function isRequestAborted(rawRequest) {
310
+ return rawRequest.aborted || rawRequest.readableAborted || !rawRequest.complete;
311
+ }
309
312
  var MastraServer = class extends serverAdapter.MastraServer {
310
313
  createContextMiddleware() {
311
- return async (request, _reply) => {
314
+ return async (request, reply) => {
312
315
  let bodyRequestContext;
313
316
  let paramsRequestContext;
314
317
  if (request.method === "POST" || request.method === "PUT") {
@@ -348,14 +351,19 @@ var MastraServer = class extends serverAdapter.MastraServer {
348
351
  request.customRouteAuthConfig = this.customRouteAuthConfig;
349
352
  const controller = new AbortController();
350
353
  request.raw.on("close", () => {
351
- if (!request.raw.complete) {
354
+ if (isRequestAborted(request.raw)) {
355
+ controller.abort();
356
+ }
357
+ });
358
+ reply.raw.on("close", () => {
359
+ if (!reply.raw.writableEnded) {
352
360
  controller.abort();
353
361
  }
354
362
  });
355
363
  request.abortSignal = controller.signal;
356
364
  };
357
365
  }
358
- async stream(route, reply, result) {
366
+ async stream(route, reply, result, request) {
359
367
  const rawHeaders = reply.getHeaders();
360
368
  const existingHeaders = {};
361
369
  for (const [key, value] of Object.entries(rawHeaders)) {
@@ -381,9 +389,20 @@ var MastraServer = class extends serverAdapter.MastraServer {
381
389
  });
382
390
  const readableStream = result instanceof ReadableStream ? result : result.fullStream;
383
391
  const reader = readableStream.getReader();
384
- reply.raw.on("close", () => {
385
- void reader.cancel("request aborted");
386
- });
392
+ let readerCanceled = false;
393
+ const cancelReader = (reason) => {
394
+ if (readerCanceled) return;
395
+ readerCanceled = true;
396
+ void reader.cancel(reason);
397
+ };
398
+ const cancelReaderOnResponseClose = () => cancelReader("request aborted");
399
+ const cancelReaderOnRequestClose = () => {
400
+ if (request && isRequestAborted(request.raw)) {
401
+ cancelReader("request aborted");
402
+ }
403
+ };
404
+ reply.raw.on("close", cancelReaderOnResponseClose);
405
+ request?.raw.on("close", cancelReaderOnRequestClose);
387
406
  try {
388
407
  while (true) {
389
408
  const { done, value } = await reader.read();
@@ -405,7 +424,11 @@ var MastraServer = class extends serverAdapter.MastraServer {
405
424
  error: error instanceof Error ? { message: error.message, stack: error.stack } : error
406
425
  });
407
426
  } finally {
408
- reply.raw.end();
427
+ reply.raw.off("close", cancelReaderOnResponseClose);
428
+ request?.raw.off("close", cancelReaderOnRequestClose);
429
+ if (!reply.raw.writableEnded && !reply.raw.destroyed) {
430
+ reply.raw.end();
431
+ }
409
432
  }
410
433
  }
411
434
  async getParams(route, request) {
@@ -500,20 +523,34 @@ var MastraServer = class extends serverAdapter.MastraServer {
500
523
  if (route.responseType === "json") {
501
524
  await reply.send(result);
502
525
  } else if (route.responseType === "stream") {
503
- await this.stream(route, reply, result);
526
+ await this.stream(route, reply, result, request);
504
527
  } else if (route.responseType === "datastream-response") {
505
528
  const fetchResponse = result;
506
529
  fetchResponse.headers.forEach((value, key) => reply.header(key, value));
507
530
  reply.status(fetchResponse.status);
508
531
  if (fetchResponse.body) {
509
532
  const reader = fetchResponse.body.getReader();
533
+ let readerCanceled = false;
534
+ const cancelReader = (reason) => {
535
+ if (readerCanceled) return;
536
+ readerCanceled = true;
537
+ void reader.cancel(reason);
538
+ };
539
+ const cancelReaderOnResponseClose = () => cancelReader("request aborted");
540
+ const cancelReaderOnRequestClose = () => {
541
+ if (request && isRequestAborted(request.raw)) {
542
+ cancelReader("request aborted");
543
+ }
544
+ };
510
545
  const onResError = (err) => {
511
546
  this.mastra.getLogger()?.error("Error writing datastream response", {
512
547
  error: err instanceof Error ? { message: err.message, stack: err.stack } : err
513
548
  });
514
- void reader.cancel("response write error");
549
+ cancelReader("response write error");
515
550
  };
516
551
  reply.raw.once("error", onResError);
552
+ reply.raw.on("close", cancelReaderOnResponseClose);
553
+ request?.raw.on("close", cancelReaderOnRequestClose);
517
554
  try {
518
555
  while (true) {
519
556
  const { done, value } = await reader.read();
@@ -526,7 +563,11 @@ var MastraServer = class extends serverAdapter.MastraServer {
526
563
  });
527
564
  } finally {
528
565
  reply.raw.off("error", onResError);
529
- reply.raw.end();
566
+ reply.raw.off("close", cancelReaderOnResponseClose);
567
+ request?.raw.off("close", cancelReaderOnRequestClose);
568
+ if (!reply.raw.writableEnded && !reply.raw.destroyed) {
569
+ reply.raw.end();
570
+ }
530
571
  }
531
572
  } else {
532
573
  reply.raw.end();