Open sarthak-m-das opened 1 year ago
For those curious on streaming support. https://aaronstuyvenberg.com/posts/introducing-response-streaming
Is anyone looking into this for express? I kind of assumed given the popularity this was done already. Totally willing to help if Express itself allows this?
Maybe related.
@metaskills happy to receive PRs for this. Express does support streaming response https://stackoverflow.com/a/38789462/436540
Hello, Anyone find a solution to stream content?
So I found a temporary workaround: just grab the entire payload from serverlessExpress
, wrap it in a stream and send it out via the streaming API. This gives the ability to send bigger payloads out of the lambda but obviously it somewhat defeats the purpose of streaming when the entire response is buffered first. So make sure to give enough memory to the lambda to store these buffers.
const pipeline = require('util').promisify(require('stream').pipeline);
const { Readable } = require('stream');
let serverlessExpressInstance;
const getServerlessExpress = async () => {
if (!serverlessExpressInstance) {
serverlessExpressInstance = serverlessExpress({
app,
resolutionMode: 'PROMISE',
});
}
return serverlessExpressInstance;
}
// @ts-ignore: https://github.com/aws/aws-lambda-nodejs-runtime-interface-client/issues/74
exports.handler = awslambda.streamifyResponse(async (event, responseStream, context) => {
const serverlessHandler = await getServerlessExpress();
const result = await serverlessHandler(event, context, () => { });
const metadata = {
statusCode: result.statusCode,
headers: result.headers,
cookies: result.cookies,
};
let payload;
if (result.body) {
payload = Buffer.from(result.body, result.isBase64Encoded ? 'base64' : 'utf8');
} else {
payload = Buffer.alloc(0);
}
// Assign to the responseStream parameter to prevent accidental reuse of the non-wrapped stream.
// @ts-ignore: https://github.com/aws/aws-lambda-nodejs-runtime-interface-client/issues/74
responseStream = awslambda.HttpResponseStream.from(responseStream, metadata);
await pipeline(
Readable.from(payload),
responseStream,
);
});
I have also encountered some issues when there is no payload to send, only headers. So if your expressjs
server returns status code only without any response body, you might encounter a dangling connection. This might be a bug in AWS infrastructure. More info https://github.com/aws/aws-lambda-nodejs-runtime-interface-client/issues/95
Any native support by this library for the lambda streaming response?
I am facing difficulties in streaming responses from AWS Lambda. Initially, I attempted to use the serverless-http package for this purpose, but I learned that it doesn't support streaming. Subsequently, I switched to the @vendia/serverless-express package, hoping it would resolve the issue. However, even with this package, I can still not achieve streaming functionality.
My code: