Skip to content
This repository was archived by the owner on Jun 9, 2025. It is now read-only.

Commit f55d089

Browse files
committed
feat: support sending metadata in headers
1 parent 14ffd05 commit f55d089

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

src/lib/streamer.js

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,19 @@ const http = require('http')
55
const https = require('https')
66
const { PassThrough } = require('stream')
77

8+
const METADATA_HEADER_NAME = 'X-Nf-Metadata'
89
class StreamingResponse extends PassThrough {
910
statusCode = 200
1011

1112
/** @type {Map<string | number | readonly string[]>} */
1213
_clientHeaders
1314
_metadataSent = false
15+
_sendMetadataInHeader
1416
outgoingMessage
1517

16-
constructor(url, ip) {
18+
constructor(url, ip, sendMetadataInHeader) {
1719
super()
20+
this._sendMetadataInHeader = sendMetadataInHeader
1821
// eslint-disable-next-line node/no-unsupported-features/node-builtins
1922
const parsedUrl = new URL(url)
2023
const family = 4
@@ -30,6 +33,9 @@ class StreamingResponse extends PassThrough {
3033
}
3134
this.outgoingMessage = parsedUrl.protocol === 'https:' ? https.request(url, options) : http.request(url, options)
3235
this.pipe(this.outgoingMessage)
36+
if (sendMetadataInHeader) {
37+
this.outgoingMessage.setHeader(METADATA_HEADER_NAME, this._getMetadata())
38+
}
3339
}
3440

3541
setHeader(name, value) {
@@ -41,22 +47,21 @@ class StreamingResponse extends PassThrough {
4147
}
4248

4349
_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])])
5459
}
5560

5661
write(data, encoding, callback) {
5762
console.log('writing', data)
58-
if (!this._metadataSent) {
59-
super.write(this._getMetadata())
63+
if (!this._metadataSent && !this._sendMetadataInHeader) {
64+
super.write(this._getMetadataBuffer())
6065
// super.write(Buffer.from([0x00]))
6166
this._metadataSent = true
6267
}
@@ -77,6 +82,8 @@ const wrapHandler =
7782
(event, context, callback) => {
7883
console.log({ context })
7984

85+
const sendMetadataInHeader = Boolean(event.queryStringParameters.sendMetadataInHeader)
86+
8087
if (!context.streaming) {
8188
return {
8289
statusCode: 422,
@@ -97,7 +104,7 @@ const wrapHandler =
97104
let res
98105

99106
try {
100-
res = new StreamingResponse(callbackUrl, callbackIP)
107+
res = new StreamingResponse(callbackUrl, callbackIP, sendMetadataInHeader)
101108
} catch (error) {
102109
console.error(error)
103110
return {

0 commit comments

Comments
 (0)