@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/CHANGELOG.md +10 -0
- package/dist/index.cjs +51 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -10
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
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,
|
|
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 (
|
|
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
|
-
|
|
383
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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();
|