Skip to content

Commit facfab8

Browse files
committed
docs: serialization
- Rewrite serialization.md as language-neutral SDK reference - Add TypeScript, Python, and Java examples for all sections - Remove ToC, back-links, Terminology, Key Features, Best Practices, and FAQ listicles - Add Lambda handler serialization section with Python DynamoDB footgun callout - Collapse built-in SerDes helpers into single tabbed section - Fix broken links to error-handling, callback, and map pages Closes #43, Closes #67, Closes #49
1 parent 68ebea2 commit facfab8

24 files changed

Lines changed: 689 additions & 701 deletions

docs/sdk-reference/state/serialization.md

Lines changed: 148 additions & 701 deletions
Large diffs are not rendered by default.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import java.util.Map;
2+
import software.amazon.lambda.durable.DurableCallbackFuture;
3+
import software.amazon.lambda.durable.DurableContext;
4+
import software.amazon.lambda.durable.DurableHandler;
5+
import software.amazon.lambda.durable.config.CallbackConfig;
6+
import software.amazon.lambda.durable.serde.JacksonSerDes;
7+
8+
public class CallbackConfigExample extends DurableHandler<Object, Map<String, Object>> {
9+
@Override
10+
public Map<String, Object> handleRequest(Object input, DurableContext context) {
11+
CallbackConfig config = CallbackConfig.builder()
12+
.serDes(new JacksonSerDes())
13+
.build();
14+
15+
DurableCallbackFuture<Map<String, Object>> callback =
16+
context.createCallback("await-approval", Map.class, config);
17+
18+
// Send callback.getCallbackId() to the external system here.
19+
return callback.get();
20+
}
21+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import java.util.List;
2+
import java.util.Map;
3+
import software.amazon.lambda.durable.DurableContext;
4+
import software.amazon.lambda.durable.DurableHandler;
5+
import software.amazon.lambda.durable.config.MapConfig;
6+
import software.amazon.lambda.durable.model.MapResult;
7+
import software.amazon.lambda.durable.serde.JacksonSerDes;
8+
9+
public class MapConfigExample extends DurableHandler<Object, List<Map<String, String>>> {
10+
@Override
11+
public List<Map<String, String>> handleRequest(Object input, DurableContext context) {
12+
MapConfig config = MapConfig.builder()
13+
.serDes(new JacksonSerDes())
14+
.build();
15+
16+
List<String> items = List.of("a", "b", "c");
17+
MapResult<Map<String, String>> result = context.map(
18+
"process-items",
19+
items,
20+
Map.class,
21+
(item, index, ctx) -> Map.of("id", item, "status", "done"),
22+
config
23+
);
24+
return result.succeeded();
25+
}
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import com.fasterxml.jackson.databind.ObjectMapper;
2+
import software.amazon.lambda.durable.TypeToken;
3+
import software.amazon.lambda.durable.exception.SerDesException;
4+
import software.amazon.lambda.durable.serde.SerDes;
5+
6+
public class OrderSerDes implements SerDes {
7+
private final ObjectMapper mapper = new ObjectMapper();
8+
9+
@Override
10+
public String serialize(Object value) {
11+
try {
12+
return mapper.writeValueAsString(value);
13+
} catch (Exception e) {
14+
throw new SerDesException("Serialization failed", e);
15+
}
16+
}
17+
18+
@Override
19+
public <T> T deserialize(String data, TypeToken<T> typeToken) {
20+
try {
21+
return mapper.readValue(data, mapper.getTypeFactory().constructType(typeToken.getType()));
22+
} catch (Exception e) {
23+
throw new SerDesException("Deserialization failed", e);
24+
}
25+
}
26+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import software.amazon.lambda.durable.DurableContext;
2+
import software.amazon.lambda.durable.DurableHandler;
3+
import software.amazon.lambda.durable.StepContext;
4+
import software.amazon.lambda.durable.TypeToken;
5+
import software.amazon.lambda.durable.config.StepConfig;
6+
import software.amazon.lambda.durable.exception.SerDesException;
7+
import software.amazon.lambda.durable.serde.SerDes;
8+
9+
// A pass-through SerDes stores the value as-is (already a JSON string).
10+
class PassThroughSerDes implements SerDes {
11+
@Override
12+
public String serialize(Object value) {
13+
return (String) value;
14+
}
15+
16+
@Override
17+
public <T> T deserialize(String data, TypeToken<T> typeToken) {
18+
@SuppressWarnings("unchecked")
19+
T result = (T) data;
20+
return result;
21+
}
22+
}
23+
24+
public class PassThroughSerdesExample extends DurableHandler<Object, String> {
25+
@Override
26+
public String handleRequest(Object input, DurableContext context) {
27+
StepConfig config = StepConfig.builder()
28+
.serDes(new PassThroughSerDes())
29+
.build();
30+
31+
return context.step(
32+
"fetch-raw",
33+
String.class,
34+
(StepContext ctx) -> "{\"id\":\"order-123\"}",
35+
config
36+
);
37+
}
38+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import software.amazon.lambda.durable.TypeToken;
2+
import software.amazon.lambda.durable.serde.SerDes;
3+
4+
// SerDes interface
5+
interface SerDesInterface {
6+
String serialize(Object value);
7+
8+
<T> T deserialize(String data, TypeToken<T> typeToken);
9+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import java.util.Map;
2+
import software.amazon.lambda.durable.DurableContext;
3+
import software.amazon.lambda.durable.DurableHandler;
4+
import software.amazon.lambda.durable.StepContext;
5+
import software.amazon.lambda.durable.config.StepConfig;
6+
import software.amazon.lambda.durable.serde.JacksonSerDes;
7+
8+
public class StepConfigExample extends DurableHandler<Object, Map<String, String>> {
9+
@Override
10+
public Map<String, String> handleRequest(Object input, DurableContext context) {
11+
StepConfig config = StepConfig.builder()
12+
.serDes(new JacksonSerDes())
13+
.build();
14+
15+
Map<String, String> order = context.step(
16+
"fetch-order",
17+
Map.class,
18+
(StepContext ctx) -> Map.of("id", "order-123", "total", "99.99"),
19+
config
20+
);
21+
return order;
22+
}
23+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import java.util.Map;
2+
import software.amazon.lambda.durable.DurableContext;
3+
import software.amazon.lambda.durable.DurableHandler;
4+
import software.amazon.lambda.durable.StepContext;
5+
6+
public class Walkthrough extends DurableHandler<Object, Map<String, String>> {
7+
@Override
8+
public Map<String, String> handleRequest(Object input, DurableContext context) {
9+
// No SerDes config — the SDK serializes and deserializes the result automatically.
10+
Map<String, String> order = context.step(
11+
"fetch-order",
12+
Map.class,
13+
(StepContext ctx) -> Map.of("id", "order-123", "total", "99.99")
14+
);
15+
return order;
16+
}
17+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from aws_durable_execution_sdk_python import (
2+
DurableContext,
3+
StepContext,
4+
durable_execution,
5+
durable_step,
6+
)
7+
from aws_durable_execution_sdk_python.config import StepConfig
8+
from aws_durable_execution_sdk_python.serdes import JsonSerDes, PassThroughSerDes
9+
10+
# PassThroughSerDes — stores the value as-is (must already be a string)
11+
# JsonSerDes — standard json.dumps / json.loads, no envelope format
12+
13+
14+
@durable_step
15+
def fetch_raw(ctx: StepContext) -> str:
16+
return '{"id":"order-123"}'
17+
18+
19+
@durable_execution
20+
def handler(event: dict, context: DurableContext) -> str:
21+
raw = context.step(
22+
fetch_raw(),
23+
config=StepConfig(serdes=PassThroughSerDes()),
24+
)
25+
return raw
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import json
2+
3+
from aws_durable_execution_sdk_python import (
4+
DurableContext,
5+
durable_execution,
6+
)
7+
from aws_durable_execution_sdk_python.config import CallbackConfig
8+
from aws_durable_execution_sdk_python.serdes import SerDes, SerDesContext
9+
10+
11+
class ApprovalSerDes(SerDes[dict]):
12+
def serialize(self, value: dict, ctx: SerDesContext) -> str:
13+
return json.dumps(value)
14+
15+
def deserialize(self, data: str, ctx: SerDesContext) -> dict:
16+
return json.loads(data)
17+
18+
19+
@durable_execution
20+
def handler(event: dict, context: DurableContext) -> dict:
21+
callback = context.create_callback(
22+
"await-approval",
23+
config=CallbackConfig(serdes=ApprovalSerDes()),
24+
)
25+
26+
# Send callback.callback_id to the external system here.
27+
result = callback.result()
28+
return result

0 commit comments

Comments
 (0)