Skip to content

Commit d2ab272

Browse files
committed
feat(sdk): add user-friendly error for non-durable functions
1 parent 7530e2b commit d2ab272

2 files changed

Lines changed: 21 additions & 0 deletions

File tree

sdk/src/main/java/software/amazon/lambda/durable/DurableHandler.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ public final void handleRequest(InputStream inputStream, OutputStream outputStre
130130
var inputString = new String(inputStream.readAllBytes());
131131
logger.debug("Raw input from durable handler: {}", inputString);
132132
var input = serDes.deserialize(inputString, TypeToken.get(DurableExecutionInput.class));
133+
// Durable function inputs must contain DurableExecutionArn, CheckpointToken and InitialExecutionState
134+
if (input.durableExecutionArn() == null || input.checkpointToken() == null || input.initialExecutionState() == null) {
135+
throw new IllegalStateException("Function not configured for durable execution. DurableConfig must be set in Lambda function configuration.");
136+
}
133137
var output = DurableExecutor.execute(input, context, inputType, this::handleRequest, config);
134138
outputStream.write(serDes.serialize(output).getBytes());
135139
}

sdk/src/test/java/software/amazon/lambda/durable/DurableHandlerTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@
44

55
import static org.junit.jupiter.api.Assertions.assertEquals;
66
import static org.junit.jupiter.api.Assertions.assertNotNull;
7+
import static org.junit.jupiter.api.Assertions.assertThrows;
8+
import static org.junit.jupiter.api.Assertions.assertTrue;
79

10+
import java.io.ByteArrayInputStream;
11+
import java.io.ByteArrayOutputStream;
12+
import java.nio.charset.StandardCharsets;
813
import org.junit.jupiter.api.Test;
914

1015
class DurableHandlerTest {
@@ -47,6 +52,18 @@ public Object handleRequest(Object input, DurableContext context) {
4752
}
4853
}
4954

55+
@Test
56+
void testNonDurableFunctionThrowsUserFriendlyError() throws Exception {
57+
var handler = new TestDurableHandler();
58+
// Durable function inputs must contain DurableExecutionArn, CheckpointToken and InitialExecutionState
59+
var nonDurableInput = "{\"input\": \"non-durable\"}";
60+
var inputStream = new ByteArrayInputStream(nonDurableInput.getBytes(StandardCharsets.UTF_8));
61+
var outputStream = new ByteArrayOutputStream();
62+
63+
var exception = assertThrows(IllegalStateException.class, () -> handler.handleRequest(inputStream, outputStream, null));
64+
assertTrue(exception.getMessage().contains("Function not configured for durable execution"));
65+
}
66+
5067
// Test handler implementation
5168
private static class TestDurableHandler extends DurableHandler<String, String> {
5269
@Override

0 commit comments

Comments
 (0)