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

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/index.js CHANGED
@@ -304,9 +304,12 @@ function toWebRequest2(request) {
304
304
  headers
305
305
  });
306
306
  }
307
+ function isRequestAborted(rawRequest) {
308
+ return rawRequest.aborted || rawRequest.readableAborted || !rawRequest.complete;
309
+ }
307
310
  var MastraServer = class extends MastraServer$1 {
308
311
  createContextMiddleware() {
309
- return async (request, _reply) => {
312
+ return async (request, reply) => {
310
313
  let bodyRequestContext;
311
314
  let paramsRequestContext;
312
315
  if (request.method === "POST" || request.method === "PUT") {
@@ -346,14 +349,19 @@ var MastraServer = class extends MastraServer$1 {
346
349
  request.customRouteAuthConfig = this.customRouteAuthConfig;
347
350
  const controller = new AbortController();
348
351
  request.raw.on("close", () => {
349
- if (!request.raw.complete) {
352
+ if (isRequestAborted(request.raw)) {
353
+ controller.abort();
354
+ }
355
+ });
356
+ reply.raw.on("close", () => {
357
+ if (!reply.raw.writableEnded) {
350
358
  controller.abort();
351
359
  }
352
360
  });
353
361
  request.abortSignal = controller.signal;
354
362
  };
355
363
  }
356
- async stream(route, reply, result) {
364
+ async stream(route, reply, result, request) {
357
365
  const rawHeaders = reply.getHeaders();
358
366
  const existingHeaders = {};
359
367
  for (const [key, value] of Object.entries(rawHeaders)) {
@@ -379,9 +387,20 @@ var MastraServer = class extends MastraServer$1 {
379
387
  });
380
388
  const readableStream = result instanceof ReadableStream ? result : result.fullStream;
381
389
  const reader = readableStream.getReader();
382
- reply.raw.on("close", () => {
383
- void reader.cancel("request aborted");
384
- });
390
+ let readerCanceled = false;
391
+ const cancelReader = (reason) => {
392
+ if (readerCanceled) return;
393
+ readerCanceled = true;
394
+ void reader.cancel(reason);
395
+ };
396
+ const cancelReaderOnResponseClose = () => cancelReader("request aborted");
397
+ const cancelReaderOnRequestClose = () => {
398
+ if (request && isRequestAborted(request.raw)) {
399
+ cancelReader("request aborted");
400
+ }
401
+ };
402
+ reply.raw.on("close", cancelReaderOnResponseClose);
403
+ request?.raw.on("close", cancelReaderOnRequestClose);
385
404
  try {
386
405
  while (true) {
387
406
  const { done, value } = await reader.read();
@@ -403,7 +422,11 @@ var MastraServer = class extends MastraServer$1 {
403
422
  error: error instanceof Error ? { message: error.message, stack: error.stack } : error
404
423
  });
405
424
  } finally {
406
- reply.raw.end();
425
+ reply.raw.off("close", cancelReaderOnResponseClose);
426
+ request?.raw.off("close", cancelReaderOnRequestClose);
427
+ if (!reply.raw.writableEnded && !reply.raw.destroyed) {
428
+ reply.raw.end();
429
+ }
407
430
  }
408
431
  }
409
432
  async getParams(route, request) {
@@ -498,20 +521,34 @@ var MastraServer = class extends MastraServer$1 {
498
521
  if (route.responseType === "json") {
499
522
  await reply.send(result);
500
523
  } else if (route.responseType === "stream") {
501
- await this.stream(route, reply, result);
524
+ await this.stream(route, reply, result, request);
502
525
  } else if (route.responseType === "datastream-response") {
503
526
  const fetchResponse = result;
504
527
  fetchResponse.headers.forEach((value, key) => reply.header(key, value));
505
528
  reply.status(fetchResponse.status);
506
529
  if (fetchResponse.body) {
507
530
  const reader = fetchResponse.body.getReader();
531
+ let readerCanceled = false;
532
+ const cancelReader = (reason) => {
533
+ if (readerCanceled) return;
534
+ readerCanceled = true;
535
+ void reader.cancel(reason);
536
+ };
537
+ const cancelReaderOnResponseClose = () => cancelReader("request aborted");
538
+ const cancelReaderOnRequestClose = () => {
539
+ if (request && isRequestAborted(request.raw)) {
540
+ cancelReader("request aborted");
541
+ }
542
+ };
508
543
  const onResError = (err) => {
509
544
  this.mastra.getLogger()?.error("Error writing datastream response", {
510
545
  error: err instanceof Error ? { message: err.message, stack: err.stack } : err
511
546
  });
512
- void reader.cancel("response write error");
547
+ cancelReader("response write error");
513
548
  };
514
549
  reply.raw.once("error", onResError);
550
+ reply.raw.on("close", cancelReaderOnResponseClose);
551
+ request?.raw.on("close", cancelReaderOnRequestClose);
515
552
  try {
516
553
  while (true) {
517
554
  const { done, value } = await reader.read();
@@ -524,7 +561,11 @@ var MastraServer = class extends MastraServer$1 {
524
561
  });
525
562
  } finally {
526
563
  reply.raw.off("error", onResError);
527
- reply.raw.end();
564
+ reply.raw.off("close", cancelReaderOnResponseClose);
565
+ request?.raw.off("close", cancelReaderOnRequestClose);
566
+ if (!reply.raw.writableEnded && !reply.raw.destroyed) {
567
+ reply.raw.end();
568
+ }
528
569
  }
529
570
  } else {
530
571
  reply.raw.end();