88 ERR_HTTP_HEADERS_SENT ,
99 ERR_INVALID_ARG_TYPE ,
1010 ERR_STREAM_CANNOT_PIPE ,
11+ ERR_STREAM_DESTROYED ,
1112 ERR_METHOD_NOT_IMPLEMENTED ,
1213} from 'node-internal:internal_errors' ;
1314import {
@@ -16,13 +17,16 @@ import {
1617} from 'node-internal:internal_http' ;
1718import { Writable } from 'node-internal:streams_writable' ;
1819import { EventEmitter } from 'node-internal:events' ;
19- import type { OutgoingMessage as _OutgoingMessage } from 'node:http' ;
20+ import type {
21+ OutgoingMessage as _OutgoingMessage ,
22+ OutgoingHttpHeaders ,
23+ } from 'node:http' ;
2024
2125export const kUniqueHeaders = Symbol ( 'kUniqueHeaders' ) ;
2226export const kHighWaterMark = Symbol ( 'kHighWaterMark' ) ;
2327export const kNeedDrain = Symbol ( 'kNeedDrain' ) ;
2428export const kOutHeaders = Symbol ( 'kOutHeaders' ) ;
25- export const kHeadersSent = Symbol ( 'kHeadersSent ' ) ;
29+ export const kErrored = Symbol ( 'kErrored ' ) ;
2630
2731export function parseUniqueHeadersOption (
2832 headers ?: string [ ] | null
@@ -39,11 +43,30 @@ export function parseUniqueHeadersOption(
3943}
4044
4145export class OutgoingMessage extends Writable implements _OutgoingMessage {
42- [ kHeadersSent ] : boolean = false ;
43- [ kOutHeaders ] : Record < string , Record < string , string | string [ ] > > = { } ;
46+ [ kOutHeaders ] : Record < string , { name : string ; value : string | string [ ] } > =
47+ { } ;
48+ [ kErrored ] : Error | null = null ;
49+
50+ #header: unknown ;
51+
52+ override writable = true ;
53+ override destroyed = false ;
54+ finished = false ;
55+
56+ get _header ( ) : unknown {
57+ return this . #header;
58+ }
59+
60+ set _header ( value : unknown ) {
61+ this . #header = value ;
62+ }
63+
64+ get header ( ) : unknown {
65+ return this . #header;
66+ }
4467
4568 setHeader ( name : string , value : string | string [ ] ) : this {
46- if ( this [ kHeadersSent ] ) {
69+ if ( this . headersSent ) {
4770 throw new ERR_HTTP_HEADERS_SENT ( 'set' ) ;
4871 }
4972 validateHeaderName ( name ) ;
@@ -61,7 +84,7 @@ export class OutgoingMessage extends Writable implements _OutgoingMessage {
6184 setHeaders (
6285 headers : Headers | Map < string , string | number | readonly string [ ] >
6386 ) : this {
64- if ( this [ kHeadersSent ] ) {
87+ if ( this . headersSent ) {
6588 throw new ERR_HTTP_HEADERS_SENT ( 'set' ) ;
6689 }
6790
@@ -103,7 +126,7 @@ export class OutgoingMessage extends Writable implements _OutgoingMessage {
103126 }
104127
105128 appendHeader ( name : string , value : string | string [ ] ) : this {
106- if ( this [ kHeadersSent ] ) {
129+ if ( this . headersSent ) {
107130 throw new ERR_HTTP_HEADERS_SENT ( 'append' ) ;
108131 }
109132
@@ -118,7 +141,7 @@ export class OutgoingMessage extends Writable implements _OutgoingMessage {
118141
119142 // Prepare the field for appending, if required
120143 if ( ! Array . isArray ( headers [ field ] . value ) ) {
121- headers [ field ] . value = [ headers [ field ] . value as string ] ;
144+ headers [ field ] . value = [ headers [ field ] . value ] ;
122145 }
123146
124147 const existingValues = headers [ field ] . value ;
@@ -144,7 +167,7 @@ export class OutgoingMessage extends Writable implements _OutgoingMessage {
144167 removeHeader ( name : string ) : void {
145168 validateString ( name , 'name' ) ;
146169
147- if ( this [ kHeadersSent ] ) {
170+ if ( this . headersSent ) {
148171 throw new ERR_HTTP_HEADERS_SENT ( 'remove' ) ;
149172 }
150173
@@ -165,11 +188,24 @@ export class OutgoingMessage extends Writable implements _OutgoingMessage {
165188 }
166189
167190 flushHeaders ( ) : void {
168- // Not implemented
191+ if ( ! this . _header ) {
192+ this . _implicitHeader ( ) ;
193+ }
194+
195+ // Force-flush the headers.
196+ this . _send ( '' ) ;
197+ }
198+
199+ getHeaders ( ) : OutgoingHttpHeaders {
200+ const headers : Record < string , string | string [ ] > = { } ;
201+ for ( const [ _key , entry ] of Object . entries ( this [ kOutHeaders ] ) ) {
202+ headers [ entry . name ] = entry . value ;
203+ }
204+ return headers ;
169205 }
170206
171207 get headersSent ( ) : boolean {
172- return this [ kHeadersSent ] ;
208+ return this . #header != null ;
173209 }
174210
175211 // @ts -expect-error TS2416 Unnecessary type assertion
@@ -184,4 +220,60 @@ export class OutgoingMessage extends Writable implements _OutgoingMessage {
184220 _implicitHeader ( ) : void {
185221 throw new ERR_METHOD_NOT_IMPLEMENTED ( '_implicitHeader()' ) ;
186222 }
223+
224+ _renderHeaders ( ) : Record < string , string | string [ ] > {
225+ if ( this . headersSent ) {
226+ throw new ERR_HTTP_HEADERS_SENT ( 'render' ) ;
227+ }
228+ const headers : Record < string , string | string [ ] > = { } ;
229+ for ( const [ _key , entry ] of Object . entries ( this [ kOutHeaders ] ) ) {
230+ headers [ entry . name ] = entry . value ;
231+ }
232+ return headers ;
233+ }
234+
235+ _send ( _val : unknown ) : void {
236+ // Unimplemented.
237+ }
238+
239+ override _write (
240+ _chunk : any , // eslint-disable-line @typescript-eslint/no-explicit-any
241+ _encoding : BufferEncoding ,
242+ cb : ( error ?: Error | null ) => void
243+ ) : void {
244+ // The only reason for us to override this method is to increase the Node.js test coverage.
245+ // Otherwise, we don't implement _write yet.
246+ if ( this . destroyed ) {
247+ cb ( new ERR_STREAM_DESTROYED ( '_write' ) ) ;
248+ return ;
249+ }
250+
251+ throw new ERR_METHOD_NOT_IMPLEMENTED ( '_write' ) ;
252+ }
253+
254+ override destroy ( err ?: unknown , _cb ?: ( err ?: unknown ) => void ) : this {
255+ if ( this . destroyed ) {
256+ return this ;
257+ }
258+ this . destroyed = true ;
259+ this [ kErrored ] = err as Error ;
260+
261+ return this ;
262+ }
263+
264+ // @ts -expect-error TS2611 Property accessor.
265+ get writableObjectMode ( ) : boolean {
266+ return false ;
267+ }
268+
269+ // @ts -expect-error TS2611 Property accessor.
270+ get errored ( ) : Error | null {
271+ return this [ kErrored ] ;
272+ }
273+
274+ // @ts -expect-error TS2611 Property accessor.
275+ get writableEnded ( ) : boolean {
276+ // eslint-disable-next-line @typescript-eslint/no-deprecated
277+ return this . finished ;
278+ }
187279}
0 commit comments