@@ -1350,6 +1350,32 @@ protected abstract void serializeInputDocumentBody(
1350
1350
List <HttpBinding > documentBindings
1351
1351
);
1352
1352
1353
+ /**
1354
+ * Writes the code needed to serialize an event payload as a protocol-specific document.
1355
+ *
1356
+ * <p>Implementations of this method are expected to set a value to the ${@code message.body} property.
1357
+ * The value set is expected to by a JavaScript ${@code Uint8Array} type and is to be encoded as the
1358
+ * event payload.
1359
+ *
1360
+ * <p>Two parameters will be available in scope:
1361
+ * <ul>
1362
+ * <li>{@code message: <T>}: The partially constructed event message.</li>
1363
+ * <li>{@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.</li>
1364
+ * </ul>
1365
+ *
1366
+ * <p>For example:
1367
+ *
1368
+ * <pre>{@code
1369
+ * message.body = context.utf8Decoder(JSON.stringify(bodyParams));
1370
+ * }</pre>
1371
+ * @param context The generation context.
1372
+ * @param payloadShape The payload shape. Only structure and union shape is serialized as document.
1373
+ */
1374
+ protected abstract void serializeInputEventDocumentPayload (
1375
+ GenerationContext context ,
1376
+ Shape payloadShape
1377
+ );
1378
+
1353
1379
/**
1354
1380
* Writes the code needed to serialize a protocol output document.
1355
1381
*
@@ -1611,25 +1637,24 @@ private void writeEventBody(GenerationContext context, StructureShape event) {
1611
1637
TypeScriptWriter writer = context .getWriter ();
1612
1638
Model model = context .getModel ();
1613
1639
List <MemberShape > payloadMembers = event .getAllMembers ().values ().stream ()
1614
- .filter (member -> member .hasTrait (EventPayloadTrait .class )).collect (Collectors .toList ());
1615
- List <MemberShape > documentMembers = event .getAllMembers ().values ().stream ()
1616
- .filter (member -> !member .hasTrait (EventHeaderTrait .class )
1617
- && !member .hasTrait (EventPayloadTrait .class ))
1640
+ .filter (member -> member .hasTrait (EventPayloadTrait .class ))
1618
1641
.collect (Collectors .toList ());
1619
- if (!payloadMembers .isEmpty ()) {
1620
- // Write event payload if exists. There is at most 1 payload member.
1642
+ Shape payloadShape = payloadMembers .isEmpty ()
1643
+ ? event
1644
+ : model .expectShape (payloadMembers .get (0 ).getTarget ());
1645
+ if (payloadShape instanceof BlobShape || payloadShape instanceof StringShape ) {
1646
+ // Since event itself must be a structure shape, so string or blob payload member must has eventPayload
1647
+ // trait explicitly.
1621
1648
MemberShape payloadMember = payloadMembers .get (0 );
1622
- String memberName = payloadMember .getMemberName ();
1649
+ String payloadMemberName = payloadMember .getMemberName ();
1623
1650
writer .write ("message.body = $L || message.body;" ,
1624
- getInputValue (context , Location .PAYLOAD , "input." + memberName , payloadMember ,
1651
+ getInputValue (context , Location .PAYLOAD , "input." + payloadMemberName , payloadMember ,
1625
1652
model .expectShape (payloadMember .getTarget ())));
1626
- } else if (!documentMembers .isEmpty ()) {
1627
- // Write event document bindings if exist.
1628
- SymbolProvider symbolProvider = context .getSymbolProvider ();
1629
- Symbol symbol = symbolProvider .toSymbol (event );
1630
- // Use normal structure serializer instead of event serializer to serialize document body.
1631
- String serFunctionName = ProtocolGenerator .getSerFunctionName (symbol , context .getProtocolName ());
1632
- writer .write ("message.body = $L(input, context);" , serFunctionName );
1653
+ } else if (payloadShape instanceof StructureShape || payloadShape instanceof UnionShape ) {
1654
+ serializeInputEventDocumentPayload (context , payloadShape );
1655
+ } else {
1656
+ throw new CodegenException (String .format ("Unexpected shape type bound to event payload: `%s`" ,
1657
+ payloadShape .getType ()));
1633
1658
}
1634
1659
}
1635
1660
0 commit comments