Skip to content

Commit d8fd15d

Browse files
authored
feat(sdk): add user-friendly error for non-durable functions (aws#424)
1 parent e285c47 commit d8fd15d

2 files changed

Lines changed: 23 additions & 0 deletions

File tree

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,11 @@ 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 and CheckpointToken
134+
if (input.durableExecutionArn() == null || input.checkpointToken() == null) {
135+
throw new IllegalStateException(
136+
"Unexpected payload provided to start the durable execution. DurableConfig must be set in Lambda function configuration.");
137+
}
133138
var output = DurableExecutor.execute(input, context, inputType, this::handleRequest, config);
134139
outputStream.write(serDes.serialize(output).getBytes());
135140
}

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

Lines changed: 18 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,19 @@ 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 and CheckpointToken
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 =
64+
assertThrows(IllegalStateException.class, () -> handler.handleRequest(inputStream, outputStream, null));
65+
assertTrue(exception.getMessage().contains("Unexpected payload provided to start the durable execution"));
66+
}
67+
5068
// Test handler implementation
5169
private static class TestDurableHandler extends DurableHandler<String, String> {
5270
@Override

0 commit comments

Comments
 (0)