@@ -5,16 +5,19 @@ const http = require('http')
5
5
const https = require ( 'https' )
6
6
const { PassThrough } = require ( 'stream' )
7
7
8
+ const METADATA_HEADER_NAME = 'X-Nf-Metadata'
8
9
class StreamingResponse extends PassThrough {
9
10
statusCode = 200
10
11
11
12
/** @type {Map<string | number | readonly string[]> } */
12
13
_clientHeaders
13
14
_metadataSent = false
15
+ _sendMetadataInHeader
14
16
outgoingMessage
15
17
16
- constructor ( url , ip ) {
18
+ constructor ( url , ip , sendMetadataInHeader ) {
17
19
super ( )
20
+ this . _sendMetadataInHeader = sendMetadataInHeader
18
21
// eslint-disable-next-line node/no-unsupported-features/node-builtins
19
22
const parsedUrl = new URL ( url )
20
23
const family = 4
@@ -30,6 +33,9 @@ class StreamingResponse extends PassThrough {
30
33
}
31
34
this . outgoingMessage = parsedUrl . protocol === 'https:' ? https . request ( url , options ) : http . request ( url , options )
32
35
this . pipe ( this . outgoingMessage )
36
+ if ( sendMetadataInHeader ) {
37
+ this . outgoingMessage . setHeader ( METADATA_HEADER_NAME , this . _getMetadata ( ) )
38
+ }
33
39
}
34
40
35
41
setHeader ( name , value ) {
@@ -41,22 +47,21 @@ class StreamingResponse extends PassThrough {
41
47
}
42
48
43
49
_getMetadata ( ) {
44
- return Buffer . concat ( [
45
- Buffer . from (
46
- JSON . stringify ( {
47
- // eslint-disable-next-line node/no-unsupported-features/es-builtins
48
- headers : Object . fromEntries ( this . _clientHeaders . entries ( ) ) ,
49
- statusCode : this . statusCode ,
50
- } ) ,
51
- ) ,
52
- Uint8Array . from ( [ 0x00 ] ) ,
53
- ] )
50
+ return JSON . stringify ( {
51
+ // eslint-disable-next-line node/no-unsupported-features/es-builtins
52
+ headers : Object . fromEntries ( this . _clientHeaders . entries ( ) ) ,
53
+ statusCode : this . statusCode ,
54
+ } )
55
+ }
56
+
57
+ _getMetadataBuffer ( ) {
58
+ return Buffer . concat ( [ Buffer . from ( this . _getMetadata ( ) ) , Uint8Array . from ( [ 0x00 ] ) ] )
54
59
}
55
60
56
61
write ( data , encoding , callback ) {
57
62
console . log ( 'writing' , data )
58
- if ( ! this . _metadataSent ) {
59
- super . write ( this . _getMetadata ( ) )
63
+ if ( ! this . _metadataSent && ! this . _sendMetadataInHeader ) {
64
+ super . write ( this . _getMetadataBuffer ( ) )
60
65
// super.write(Buffer.from([0x00]))
61
66
this . _metadataSent = true
62
67
}
@@ -77,6 +82,8 @@ const wrapHandler =
77
82
( event , context , callback ) => {
78
83
console . log ( { context } )
79
84
85
+ const sendMetadataInHeader = Boolean ( event . queryStringParameters . sendMetadataInHeader )
86
+
80
87
if ( ! context . streaming ) {
81
88
return {
82
89
statusCode : 422 ,
@@ -97,7 +104,7 @@ const wrapHandler =
97
104
let res
98
105
99
106
try {
100
- res = new StreamingResponse ( callbackUrl , callbackIP )
107
+ res = new StreamingResponse ( callbackUrl , callbackIP , sendMetadataInHeader )
101
108
} catch ( error ) {
102
109
console . error ( error )
103
110
return {
0 commit comments