Skip to content

Commit 8a8c16c

Browse files
authored
Merge branch 'main' into 19-improve-default-error-messages
2 parents 4dd255d + 22c5f94 commit 8a8c16c

File tree

4 files changed

+34
-2
lines changed

4 files changed

+34
-2
lines changed

src/response/EmptyResponse.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ export class EmptyResponse<A> extends Response<A> {
1616
}
1717

1818
protected override async send(res: http.ServerResponse, req?: Request<A>): Promise<void> {
19-
if (req !== undefined)
20-
req._responseHeaders.set("content-length", "0");
19+
if (!this.headers.has("content-length"))
20+
this.headers.set("content-length", "0");
2121
this.writeHead(res, req);
2222
res.end();
2323
}

src/response/StreamedResponse.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import http from "node:http";
2+
import stream from "node:stream/promises";
3+
import {Request} from "../Request.js";
4+
import {Response} from "./Response.js";
5+
6+
/**
7+
* A response that streams data from a readable stream.
8+
*/
9+
export class StreamedResponse<A> extends Response<A> {
10+
private readonly stream: NodeJS.ReadableStream;
11+
12+
/**
13+
* Construct a StreamedResponse.
14+
* @param stream The readable stream to send in the response body.
15+
* @param [statusCode=200] The HTTP response status code to send.
16+
* @param [headers] The HTTP response headers to send.
17+
*/
18+
public constructor(stream: NodeJS.ReadableStream, statusCode = 200, headers?: HeadersInit) {
19+
super(statusCode, headers);
20+
this.stream = stream;
21+
if (!this.headers.has("transfer-encoding"))
22+
this.headers.set("transfer-encoding", "chunked");
23+
}
24+
25+
protected override async send(res: http.ServerResponse, req?: Request<A>): Promise<void> {
26+
this.writeHead(res, req);
27+
await stream.pipeline(this.stream, res);
28+
}
29+
}

src/response/TextResponse.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ export class TextResponse<A> extends BufferResponse<A> {
1919
public constructor(text: string, statusCode = 200, headers?: HeadersInit) {
2020
super(statusCode, headers);
2121
this.text = text;
22+
if (!this.headers.has("content-type"))
23+
this.headers.set("content-type", "text/plain");
2224
}
2325

2426
public override readBuffer() {

src/response/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ export * from "./BufferResponse.js";
33
export * from "./EmptyResponse.js";
44
export * from "./JsonResponse.js";
55
export * from "./Response.js";
6+
export * from "./StreamedResponse.js";
67
export * from "./TextResponse.js";
78
export * from "./ThrowableResponse.js";

0 commit comments

Comments
 (0)