1import * as AWS from "@/AWS";
2import * as Duration from "effect/Duration";
3import * as Effect from "effect/Effect";
4import * as Layer from "effect/Layer";
5import * as Stream from "effect/Stream";
6import {
7 ServerlessResources,
8 ServerlessResourcesLive,
9} from "./serverless-resources.ts";
10
11/**
12 * Worker Lambda: consumes the jobs queue through the SQS event source and
13 * forwards each record body (prefixed) into the results queue so the test
14 * can observe delivery out-of-band.
15 */
16export class SmokeWorkerFunction extends AWS.Lambda.Function<AWS.Lambda.Function>()(
17 "SmokeWorkerFunction",
18) {}
19
20export const SmokeWorkerFunctionLive = SmokeWorkerFunction.make(
21 {
22 main: import.meta.url,
23 timeout: Duration.seconds(30),
24 },
25 Effect.gen(function* () {
26 const { jobsQueue, resultsQueue } = yield* ServerlessResources;
27 const sink = yield* AWS.SQS.QueueSink(resultsQueue);
28
29 yield* AWS.SQS.consumeQueueMessages(
30 jobsQueue,
31 { batchSize: 10 },
32 (records) =>
33 records.pipe(
34 Stream.map((record) => ({ MessageBody: `processed:${record.body}` })),
35 Stream.run(sink),
36 Effect.orDie,
37 ),
38 );
39 }).pipe(
40 Effect.provide(
41 Layer.provideMerge(
42 Layer.mergeAll(AWS.Lambda.QueueEventSource, AWS.SQS.QueueSinkHttp),
43 Layer.mergeAll(AWS.SQS.SendMessageBatchHttp, ServerlessResourcesLive),
44 ),
45 ),
46 ),
47).pipe(Layer.provideMerge(ServerlessResourcesLive));
48
49export default SmokeWorkerFunctionLive;