Skip to content

Commit 8e4c246

Browse files
authored
feat: streaming lambda handler (#167)
* feat: add prototype implementation * chore: fix eslint config * fix: use NodeStream to convert * refactor: more effectful implementation * fix: do not wait for empty event loop when using global layer * chore: add proper dependencies and fix docgen
1 parent 192aad7 commit 8e4c246

File tree

128 files changed

+728
-525
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

128 files changed

+728
-525
lines changed

β€Ž.changeset/lemon-cows-smoke.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
---
2+
"@effect-aws/lambda": minor
3+
---
4+
5+
Implement streaming lambda handler
6+
7+
### Usage
8+
9+
```ts
10+
import { LambdaHandler, StreamHandler } from "@effect-aws/lambda"
11+
import { NodeStream } from "@effect/platform-node"
12+
import type { LambdaFunctionURLEvent } from "aws-lambda"
13+
import { Cause, Stream } from "effect"
14+
import { createGzip } from "node:zlib"
15+
16+
/**
17+
* Streaming handler that takes a Lambda Function URL event, compresses it using gzip and
18+
* returns the compressed data as a stream.
19+
*/
20+
const streamHandler: StreamHandler<
21+
LambdaFunctionURLEvent,
22+
never,
23+
Cause.UnknownException
24+
> = (event) => {
25+
return Stream.make(Buffer.from(JSON.stringify(event))).pipe(
26+
Stream.pipeThroughChannelOrFail(
27+
NodeStream.fromDuplex(
28+
() => createGzip(),
29+
(e) => new Cause.UnknownException(e)
30+
)
31+
)
32+
)
33+
}
34+
35+
export const handler = LambdaHandler.stream(streamHandler)
36+
```
37+
38+
Set the lambda function URL `InvokeMode` to `RESPONSE_STREAM`:
39+
40+
```yaml
41+
MyFunctionUrl:
42+
Type: AWS::Lambda::Url
43+
Properties:
44+
TargetFunctionArn: !Ref StreamingFunction
45+
AuthType: AWS_IAM
46+
InvokeMode: RESPONSE_STREAM
47+
```
48+
49+
deploy the stack, and then invoke the function URL:
50+
51+
```bash
52+
curl --request GET https://<url>.lambda-url.<Region>.on.aws/ --user $AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY --aws-sigv4 'aws:amz:<Region>:lambda' --output response.gz
53+
```

β€Ž.projen/deps.json

Lines changed: 2 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Ž.projenrc.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ new Vitest(project, { sharedSetupFiles: ["vitest.setup.ts"] });
4242
project.addDevDeps("vitest-mock-extended");
4343
project.addDevDeps("aws-sdk-client-mock", "aws-sdk-client-mock-vitest");
4444

45-
const effectDeps = ["effect@3.14.11"];
45+
const effectDeps = ["effect"];
4646

4747
project.addScripts({ "codegen-client": "tsx ./scripts/codegen-cli.ts" });
48-
project.addDeps(...effectDeps, "@effect/cli@0.59.11", "@effect/platform@0.80.11", "@effect/platform-node@0.76.21");
49-
project.addDevDeps("@effect/language-service", "@effect/vitest@0.20.11");
48+
project.addDeps(...effectDeps, "@effect/cli", "@effect/platform", "@effect/platform-node");
49+
project.addDevDeps("@effect/language-service", "@effect/vitest");
5050
project.tsconfigBase?.file.addOverride("compilerOptions.plugins", [
5151
{ name: "@effect/language-service" },
5252
]);
@@ -106,8 +106,8 @@ const lambda = new TypeScriptLibProject({
106106
parent: project,
107107
name: "lambda",
108108
description: "Effectful AWS Lambda handler",
109-
devDeps: [...effectDeps, "@types/aws-lambda"],
110-
peerDeps: commonPeerDeps,
109+
devDeps: [...effectDeps, "@effect/platform", "@effect/platform-node-shared", "@types/aws-lambda"],
110+
peerDeps: [...commonPeerDeps, "@effect/platform@>=0.69.25", "@effect/platform-node-shared@>=0.19.26"],
111111
addExamples: true,
112112
});
113113

@@ -162,7 +162,7 @@ new TypeScriptLibProject({
162162
parent: project,
163163
name: "s3",
164164
description: "Effectful AWS S3 functions",
165-
devDeps: [...effectDeps, "@effect/platform@0.80.11", "@aws-sdk/client-s3@^3"],
165+
devDeps: [...effectDeps, "@effect/platform", "@aws-sdk/client-s3@^3"],
166166
peerDeps: [...commonPeerDeps, "@effect/platform@>=0.69.25"],
167167
workspacePeerDeps: [s3Client],
168168
addExamples: true,
@@ -173,7 +173,7 @@ new TypeScriptLibProject({
173173
name: "http-handler",
174174
description: "Effectful AWS HTTP handler",
175175
deps: ["@smithy/types", "@smithy/protocol-http", "@smithy/querystring-builder"],
176-
devDeps: [...effectDeps, "@effect/platform@0.80.11"],
176+
devDeps: [...effectDeps, "@effect/platform"],
177177
peerDeps: [...commonPeerDeps, "@effect/platform@>=0.69.25"],
178178
workspacePeerDeps: [commons],
179179
});

β€Žeslint.config.mjs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import * as effectEslint from "@effect/eslint-plugin";
12
import { fixupPluginRules } from "@eslint/compat";
23
import { FlatCompat } from "@eslint/eslintrc";
34
import js from "@eslint/js";
@@ -25,8 +26,8 @@ export default [
2526
"eslint:recommended",
2627
"plugin:@typescript-eslint/eslint-recommended",
2728
"plugin:@typescript-eslint/recommended",
28-
"plugin:@effect/recommended",
2929
),
30+
...effectEslint.configs.dprint,
3031
{
3132
plugins: {
3233
import: fixupPluginRules(_import),

β€Žpackage.json

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-account/.projen/deps.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-account/package.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-api-gateway-management-api/.projen/deps.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-api-gateway-management-api/package.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-api-gateway-v2/.projen/deps.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-api-gateway-v2/package.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-api-gateway/.projen/deps.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-api-gateway/package.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-athena/.projen/deps.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-athena/package.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-auto-scaling/.projen/deps.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-auto-scaling/package.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-bedrock-runtime/.projen/deps.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-bedrock-runtime/package.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-bedrock/.projen/deps.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-bedrock/package.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-cloudsearch/.projen/deps.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-cloudsearch/package.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-cloudtrail/.projen/deps.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-cloudtrail/package.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-cloudwatch-events/.projen/deps.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-cloudwatch-events/package.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-cloudwatch-logs/.projen/deps.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-cloudwatch-logs/package.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-cloudwatch/.projen/deps.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackages/client-cloudwatch/package.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
Β (0)