15
15
16
16
package software .amazon .smithy .typescript .codegen .integration ;
17
17
18
- import static software .amazon .smithy .model .knowledge .HttpBinding .Location ;
19
-
20
18
import java .nio .file .Paths ;
21
19
import java .util .Collection ;
22
20
import java .util .Collections ;
37
35
import software .amazon .smithy .codegen .core .SymbolReference ;
38
36
import software .amazon .smithy .model .Model ;
39
37
import software .amazon .smithy .model .knowledge .HttpBinding ;
38
+ import software .amazon .smithy .model .knowledge .HttpBinding .Location ;
40
39
import software .amazon .smithy .model .knowledge .HttpBindingIndex ;
41
40
import software .amazon .smithy .model .knowledge .OperationIndex ;
42
41
import software .amazon .smithy .model .knowledge .TopDownIndex ;
@@ -1584,7 +1583,8 @@ private void generateEventSerializer(GenerationContext context, StructureShape e
1584
1583
writer .openBlock ("headers: {" , "}," , () -> {
1585
1584
//fix headers required by event stream
1586
1585
writer .write ("\" :event-type\" : { type: \" string\" , value: $S }," , symbol .getName ());
1587
- writer .write ("\" :message-type\" : { type: \" string\" , value: \" event\" }" );
1586
+ writer .write ("\" :message-type\" : { type: \" string\" , value: \" event\" }," );
1587
+ writeEventContentTypeHeader (context , event );
1588
1588
});
1589
1589
writer .write ("body: new Uint8Array()" );
1590
1590
});
@@ -1594,6 +1594,31 @@ private void generateEventSerializer(GenerationContext context, StructureShape e
1594
1594
});
1595
1595
}
1596
1596
1597
+ private void writeEventContentTypeHeader (GenerationContext context , StructureShape event ) {
1598
+ TypeScriptWriter writer = context .getWriter ();
1599
+ Shape payloadShape = getEventPayloadShape (context , event );
1600
+ if (payloadShape instanceof BlobShape ) {
1601
+ writer .write ("\" :content-type\" : { type: \" string\" , value: \" application/octet-stream\" }," );
1602
+ } else if (payloadShape instanceof StringShape ) {
1603
+ writer .write ("\" :content-type\" : { type: \" string\" , value: \" text/plain\" }," );
1604
+ } else if (payloadShape instanceof StructureShape || payloadShape instanceof UnionShape ) {
1605
+ writer .write ("\" :content-type\" : { type: \" string\" , value: $S }," , getDocumentContentType ());
1606
+ } else {
1607
+ throw new CodegenException (String .format ("Unexpected shape type bound to event payload: `%s`" ,
1608
+ payloadShape .getType ()));
1609
+ }
1610
+ }
1611
+
1612
+ private Shape getEventPayloadShape (GenerationContext context , StructureShape event ) {
1613
+ Model model = context .getModel ();
1614
+ List <MemberShape > payloadMembers = event .getAllMembers ().values ().stream ()
1615
+ .filter (member -> member .hasTrait (EventPayloadTrait .class ))
1616
+ .collect (Collectors .toList ());
1617
+ return payloadMembers .isEmpty ()
1618
+ ? event // implicit payload
1619
+ : model .expectShape (payloadMembers .get (0 ).getTarget ());
1620
+ }
1621
+
1597
1622
private void writeEventHeaders (GenerationContext context , StructureShape event ) {
1598
1623
TypeScriptWriter writer = context .getWriter ();
1599
1624
Model model = context .getModel ();
@@ -1633,16 +1658,13 @@ private String getEventHeaderType(Shape shape) {
1633
1658
private void writeEventBody (GenerationContext context , StructureShape event ) {
1634
1659
TypeScriptWriter writer = context .getWriter ();
1635
1660
Model model = context .getModel ();
1636
- List <MemberShape > payloadMembers = event .getAllMembers ().values ().stream ()
1637
- .filter (member -> member .hasTrait (EventPayloadTrait .class ))
1638
- .collect (Collectors .toList ());
1639
- Shape payloadShape = payloadMembers .isEmpty ()
1640
- ? event // implicit payload
1641
- : model .expectShape (payloadMembers .get (0 ).getTarget ());
1661
+ Shape payloadShape = getEventPayloadShape (context , event );
1642
1662
if (payloadShape instanceof BlobShape || payloadShape instanceof StringShape ) {
1643
1663
// Since event itself must be a structure shape, so string or blob payload member must has eventPayload
1644
1664
// trait explicitly.
1645
- MemberShape payloadMember = payloadMembers .get (0 );
1665
+ MemberShape payloadMember = event .getAllMembers ().values ().stream ()
1666
+ .filter (member -> member .hasTrait (EventPayloadTrait .class ))
1667
+ .collect (Collectors .toList ()).get (0 );
1646
1668
String payloadMemberName = payloadMember .getMemberName ();
1647
1669
writer .write ("message.body = $L || message.body;" ,
1648
1670
getInputValue (context , Location .PAYLOAD , "input." + payloadMemberName , payloadMember ,
0 commit comments