@mastra/fastify 1.3.19-alpha.2 → 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 +18 -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 +9 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @mastra/fastify
|
|
2
2
|
|
|
3
|
+
## 1.3.19-alpha.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Fixed Fastify stream cleanup and route abort signals when clients disconnect before streamed responses finish. ([#16308](https://github.com/mastra-ai/mastra/pull/16308))
|
|
8
|
+
|
|
9
|
+
- 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)]:
|
|
10
|
+
- @mastra/core@1.33.0-alpha.4
|
|
11
|
+
- @mastra/server@1.33.0-alpha.4
|
|
12
|
+
|
|
13
|
+
## 1.3.19-alpha.3
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- Updated dependencies [[`087e413`](https://github.com/mastra-ai/mastra/commit/087e4133e5d6efa36619e9556c16750e4179c047), [`087e413`](https://github.com/mastra-ai/mastra/commit/087e4133e5d6efa36619e9556c16750e4179c047), [`087e413`](https://github.com/mastra-ai/mastra/commit/087e4133e5d6efa36619e9556c16750e4179c047), [`087e413`](https://github.com/mastra-ai/mastra/commit/087e4133e5d6efa36619e9556c16750e4179c047), [`0461546`](https://github.com/mastra-ai/mastra/commit/0461546755951706ca81bc24d1d31013d9d70a6d)]:
|
|
18
|
+
- @mastra/core@1.33.0-alpha.3
|
|
19
|
+
- @mastra/server@1.33.0-alpha.3
|
|
20
|
+
|
|
3
21
|
## 1.3.19-alpha.2
|
|
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,
|
|
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 (
|
|
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
|
-
|
|
385
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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();
|