diff --git a/runtime/binding-grpc-kafka/src/main/java/io/aklivity/zilla/runtime/binding/grpc/kafka/internal/config/GrpcKafkaWithProduceResult.java b/runtime/binding-grpc-kafka/src/main/java/io/aklivity/zilla/runtime/binding/grpc/kafka/internal/config/GrpcKafkaWithProduceResult.java index a5ab3bbc68..dd6b47f852 100644 --- a/runtime/binding-grpc-kafka/src/main/java/io/aklivity/zilla/runtime/binding/grpc/kafka/internal/config/GrpcKafkaWithProduceResult.java +++ b/runtime/binding-grpc-kafka/src/main/java/io/aklivity/zilla/runtime/binding/grpc/kafka/internal/config/GrpcKafkaWithProduceResult.java @@ -14,10 +14,13 @@ */ package io.aklivity.zilla.runtime.binding.grpc.kafka.internal.config; +import static io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.stream.GrpcType.BASE64; + import java.util.List; import java.util.function.Supplier; import org.agrona.DirectBuffer; +import org.agrona.ExpandableDirectByteBuffer; import org.agrona.concurrent.UnsafeBuffer; import io.aklivity.zilla.runtime.binding.grpc.kafka.config.GrpcKafkaCorrelationConfig; @@ -31,9 +34,17 @@ import io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.KafkaOffsetType; import io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.OctetsFW; import io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.String16FW; +import io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.stream.GrpcMetadataFW; +import io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.stream.GrpcType; public class GrpcKafkaWithProduceResult { + public static final String META_PREFIX = "meta:"; + public static final String BIN_SUFFIX = "-bin"; + + private static final int META_PREFIX_LENGTH = META_PREFIX.length(); + private static final int BIN_SUFFIX_LENGTH = BIN_SUFFIX.length(); + private static final KafkaOffsetFW KAFKA_OFFSET_HISTORICAL = new KafkaOffsetFW.Builder() .wrap(new UnsafeBuffer(new byte[32]), 0, 32) @@ -50,10 +61,13 @@ public class GrpcKafkaWithProduceResult private final GrpcKafkaWithProduceHash hash; private final String16FW service; private final String16FW method; + private final Array32FW metadata; + private final ExpandableDirectByteBuffer nameBuffer; GrpcKafkaWithProduceResult( String16FW service, String16FW method, + Array32FW metadata, String16FW topic, KafkaAckMode acks, Supplier keyRef, @@ -64,6 +78,7 @@ public class GrpcKafkaWithProduceResult { this.service = service; this.method = method; + this.metadata = metadata; this.overrides = overrides; this.replyTo = replyTo; this.correlation = correlation; @@ -71,6 +86,8 @@ public class GrpcKafkaWithProduceResult this.acks = acks; this.keyRef = keyRef; this.hash = hash; + this.nameBuffer = new ExpandableDirectByteBuffer(); + this.nameBuffer.putStringWithoutLengthAscii(0, META_PREFIX); hash.updateHash(correlation.service.value()); hash.updateHash(service.value()); @@ -140,6 +157,27 @@ public void headers( builder.item(this::method); builder.item(this::replyTo); builder.item(this::correlationId); + metadata.forEach(m -> builder.item(i -> metadata(i, m))); + } + + private void metadata( + KafkaHeaderFW.Builder builder, + GrpcMetadataFW metadata) + { + GrpcType type = metadata.type().get(); + DirectBuffer name = metadata.name().value(); + int nameLen = META_PREFIX_LENGTH + metadata.nameLen(); + nameBuffer.putBytes(META_PREFIX_LENGTH, name, 0, name.capacity()); + if (type == BASE64) + { + nameBuffer.putStringWithoutLengthAscii(nameLen, BIN_SUFFIX); + nameLen += BIN_SUFFIX_LENGTH; + } + builder + .nameLen(nameLen) + .name(nameBuffer, 0, nameLen) + .valueLen(metadata.valueLen()) + .value(metadata.value().value(), 0, metadata.valueLen()); } private void service( diff --git a/runtime/binding-grpc-kafka/src/main/java/io/aklivity/zilla/runtime/binding/grpc/kafka/internal/config/GrpcKafkaWithResolver.java b/runtime/binding-grpc-kafka/src/main/java/io/aklivity/zilla/runtime/binding/grpc/kafka/internal/config/GrpcKafkaWithResolver.java index dd84c6acf1..156cc954db 100644 --- a/runtime/binding-grpc-kafka/src/main/java/io/aklivity/zilla/runtime/binding/grpc/kafka/internal/config/GrpcKafkaWithResolver.java +++ b/runtime/binding-grpc-kafka/src/main/java/io/aklivity/zilla/runtime/binding/grpc/kafka/internal/config/GrpcKafkaWithResolver.java @@ -169,7 +169,7 @@ public GrpcKafkaWithProduceResult resolveProduce( String16FW replyTo = new String16FW(produce.replyTo); - return new GrpcKafkaWithProduceResult(service, method, topic, acks, keyRef, overrides, replyTo, + return new GrpcKafkaWithProduceResult(service, method, metadata, topic, acks, keyRef, overrides, replyTo, options.correlation, hash); } diff --git a/runtime/binding-grpc-kafka/src/main/java/io/aklivity/zilla/runtime/binding/grpc/kafka/internal/stream/GrpcKafkaProxyFactory.java b/runtime/binding-grpc-kafka/src/main/java/io/aklivity/zilla/runtime/binding/grpc/kafka/internal/stream/GrpcKafkaProxyFactory.java index 5aa5fccb09..eb44a9cea2 100644 --- a/runtime/binding-grpc-kafka/src/main/java/io/aklivity/zilla/runtime/binding/grpc/kafka/internal/stream/GrpcKafkaProxyFactory.java +++ b/runtime/binding-grpc-kafka/src/main/java/io/aklivity/zilla/runtime/binding/grpc/kafka/internal/stream/GrpcKafkaProxyFactory.java @@ -16,8 +16,11 @@ import static io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.KafkaCapabilities.FETCH_ONLY; import static io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.KafkaCapabilities.PRODUCE_ONLY; +import static io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.stream.GrpcType.BASE64; +import static io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.stream.GrpcType.TEXT; import static java.time.Instant.now; +import java.util.Arrays; import java.util.function.LongUnaryOperator; import org.agrona.DirectBuffer; @@ -46,7 +49,9 @@ import io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.stream.GrpcAbortExFW; import io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.stream.GrpcBeginExFW; import io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.stream.GrpcDataExFW; +import io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.stream.GrpcMetadataFW; import io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.stream.GrpcResetExFW; +import io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.stream.GrpcType; import io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.stream.KafkaBeginExFW; import io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.stream.KafkaDataExFW; import io.aklivity.zilla.runtime.binding.grpc.kafka.internal.types.stream.KafkaMergedBeginExFW; @@ -64,6 +69,10 @@ public final class GrpcKafkaProxyFactory implements GrpcKafkaStreamFactory { private static final String GRPC_TYPE_NAME = "grpc"; private static final String KAFKA_TYPE_NAME = "kafka"; + private static final byte[] META_PREFIX = "meta:".getBytes(); + private static final byte[] BIN_SUFFIX = "-bin".getBytes(); + private static final int META_PREFIX_LENGTH = META_PREFIX.length; + private static final int BIN_SUFFIX_LENGTH = BIN_SUFFIX.length; private static final int DATA_FLAG_INIT = 0x02; private static final int DATA_FLAG_FIN = 0x01; @@ -73,6 +82,13 @@ public final class GrpcKafkaProxyFactory implements GrpcKafkaStreamFactory private static final String16FW HEADER_VALUE_GRPC_OK = new String16FW("0"); private static final String16FW HEADER_VALUE_GRPC_ABORTED = new String16FW("10"); private static final String16FW HEADER_VALUE_GRPC_INTERNAL_ERROR = new String16FW("13"); + private static final Array32FW EMPTY_HEADERS = + new Array32FW.Builder<>(new KafkaHeaderFW.Builder(), new KafkaHeaderFW()) + .wrap(new UnsafeBuffer(new byte[8]), 0, 8) + .build(); + + private final byte[] headerPrefix = new byte[META_PREFIX_LENGTH]; + private final byte[] headerSuffix = new byte[BIN_SUFFIX_LENGTH]; private final Varuint32FW.Builder lenRW = new Varuint32FW.Builder().wrap(new UnsafeBuffer(new byte[1024 * 8]), 0, 1024 * 8);; @@ -106,16 +122,21 @@ public final class GrpcKafkaProxyFactory implements GrpcKafkaStreamFactory private final KafkaBeginExFW kafkaBeginExRO = new KafkaBeginExFW(); private final KafkaDataExFW kafkaDataExRO = new KafkaDataExFW(); + private final GrpcBeginExFW.Builder grpcBeginExRW = new GrpcBeginExFW.Builder(); private final GrpcDataExFW.Builder grpcDataExRW = new GrpcDataExFW.Builder(); private final GrpcResetExFW.Builder grpcResetExRW = new GrpcResetExFW.Builder(); private final GrpcAbortExFW.Builder grpcAbortExRW = new GrpcAbortExFW.Builder(); + private final Array32FW.Builder grpcMetadataRW = + new Array32FW.Builder<>(new GrpcMetadataFW.Builder(), new GrpcMetadataFW()); private final KafkaBeginExFW.Builder kafkaBeginExRW = new KafkaBeginExFW.Builder(); private final KafkaDataExFW.Builder kafkaDataExRW = new KafkaDataExFW.Builder(); private final GrpcKafkaIdHelper messageFieldHelper = new GrpcKafkaIdHelper(); private final MutableDirectBuffer writeBuffer; + private final MutableDirectBuffer progressBuffer; private final MutableDirectBuffer extBuffer; + private final MutableDirectBuffer metaBuffer; private final BindingHandler streamFactory; private final LongUnaryOperator supplyInitialId; private final LongUnaryOperator supplyReplyId; @@ -130,7 +151,9 @@ public GrpcKafkaProxyFactory( EngineContext context) { this.writeBuffer = context.writeBuffer(); + this.progressBuffer = new UnsafeBuffer(new byte[context.writeBuffer().capacity()]); this.extBuffer = new UnsafeBuffer(new byte[context.writeBuffer().capacity()]); + this.metaBuffer = new UnsafeBuffer(new byte[context.writeBuffer().capacity()]); this.streamFactory = context.streamFactory(); this.supplyInitialId = context::supplyInitialId; this.supplyReplyId = context::supplyReplyId; @@ -525,13 +548,19 @@ protected void onKafkaAbort( long traceId, long authorization) { + if (!GrpcKafkaState.replyOpening(state)) + { + doGrpcBegin(traceId, authorization, 0L, emptyRO); + } + cleanup(traceId, authorization); } @Override protected void onKafkaBegin( long traceId, - long authorization, OctetsFW extension) + long authorization, + OctetsFW extension) { if (!GrpcKafkaState.replyOpening(state)) { @@ -551,6 +580,25 @@ protected void onKafkaData( int length, OctetsFW extension) { + if (!GrpcKafkaState.replyOpening(state)) + { + final ExtensionFW dataEx = extension.get(extensionRO::tryWrap); + final KafkaDataExFW kafkaDataEx = + dataEx != null && dataEx.typeId() == kafkaTypeId ? extension.get(kafkaDataExRO::tryWrap) : null; + + if (kafkaDataEx != null && + kafkaDataEx.merged() != null && + kafkaDataEx.merged().fetch() != null && + kafkaDataEx.merged().fetch().headers() != null) + { + doGrpcBegin(traceId, authorization, 0L, kafkaDataEx.merged().fetch().headers()); + } + else + { + doGrpcBegin(traceId, authorization, 0L, EMPTY_HEADERS); + } + } + doGrpcData(traceId, authorization, budgetId, reserved, flags, buffer, offset, length); } @@ -605,6 +653,50 @@ private void doGrpcBegin( traceId, authorization, affinity, extension); } + private void doGrpcBegin( + long traceId, + long authorization, + long affinity, + Array32FW headers) + { + state = GrpcKafkaState.openingReply(state); + + Array32FW.Builder builder = + grpcMetadataRW.wrap(metaBuffer, 0, metaBuffer.capacity()); + + headers.forEach(h -> + { + final OctetsFW name = h.name(); + final DirectBuffer buffer = name.buffer(); + final int offset = name.offset(); + final int limit = name.limit(); + buffer.getBytes(offset, headerPrefix); + buffer.getBytes(limit - BIN_SUFFIX.length, headerSuffix); + if (Arrays.equals(META_PREFIX, headerPrefix)) + { + final GrpcType type = Arrays.equals(BIN_SUFFIX, headerSuffix) ? BASE64 : TEXT; + final int nameLen = type == BASE64 + ? h.nameLen() - META_PREFIX_LENGTH - BIN_SUFFIX_LENGTH + : h.nameLen() - META_PREFIX_LENGTH; + builder.item(m -> m + .type(t -> t.set(type)) + .nameLen(nameLen) + .name(name.value(), META_PREFIX_LENGTH, nameLen) + .valueLen(h.valueLen()) + .value(h.value())); + } + }); + + GrpcBeginExFW beginEx = grpcBeginExRW + .wrap(extBuffer, 0, extBuffer.capacity()) + .typeId(grpcTypeId) + .metadata(builder.build()) + .build(); + + doBegin(grpc, originId, routedId, replyId, replySeq, replyAck, replyMax, + traceId, authorization, affinity, beginEx); + } + private void doGrpcData( long traceId, long authorization, @@ -847,8 +939,6 @@ private void onKafkaBegin( int lenSize = len.sizeof(); replyPad = result.fieldId().sizeof() + lenSize + partitions.sizeof(); } - - delegate.onKafkaBegin(traceId, authorization, extension); } private void onKafkaData( @@ -879,7 +969,7 @@ private void onKafkaData( final OctetsFW payload = data.payload(); final OctetsFW extension = data.extension(); - final MutableDirectBuffer encodeBuffer = writeBuffer; + final MutableDirectBuffer encodeBuffer = progressBuffer; final int encodeOffset = DataFW.FIELD_OFFSET_PAYLOAD; final int payloadSize = payload.sizeof(); @@ -921,7 +1011,7 @@ private void onKafkaData( } int length = encodeProgress - encodeOffset; - delegate.onKafkaData(traceId, authorization, budgetId, reserved, flags, + delegate.onKafkaData(traceId, authorization, budgetId, reserved + length, flags, encodeBuffer, encodeOffset, length, extension); } } @@ -1139,7 +1229,7 @@ private void onGrpcData( assert acknowledge <= sequence; assert sequence >= initialSeq; - initialSeq = sequence; + initialSeq = sequence + reserved; assert initialAck <= initialSeq; @@ -1272,17 +1362,23 @@ protected void onKafkaAbort( long traceId, long authorization) { + if (!GrpcKafkaState.replyOpening(state)) + { + doGrpcBegin(traceId, authorization, 0L, emptyRO); + } + cleanup(traceId, authorization); } @Override protected void onKafkaBegin( long traceId, - long authorization, OctetsFW extension) + long authorization, + OctetsFW extension) { if (!GrpcKafkaState.replyOpening(state)) { - doGrpcBegin(traceId, authorization, 0L, emptyRO); + doGrpcBegin(traceId, authorization, 0L, extension); } } @@ -1296,6 +1392,21 @@ protected void onKafkaData( OctetsFW payload, KafkaDataExFW kafkaDataEx) { + if (!GrpcKafkaState.replyOpening(state)) + { + if (kafkaDataEx != null && + kafkaDataEx.merged() != null && + kafkaDataEx.merged().fetch() != null && + kafkaDataEx.merged().fetch().headers() != null) + { + doGrpcBegin(traceId, authorization, 0L, kafkaDataEx.merged().fetch().headers()); + } + else + { + doGrpcBegin(traceId, authorization, 0L, EMPTY_HEADERS); + } + } + if (GrpcKafkaState.replyClosing(state)) { replySeq += reserved; @@ -1388,6 +1499,50 @@ private void doGrpcBegin( traceId, authorization, affinity, extension); } + private void doGrpcBegin( + long traceId, + long authorization, + long affinity, + Array32FW headers) + { + state = GrpcKafkaState.openingReply(state); + + Array32FW.Builder builder = + grpcMetadataRW.wrap(metaBuffer, 0, metaBuffer.capacity()); + + headers.forEach(h -> + { + final OctetsFW name = h.name(); + final DirectBuffer buffer = name.buffer(); + final int offset = name.offset(); + final int limit = name.limit(); + buffer.getBytes(offset, headerPrefix); + buffer.getBytes(limit - BIN_SUFFIX.length, headerSuffix); + if (Arrays.equals(META_PREFIX, headerPrefix)) + { + final GrpcType type = Arrays.equals(BIN_SUFFIX, headerSuffix) ? BASE64 : TEXT; + final int nameLen = type == BASE64 + ? h.nameLen() - META_PREFIX_LENGTH - BIN_SUFFIX_LENGTH + : h.nameLen() - META_PREFIX_LENGTH; + builder.item(m -> m + .type(t -> t.set(type)) + .nameLen(nameLen) + .name(name.value(), META_PREFIX_LENGTH, nameLen) + .valueLen(h.valueLen()) + .value(h.value())); + } + }); + + GrpcBeginExFW beginEx = grpcBeginExRW + .wrap(extBuffer, 0, extBuffer.capacity()) + .typeId(grpcTypeId) + .metadata(builder.build()) + .build(); + + doBegin(grpc, originId, routedId, replyId, replySeq, replyAck, replyMax, + traceId, authorization, affinity, beginEx); + } + private void doGrpcData( long traceId, long authorization, @@ -1623,8 +1778,6 @@ private void onKafkaBegin( final long sequence = begin.sequence(); final long acknowledge = begin.acknowledge(); final long traceId = begin.traceId(); - final long authorization = begin.authorization(); - final OctetsFW extension = begin.extension(); assert acknowledge <= sequence; assert sequence >= replySeq; @@ -1637,7 +1790,6 @@ private void onKafkaBegin( assert replyAck <= replySeq; doKafkaWindow(traceId); - delegate.onKafkaBegin(traceId, authorization, extension); } private void onKafkaEnd( @@ -1910,8 +2062,6 @@ private void onKafkaBegin( final long sequence = begin.sequence(); final long acknowledge = begin.acknowledge(); final long traceId = begin.traceId(); - final long authorization = begin.authorization(); - final OctetsFW extension = begin.extension(); assert acknowledge <= sequence; assert sequence >= replySeq; @@ -1923,7 +2073,6 @@ private void onKafkaBegin( assert replyAck <= replySeq; - delegate.onKafkaBegin(traceId, authorization, extension); doKafkaWindow(traceId); } diff --git a/runtime/binding-kafka-grpc/src/main/java/io/aklivity/zilla/runtime/binding/kafka/grpc/internal/config/KafkaGrpcBindingConfig.java b/runtime/binding-kafka-grpc/src/main/java/io/aklivity/zilla/runtime/binding/kafka/grpc/internal/config/KafkaGrpcBindingConfig.java index 791c449c42..e063528b74 100644 --- a/runtime/binding-kafka-grpc/src/main/java/io/aklivity/zilla/runtime/binding/kafka/grpc/internal/config/KafkaGrpcBindingConfig.java +++ b/runtime/binding-kafka-grpc/src/main/java/io/aklivity/zilla/runtime/binding/kafka/grpc/internal/config/KafkaGrpcBindingConfig.java @@ -20,6 +20,8 @@ import java.util.List; import java.util.Optional; +import org.agrona.MutableDirectBuffer; + import io.aklivity.zilla.runtime.binding.kafka.grpc.config.KafkaGrpcOptionsConfig; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.stream.KafkaGrpcFetchHeaderHelper; import io.aklivity.zilla.runtime.engine.config.BindingConfig; @@ -35,7 +37,8 @@ public final class KafkaGrpcBindingConfig public final List routes; public KafkaGrpcBindingConfig( - BindingConfig binding) + BindingConfig binding, + MutableDirectBuffer metaBuffer) { this.id = binding.id; this.entryId = binding.entryId; @@ -45,6 +48,6 @@ public KafkaGrpcBindingConfig( .orElse(DEFAULT); this.routes = binding.routes.stream().map(r -> new KafkaGrpcRouteConfig(options, r)) .collect(toList()); - this.helper = new KafkaGrpcFetchHeaderHelper(options.correlation); + this.helper = new KafkaGrpcFetchHeaderHelper(options.correlation, metaBuffer); } } diff --git a/runtime/binding-kafka-grpc/src/main/java/io/aklivity/zilla/runtime/binding/kafka/grpc/internal/stream/KafkaGrpcFetchHeaderHelper.java b/runtime/binding-kafka-grpc/src/main/java/io/aklivity/zilla/runtime/binding/kafka/grpc/internal/stream/KafkaGrpcFetchHeaderHelper.java index b09f45ef6a..f517b8a995 100644 --- a/runtime/binding-kafka-grpc/src/main/java/io/aklivity/zilla/runtime/binding/kafka/grpc/internal/stream/KafkaGrpcFetchHeaderHelper.java +++ b/runtime/binding-kafka-grpc/src/main/java/io/aklivity/zilla/runtime/binding/kafka/grpc/internal/stream/KafkaGrpcFetchHeaderHelper.java @@ -14,25 +14,44 @@ */ package io.aklivity.zilla.runtime.binding.kafka.grpc.internal.stream; +import static io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.GrpcType.BASE64; +import static io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.GrpcType.TEXT; + +import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; +import org.agrona.DirectBuffer; +import org.agrona.MutableDirectBuffer; + import io.aklivity.zilla.runtime.binding.kafka.grpc.config.KafkaGrpcCorrelationConfig; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.Array32FW; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.KafkaHeaderFW; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.KafkaOffsetFW; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.OctetsFW; +import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.GrpcMetadataFW; +import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.GrpcType; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.KafkaDataExFW; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.KafkaMergedFetchDataExFW; public final class KafkaGrpcFetchHeaderHelper { + private static final byte[] META_PREFIX = "meta:".getBytes(); + private static final byte[] BIN_SUFFIX = "-bin".getBytes(); + private static final int META_PREFIX_LENGTH = META_PREFIX.length; + private static final int BIN_SUFFIX_LENGTH = BIN_SUFFIX.length; + private final Map> visitors; private final OctetsFW serviceRO = new OctetsFW(); private final OctetsFW methodRO = new OctetsFW(); private final OctetsFW replyToRO = new OctetsFW(); private final OctetsFW correlatedIdRO = new OctetsFW(); + private final Array32FW.Builder grpcMetadataRW = + new Array32FW.Builder<>(new GrpcMetadataFW.Builder(), new GrpcMetadataFW()); + private final MutableDirectBuffer metaBuffer; + private final byte[] headerPrefix = new byte[META_PREFIX_LENGTH]; + private final byte[] headerSuffix = new byte[BIN_SUFFIX_LENGTH]; public int partitionId; public long partitionOffset; @@ -41,10 +60,15 @@ public final class KafkaGrpcFetchHeaderHelper public OctetsFW method; public OctetsFW replyTo; public OctetsFW correlationId; + public Array32FW metadata; + + private Array32FW.Builder builder; public KafkaGrpcFetchHeaderHelper( - KafkaGrpcCorrelationConfig correlation) + KafkaGrpcCorrelationConfig correlation, + MutableDirectBuffer metaBuffer) { + this.metaBuffer = metaBuffer; Map> visitors = new HashMap<>(); visitors.put(new OctetsFW().wrap(correlation.service.value(), 0, correlation.service.length()), this::visitService); @@ -65,6 +89,8 @@ public void visit( replyTo = null; correlationId = null; + builder = grpcMetadataRW.wrap(metaBuffer, 0, metaBuffer.capacity()); + if (dataEx != null) { final KafkaMergedFetchDataExFW kafkaMergedFetchDataEx = dataEx.merged().fetch(); @@ -76,6 +102,8 @@ public void visit( headers.forEach(this::dispatch); } + + metadata = grpcMetadataRW.build(); } public boolean resolved() @@ -90,11 +118,30 @@ private boolean dispatch( { final OctetsFW name = header.name(); final OctetsFW value = header.value(); + final DirectBuffer buffer = name.buffer(); + final int offset = name.offset(); + final int limit = name.limit(); + buffer.getBytes(offset, headerPrefix); + buffer.getBytes(limit - BIN_SUFFIX_LENGTH, headerSuffix); + final Consumer visitor = visitors.get(name); if (visitor != null) { visitor.accept(value); } + else if (Arrays.equals(META_PREFIX, headerPrefix)) + { + final GrpcType type = Arrays.equals(BIN_SUFFIX, headerSuffix) ? BASE64 : TEXT; + final int nameLen = type == BASE64 + ? header.nameLen() - META_PREFIX_LENGTH - BIN_SUFFIX_LENGTH + : header.nameLen() - META_PREFIX_LENGTH; + builder.item(m -> m + .type(t -> t.set(type)) + .nameLen(nameLen) + .name(name.value(), META_PREFIX_LENGTH, nameLen) + .valueLen(header.valueLen()) + .value(header.value())); + } return service != null && method != null && diff --git a/runtime/binding-kafka-grpc/src/main/java/io/aklivity/zilla/runtime/binding/kafka/grpc/internal/stream/KafkaGrpcRemoteServerFactory.java b/runtime/binding-kafka-grpc/src/main/java/io/aklivity/zilla/runtime/binding/kafka/grpc/internal/stream/KafkaGrpcRemoteServerFactory.java index 8a0b5114f6..2eb36c367a 100644 --- a/runtime/binding-kafka-grpc/src/main/java/io/aklivity/zilla/runtime/binding/kafka/grpc/internal/stream/KafkaGrpcRemoteServerFactory.java +++ b/runtime/binding-kafka-grpc/src/main/java/io/aklivity/zilla/runtime/binding/kafka/grpc/internal/stream/KafkaGrpcRemoteServerFactory.java @@ -16,6 +16,7 @@ import static io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.KafkaCapabilities.FETCH_ONLY; import static io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.KafkaCapabilities.PRODUCE_ONLY; +import static io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.GrpcType.BASE64; import static io.aklivity.zilla.runtime.engine.budget.BudgetDebitor.NO_DEBITOR_INDEX; import static io.aklivity.zilla.runtime.engine.buffer.BufferPool.NO_SLOT; import static io.aklivity.zilla.runtime.engine.concurrent.Signaler.NO_CANCEL_ID; @@ -33,6 +34,7 @@ import java.util.function.LongUnaryOperator; import org.agrona.DirectBuffer; +import org.agrona.ExpandableDirectByteBuffer; import org.agrona.MutableDirectBuffer; import org.agrona.collections.Long2ObjectHashMap; import org.agrona.collections.Object2ObjectHashMap; @@ -41,7 +43,9 @@ import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.KafkaGrpcConfiguration; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.config.KafkaGrpcBindingConfig; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.config.KafkaGrpcConditionResult; +import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.Array32FW; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.Flyweight; +import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.KafkaHeaderFW; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.OctetsFW; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.String16FW; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.queue.GrpcQueueMessageFW; @@ -54,7 +58,9 @@ import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.GrpcAbortExFW; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.GrpcBeginExFW; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.GrpcDataExFW; +import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.GrpcMetadataFW; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.GrpcResetExFW; +import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.GrpcType; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.KafkaBeginExFW; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.KafkaDataExFW; import io.aklivity.zilla.runtime.binding.kafka.grpc.internal.types.stream.KafkaFlushExFW; @@ -72,6 +78,10 @@ public final class KafkaGrpcRemoteServerFactory implements KafkaGrpcStreamFactor { private static final String GRPC_TYPE_NAME = "grpc"; private static final String KAFKA_TYPE_NAME = "kafka"; + private static final String META_PREFIX = "meta:"; + private static final String BIN_SUFFIX = "-bin"; + private static final int META_PREFIX_LENGTH = META_PREFIX.length(); + private static final int BIN_SUFFIX_LENGTH = BIN_SUFFIX.length(); private static final int SIGNAL_INITIATE_KAFKA_STREAM = 1; private static final int GRPC_QUEUE_MESSAGE_PADDING = 3 * 256 + 33; @@ -104,8 +114,10 @@ public final class KafkaGrpcRemoteServerFactory implements KafkaGrpcStreamFactor private final WindowFW.Builder windowRW = new WindowFW.Builder(); private final ResetFW.Builder resetRW = new ResetFW.Builder(); + private final GrpcBeginExFW grpcBeginExRO = new GrpcBeginExFW(); private final GrpcDataExFW grpcDataExRO = new GrpcDataExFW(); private final GrpcAbortExFW abortExRO = new GrpcAbortExFW(); + private final Array32FW metadataRO = new Array32FW<>(new GrpcMetadataFW()); private final ExtensionFW extensionRO = new ExtensionFW(); private final KafkaDataExFW kafkaDataExRO = new KafkaDataExFW(); @@ -126,6 +138,8 @@ public final class KafkaGrpcRemoteServerFactory implements KafkaGrpcStreamFactor private final BufferPool bufferPool; private final MutableDirectBuffer writeBuffer; private final MutableDirectBuffer extBuffer; + private final MutableDirectBuffer metaBuffer; + private final ExpandableDirectByteBuffer nameBuffer; private final BindingHandler streamFactory; private final LongUnaryOperator supplyInitialId; private final LongUnaryOperator supplyReplyId; @@ -150,6 +164,7 @@ public KafkaGrpcRemoteServerFactory( this.bufferPool = context.bufferPool(); this.writeBuffer = context.writeBuffer(); this.extBuffer = new UnsafeBuffer(new byte[context.writeBuffer().capacity()]); + this.metaBuffer = new UnsafeBuffer(new byte[context.writeBuffer().capacity()]); this.streamFactory = context.streamFactory(); this.supplyInitialId = context::supplyInitialId; this.supplyReplyId = context::supplyReplyId; @@ -164,6 +179,8 @@ public KafkaGrpcRemoteServerFactory( this.grpcTypeId = context.supplyTypeId(GRPC_TYPE_NAME); this.kafkaTypeId = context.supplyTypeId(KAFKA_TYPE_NAME); this.groupIdFormat = config.groupIdFormat(); + this.nameBuffer = new ExpandableDirectByteBuffer(); + this.nameBuffer.putStringWithoutLengthAscii(0, META_PREFIX); } @Override @@ -182,7 +199,7 @@ public int routedTypeId() public void attach( BindingConfig binding) { - KafkaGrpcBindingConfig newBinding = new KafkaGrpcBindingConfig(binding); + KafkaGrpcBindingConfig newBinding = new KafkaGrpcBindingConfig(binding, metaBuffer); bindings.put(binding.id, newBinding); if (activate.test(binding.id)) @@ -415,6 +432,8 @@ private void onKafkaData( deferred = kafkaDataEx.merged().fetch().deferred(); } + Array32FW metadata = helper.metadata; + if ((flags & DATA_FLAG_INIT) != 0x00 && payload != null) { if (helper.resolved()) @@ -428,11 +447,11 @@ private void onKafkaData( .set(helper.correlationId) .build(); lastCorrelationId = newCorrelationId; - grpcClient = newGrpcClient(traceId, authorization, helper.service, helper.method, + grpcClient = newGrpcClient(traceId, authorization, helper.service, helper.method, metadata, helper.replyTo, newCorrelationId); } - flushGrpcClientData(grpcClient, traceId, authorization, helper.service, helper.method, + flushGrpcClientData(grpcClient, traceId, authorization, helper.service, helper.method, metadata, helper.partitionId, helper.partitionOffset, deferred, flags, reserved, payload); } else if (helper.correlationId != null) @@ -450,7 +469,7 @@ else if (helper.correlationId != null) } else { - flushGrpcClientData(grpcClient, traceId, authorization, null, null, + flushGrpcClientData(grpcClient, traceId, authorization, helper.service, helper.method, metadata, helper.partitionId, helper.partitionOffset, deferred, flags, reserved, payload); } } @@ -463,13 +482,14 @@ private GrpcClient newGrpcClient( long authorization, OctetsFW service, OctetsFW method, + Array32FW metadata, OctetsFW replyTo, OctetsFW correlationId) { final GrpcClient grpcClient = new GrpcClient(originId, entryId, routedId, correlationId, replyTo, this); grpcClients.put(correlationId, grpcClient); - grpcClient.doGrpcBegin(traceId, authorization, 0L, service, method); + grpcClient.doGrpcBegin(traceId, authorization, 0L, service, method, metadata); return grpcClient; } @@ -491,6 +511,7 @@ private void flushGrpcMessagesIfBuffered( final OctetsFW messageCorrelationId = queueMessage.correlationId(); final OctetsFW service = queueMessage.service(); final OctetsFW method = queueMessage.method(); + final OctetsFW metadata = queueMessage.metadata(); final long messageTraceId = queueMessage.traceId(); final long messageAuthorization = queueMessage.authorization(); final int partitionId = queueMessage.partitionId(); @@ -507,9 +528,10 @@ private void flushGrpcMessagesIfBuffered( if (correlationId.equals(messageCorrelationId)) { + Array32FW meta = metadataRO.wrap(metadata.buffer(), metadata.offset(), metadata.limit()); GrpcClient grpcClient = grpcClients.get(messageCorrelationId); grpcClient = grpcClient != null ? grpcClient : - newGrpcClient(traceId, authorization, service, method, helper.replyTo, messageCorrelationId); + newGrpcClient(traceId, authorization, service, method, meta, helper.replyTo, messageCorrelationId); final int progress = grpcClient.onKafkaData(messageTraceId, messageAuthorization, partitionId, partitionOffset, deferred, flags, payload); @@ -527,7 +549,7 @@ else if (progress > 0) { final int remainingPayload = queuedMessageSize - progress; queueGrpcMessage(traceId, authorization, partitionId, partitionOffset, messageCorrelationId, - service, method, deferred, flags, reserved, payload, remainingPayload); + service, method, meta, deferred, flags, reserved, payload, remainingPayload); final int remainingMessageOffset = grpcQueueSlotOffset - progressOffset; grpcQueueBuffer.putBytes(oldProgressOffset, grpcQueueBuffer, progressOffset, remainingMessageOffset); grpcQueueSlotOffset -= queuedMessageSize; @@ -551,6 +573,7 @@ private void flushGrpcClientData( long authorization, OctetsFW service, OctetsFW method, + Array32FW metadata, int partitionId, long partitionOffset, int deferred, @@ -574,7 +597,7 @@ private void flushGrpcClientData( { flags = progress == 0 ? flags : DATA_FLAG_CON; queueGrpcMessage(traceId, authorization, partitionId, partitionOffset, - grpcClient.correlationId, service, method, deferred, flags, reserved, payload, remaining); + grpcClient.correlationId, service, method, metadata, deferred, flags, reserved, payload, remaining); } } @@ -586,6 +609,7 @@ private void queueGrpcMessage( OctetsFW correlationId, OctetsFW service, OctetsFW method, + Array32FW metadata, int deferred, int flags, int reserved, @@ -603,6 +627,7 @@ private void queueGrpcMessage( .correlationId(correlationId) .service(service) .method(method) + .metadata(metadata.buffer(), metadata.offset(), metadata.sizeof()) .traceId(traceId) .authorization(authorization) .partitionId(partitionId) @@ -1330,14 +1355,12 @@ private final class GrpcClient private BudgetDebitor initialDeb; private long initialDebIndex = NO_DEBITOR_INDEX; - private int state; private long replySeq; private long replyAck; private int replyMax; - private GrpcClient( long originId, long routedId, @@ -1408,6 +1431,7 @@ private void onGrpcBegin( final long traceId = begin.traceId(); final long authorization = begin.authorization(); final long affinity = begin.affinity(); + final OctetsFW extension = begin.extension(); assert acknowledge <= sequence; assert sequence >= replySeq; @@ -1419,6 +1443,8 @@ private void onGrpcBegin( assert replyAck <= replySeq; + extension.get(grpcBeginExRO::tryWrap); + correlater.doKafkaBegin(traceId, authorization, affinity); } @@ -1460,7 +1486,12 @@ private void onGrpcData( .timestamp(now().toEpochMilli()) .partition(p -> p.partitionId(-1).partitionOffset(-1)) .key(k -> server.condition.key(correlationId, k)) - .headers(h -> server.condition.headers(correlationId, h)))) + .headers(h -> + { + server.condition.headers(correlationId, h); + Array32FW metadata = grpcBeginExRO.metadata(); + metadata.forEach(md -> h.item(i -> metadata(i, md))); + }))) .build(); } @@ -1683,18 +1714,39 @@ private void cleanupBudgetIfNecessary() } } + private void metadata( + KafkaHeaderFW.Builder builder, + GrpcMetadataFW metadata) + { + GrpcType type = metadata.type().get(); + DirectBuffer name = metadata.name().value(); + int nameLen = META_PREFIX_LENGTH + metadata.nameLen(); + nameBuffer.putBytes(META_PREFIX_LENGTH, name, 0, name.capacity()); + if (type == BASE64) + { + nameBuffer.putStringWithoutLengthAscii(nameLen, BIN_SUFFIX); + nameLen += BIN_SUFFIX_LENGTH; + } + builder + .nameLen(nameLen) + .name(nameBuffer, 0, nameLen) + .valueLen(metadata.valueLen()) + .value(metadata.value().value(), 0, metadata.valueLen()); + } + private void doGrpcBegin( long traceId, long authorization, long affinity, OctetsFW service, - OctetsFW method) + OctetsFW method, + Array32FW metadata) { state = KafkaGrpcState.openingInitial(state); grpc = newGrpcStream(this::onGrpcMessage, originId, routedId, initialId, initialSeq, initialAck, initialMax, traceId, authorization, affinity, server.condition.scheme(), server.condition.authority(), - service, method); + service, method, metadata); } private void doGrpcData( @@ -2019,7 +2071,8 @@ private MessageConsumer newGrpcStream( String16FW scheme, String16FW authority, OctetsFW service, - OctetsFW method) + OctetsFW method, + Array32FW metadata) { final GrpcBeginExFW grpcBeginEx = grpcBeginExRW.wrap(extBuffer, 0, extBuffer.capacity()) @@ -2028,6 +2081,7 @@ private MessageConsumer newGrpcStream( .authority(authority) .service(service.buffer(), service.offset(), service.sizeof()) .method(method.buffer(), method.offset(), method.sizeof()) + .metadata(metadata) .build(); final BeginFW begin = beginRW.wrap(writeBuffer, 0, writeBuffer.capacity()) diff --git a/runtime/binding-kafka-grpc/src/main/zilla/internal.idl b/runtime/binding-kafka-grpc/src/main/zilla/internal.idl index dd32862ae4..bf25b87389 100644 --- a/runtime/binding-kafka-grpc/src/main/zilla/internal.idl +++ b/runtime/binding-kafka-grpc/src/main/zilla/internal.idl @@ -24,6 +24,8 @@ scope internal octets[serviceLength] service = null; int32 methodLength; octets[methodLength] method = null; + int32 metadataLength; + octets[metadataLength] metadata = null; int64 traceId; int64 authorization; int32 partitionId; diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/client.sent.read.abort.unary.rpc/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/client.sent.read.abort.unary.rpc/client.rpt index 6ed757bbad..87c007d8b6 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/client.sent.read.abort.unary.rpc/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/client.sent.read.abort.unary.rpc/client.rpt @@ -16,6 +16,7 @@ connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/client.sent.write.abort.unary.rpc/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/client.sent.write.abort.unary.rpc/client.rpt index e6263d2148..4b87c4bedd 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/client.sent.write.abort.unary.rpc/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/client.sent.write.abort.unary.rpc/client.rpt @@ -16,6 +16,7 @@ connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/reject.request.body.unary.rpc/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/reject.request.body.unary.rpc/client.rpt index 78c0060785..fe2e93d712 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/reject.request.body.unary.rpc/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/reject.request.body.unary.rpc/client.rpt @@ -16,6 +16,7 @@ connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/reliable.unary.rpc/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/reliable.unary.rpc/client.rpt index e24b17835e..409450f6d0 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/reliable.unary.rpc/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/reliable.unary.rpc/client.rpt @@ -16,6 +16,7 @@ connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) @@ -32,6 +33,12 @@ write flush write close +read zilla:begin.ext ${grpc:matchBeginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + read ${grpc:protobuf() .string(1, "Hello World") .bytes(32767, grpc_kafka:messageId() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/reliable.unary.rpc/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/reliable.unary.rpc/server.rpt index b67d93cef2..7972b740e6 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/reliable.unary.rpc/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/reliable.unary.rpc/server.rpt @@ -32,6 +32,12 @@ read zilla:data.empty read closed +write zilla:begin.ext ${grpc:beginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + write ${grpc:protobuf() .string(1, "Hello World") .bytes(32767, grpc_kafka:messageId() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/unreliable.unary.rpc/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/unreliable.unary.rpc/client.rpt index be3fe6ff52..8397925f18 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/unreliable.unary.rpc/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/unreliable.unary.rpc/client.rpt @@ -16,6 +16,7 @@ connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) @@ -31,6 +32,12 @@ write flush write close +read zilla:begin.ext ${grpc:matchBeginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + read ${grpc:protobuf() .string(1, "Hello World") .bytes(32767, grpc_kafka:messageId() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/unreliable.unary.rpc/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/unreliable.unary.rpc/server.rpt index c788bae4f8..395d491021 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/unreliable.unary.rpc/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/fetch/unreliable.unary.rpc/server.rpt @@ -31,6 +31,12 @@ read zilla:data.empty read closed +write zilla:begin.ext ${grpc:beginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + write ${grpc:protobuf() .string(1, "Hello World") .bytes(32767, grpc_kafka:messageId() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc.write.abort/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc.write.abort/client.rpt index ea5baa610b..5a58bcbf4c 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc.write.abort/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc.write.abort/client.rpt @@ -16,6 +16,7 @@ connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) @@ -33,11 +34,17 @@ write ${grpc:protobuf() .build()} write flush +read zilla:begin.ext ${grpc:matchBeginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .build()} read ${grpc:protobuf() .string(1, "Hello World1") .build()} +read notify DATA_RECEIVED + read zilla:reset.ext ${grpc:resetEx() .typeId(zilla:id("grpc")) .status("13") diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc.write.abort/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc.write.abort/server.rpt index 5419111648..bf5f00379d 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc.write.abort/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc.write.abort/server.rpt @@ -33,6 +33,10 @@ read ${grpc:protobuf() .string(1, "Hello World1") .build()} +write zilla:begin.ext ${grpc:beginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .build()} write ${grpc:protobuf() .string(1, "Hello World1") diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc/client.rpt index 3a5aa74d54..b37d938ff7 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc/client.rpt @@ -16,6 +16,7 @@ connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) @@ -23,7 +24,7 @@ write zilla:begin.ext ${grpc:beginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoBidiStream") - .metadata("custom", "test") + .metadataBase64("custom", "dGVzdA==") .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build()} connected @@ -38,6 +39,12 @@ write ${grpc:protobuf() .build()} write flush +read zilla:begin.ext ${grpc:matchBeginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + read ${grpc:protobuf() .string(1, "Hello World1") .build()} diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc/server.rpt index 72d1d3cdf5..90355cddda 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/bidi.stream.rpc/server.rpt @@ -24,7 +24,7 @@ read zilla:begin.ext ${grpc:matchBeginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoBidiStream") - .metadata("custom", "test") + .metadataBase64("custom", "dGVzdA==") .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build()} connected @@ -37,6 +37,12 @@ read ${grpc:protobuf() .string(1, "Hello World2") .build()} +write zilla:begin.ext ${grpc:beginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + write ${grpc:protobuf() .string(1, "Hello World1") .build()} diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/client.stream.rpc.write.abort/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/client.stream.rpc.write.abort/client.rpt index 4494bb5b59..8146acfe15 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/client.stream.rpc.write.abort/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/client.stream.rpc.write.abort/client.rpt @@ -16,6 +16,7 @@ connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/client.stream.rpc/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/client.stream.rpc/client.rpt index 4e05a7c568..a959a8b036 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/client.stream.rpc/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/client.stream.rpc/client.rpt @@ -16,6 +16,7 @@ connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) @@ -23,7 +24,7 @@ write zilla:begin.ext ${grpc:beginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoClientStream") - .metadata("custom", "test") + .metadataBase64("custom", "dGVzdA==") .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build()} connected @@ -40,6 +41,12 @@ write flush write close +read zilla:begin.ext ${grpc:matchBeginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + read ${grpc:protobuf() .string(1, "Hello World") .build()} diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/client.stream.rpc/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/client.stream.rpc/server.rpt index 22048338e9..b19e659496 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/client.stream.rpc/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/client.stream.rpc/server.rpt @@ -24,7 +24,7 @@ read zilla:begin.ext ${grpc:matchBeginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoClientStream") - .metadata("custom", "test") + .metadataBase64("custom", "dGVzdA==") .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build()} connected @@ -39,6 +39,12 @@ read ${grpc:protobuf() read closed +write zilla:begin.ext ${grpc:beginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + write ${grpc:protobuf() .string(1, "Hello World") .build()} diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/server.stream.rpc.read.aborted/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/server.stream.rpc.read.aborted/client.rpt index 6341916260..6a65a247fb 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/server.stream.rpc.read.aborted/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/server.stream.rpc.read.aborted/client.rpt @@ -16,6 +16,7 @@ connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/server.stream.rpc/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/server.stream.rpc/client.rpt index a570d1a3b2..473b43f5c9 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/server.stream.rpc/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/server.stream.rpc/client.rpt @@ -16,6 +16,7 @@ connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) @@ -23,7 +24,7 @@ write zilla:begin.ext ${grpc:beginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoServerStream") - .metadata("custom", "test") + .metadataBase64("custom", "dGVzdA==") .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build()} @@ -36,6 +37,12 @@ write flush write close +read zilla:begin.ext ${grpc:matchBeginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + read ${grpc:protobuf() .string(1, "Hello World1") .build()} diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/server.stream.rpc/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/server.stream.rpc/server.rpt index 8758f82dee..108abbabd5 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/server.stream.rpc/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/server.stream.rpc/server.rpt @@ -24,7 +24,7 @@ read zilla:begin.ext ${grpc:matchBeginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoServerStream") - .metadata("custom", "test") + .metadataBase64("custom", "dGVzdA==") .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build()} connected @@ -35,6 +35,12 @@ read ${grpc:protobuf() read closed +write zilla:begin.ext ${grpc:beginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + write ${grpc:protobuf() .string(1, "Hello World1") .build()} diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.error/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.error/client.rpt index dfc9f9f631..5b6c8329bd 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.error/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.error/client.rpt @@ -16,6 +16,7 @@ connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.message.value.100k/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.message.value.100k/client.rpt index f8d64c29be..a71806eda3 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.message.value.100k/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.message.value.100k/client.rpt @@ -18,6 +18,7 @@ property string100k ${core:randomString(102400)} connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) @@ -42,6 +43,11 @@ write flush write close +read zilla:begin.ext ${grpc:matchBeginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .build()} + read zilla:data.ext ${grpc:dataEx() .typeId(zilla:id("grpc")) .deferred(94217) diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.message.value.100k/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.message.value.100k/server.rpt index b91f68a5a2..0c4d775cc0 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.message.value.100k/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.message.value.100k/server.rpt @@ -39,6 +39,13 @@ read ${grpc:protobuf() read closed +write zilla:begin.ext ${grpc:beginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .build()} + +write flush + write zilla:data.ext ${grpc:dataEx() .typeId(zilla:id("grpc")) .deferred(94217) diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.rejected/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.rejected/client.rpt index 5efc8097d0..ce806ae3ca 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.rejected/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.rejected/client.rpt @@ -16,6 +16,7 @@ connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.sent.write.abort/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.sent.write.abort/client.rpt index e1cdc161c4..8bd042680f 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.sent.write.abort/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc.sent.write.abort/client.rpt @@ -16,6 +16,7 @@ connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc/client.rpt index 47922b4509..5cfe61ef71 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc/client.rpt @@ -16,6 +16,7 @@ connect "zilla://streams/grpc0" option zilla:window 8192 option zilla:transmission "half-duplex" + option zilla:update "proactive" write zilla:begin.ext ${grpc:beginEx() .typeId(zilla:id("grpc")) @@ -23,7 +24,7 @@ write zilla:begin.ext ${grpc:beginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoUnary") - .metadata("custom", "test") + .metadataBase64("custom", "dGVzdA==") .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build()} connected @@ -35,6 +36,12 @@ write flush write close +read zilla:begin.ext ${grpc:matchBeginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + read ${grpc:protobuf() .string(1, "Hello World") .build()} diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc/server.rpt index 310ef438f8..aa3ab812e6 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/grpc/produce/unary.rpc/server.rpt @@ -24,7 +24,7 @@ read zilla:begin.ext ${grpc:matchBeginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoUnary") - .metadata("custom", "test") + .metadataBase64("custom", "dGVzdA==") .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build()} connected @@ -35,6 +35,12 @@ read ${grpc:protobuf() read closed +write zilla:begin.ext ${grpc:beginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + write ${grpc:protobuf() .string(1, "Hello World") .build()} diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/reliable.unary.rpc/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/reliable.unary.rpc/client.rpt index 28d30e4817..bb6d038f00 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/reliable.unary.rpc/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/reliable.unary.rpc/client.rpt @@ -51,6 +51,8 @@ read zilla:data.ext ${kafka:matchDataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} read ${grpc:protobuf() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/reliable.unary.rpc/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/reliable.unary.rpc/server.rpt index 8d6b0bee95..32e2767c5e 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/reliable.unary.rpc/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/reliable.unary.rpc/server.rpt @@ -54,6 +54,8 @@ write zilla:data.ext ${kafka:dataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/unreliable.unary.rpc/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/unreliable.unary.rpc/client.rpt index 06175c7086..c6df09dca7 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/unreliable.unary.rpc/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/unreliable.unary.rpc/client.rpt @@ -51,6 +51,8 @@ read zilla:data.ext ${kafka:matchDataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} read ${grpc:protobuf() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/unreliable.unary.rpc/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/unreliable.unary.rpc/server.rpt index 766dc240c3..85feb51170 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/unreliable.unary.rpc/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/fetch/unreliable.unary.rpc/server.rpt @@ -53,6 +53,8 @@ write zilla:data.ext ${kafka:dataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc.write.abort/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc.write.abort/client.rpt index 13097e848b..b2f902879e 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc.write.abort/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc.write.abort/client.rpt @@ -41,6 +41,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoBidiStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-14f43bae85c2ce394c9bd81ff6fa9d77") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} write ${grpc:protobuf() @@ -60,6 +62,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoBidiStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-14f43bae85c2ce394c9bd81ff6fa9d77") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} @@ -97,12 +101,15 @@ read zilla:data.ext ${kafka:matchDataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") .build() .build()} read ${grpc:protobuf() .string(1, "Hello World1") .build()} +read notify DATA_RECEIVED + read aborted write abort diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc.write.abort/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc.write.abort/server.rpt index bd89e7610f..211298efee 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc.write.abort/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc.write.abort/server.rpt @@ -43,6 +43,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoBidiStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-14f43bae85c2ce394c9bd81ff6fa9d77") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read ${grpc:protobuf() @@ -61,6 +63,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoBidiStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-14f43bae85c2ce394c9bd81ff6fa9d77") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read zilla:data.null @@ -92,6 +96,7 @@ write zilla:data.ext ${kafka:dataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") .build() .build()} write ${grpc:protobuf() @@ -99,6 +104,8 @@ write ${grpc:protobuf() .build()} write flush +write await DATA_RECEIVED + write abort read aborted diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc/client.rpt index 089e230868..37eddfa123 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc/client.rpt @@ -41,6 +41,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoBidiStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-14f43bae85c2ce394c9bd81ff6fa9d77") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} write ${grpc:protobuf() @@ -60,6 +62,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoBidiStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-14f43bae85c2ce394c9bd81ff6fa9d77") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} write ${grpc:protobuf() @@ -81,6 +85,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoBidiStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-14f43bae85c2ce394c9bd81ff6fa9d77") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} @@ -116,6 +122,8 @@ read zilla:data.ext ${kafka:matchDataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} read ${grpc:protobuf() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc/server.rpt index 96ed317970..ea7d670785 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/bidi.stream.rpc/server.rpt @@ -43,6 +43,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoBidiStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-14f43bae85c2ce394c9bd81ff6fa9d77") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read ${grpc:protobuf() @@ -61,6 +63,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoBidiStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-14f43bae85c2ce394c9bd81ff6fa9d77") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read ${grpc:protobuf() @@ -79,6 +83,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoBidiStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-14f43bae85c2ce394c9bd81ff6fa9d77") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read zilla:data.null @@ -111,6 +117,8 @@ write zilla:data.ext ${kafka:dataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc.write.abort/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc.write.abort/client.rpt index b6e9f89a71..0ea4b44a7f 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc.write.abort/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc.write.abort/client.rpt @@ -41,6 +41,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoClientStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-97e816c79fb6624b7d221026cc36107c") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} write ${grpc:protobuf() @@ -62,6 +64,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoClientStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-97e816c79fb6624b7d221026cc36107c") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc.write.abort/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc.write.abort/server.rpt index 1fa1fa669c..42f1e09858 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc.write.abort/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc.write.abort/server.rpt @@ -43,6 +43,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoClientStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-97e816c79fb6624b7d221026cc36107c") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read ${grpc:protobuf() @@ -63,6 +65,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoClientStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-97e816c79fb6624b7d221026cc36107c") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read zilla:data.null diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc/client.rpt index 2e86e4dec6..5589c0ccce 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc/client.rpt @@ -41,6 +41,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoClientStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-97e816c79fb6624b7d221026cc36107c") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} write ${grpc:protobuf() @@ -60,6 +62,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoClientStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-97e816c79fb6624b7d221026cc36107c") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} write ${grpc:protobuf() @@ -79,6 +83,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoClientStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-97e816c79fb6624b7d221026cc36107c") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} @@ -115,6 +121,8 @@ read zilla:data.ext ${kafka:matchDataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} read ${grpc:protobuf() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc/server.rpt index f0299d0558..be8c806b97 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/client.stream.rpc/server.rpt @@ -43,6 +43,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoClientStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-97e816c79fb6624b7d221026cc36107c") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read ${grpc:protobuf() @@ -61,6 +63,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoClientStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-97e816c79fb6624b7d221026cc36107c") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read ${grpc:protobuf() @@ -79,6 +83,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoClientStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-97e816c79fb6624b7d221026cc36107c") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read zilla:data.null @@ -111,6 +117,8 @@ write zilla:data.ext ${kafka:dataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc.read.aborted/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc.read.aborted/client.rpt index 4a76d9f5f5..c390354af6 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc.read.aborted/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc.read.aborted/client.rpt @@ -42,6 +42,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoServerStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-08085616660359db13a42b81ed633c5d") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc.read.aborted/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc.read.aborted/server.rpt index c0f1cf9d6c..2170e7c34d 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc.read.aborted/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc.read.aborted/server.rpt @@ -43,6 +43,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoServerStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-08085616660359db13a42b81ed633c5d") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read zilla:data.null diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc/client.rpt index 2b1dbe4598..0ea7a40b70 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc/client.rpt @@ -41,6 +41,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoServerStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-08085616660359db13a42b81ed633c5d") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} write ${grpc:protobuf() @@ -60,6 +62,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoServerStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-08085616660359db13a42b81ed633c5d") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} @@ -96,6 +100,8 @@ read zilla:data.ext ${kafka:matchDataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} read ${grpc:protobuf() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc/server.rpt index 18f5e83aad..d31d73bdf3 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/server.stream.rpc/server.rpt @@ -43,6 +43,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoServerStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-08085616660359db13a42b81ed633c5d") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read ${grpc:protobuf() @@ -61,6 +63,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoServerStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-08085616660359db13a42b81ed633c5d") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read zilla:data.null @@ -93,6 +97,8 @@ write zilla:data.ext ${kafka:dataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.error/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.error/client.rpt index 2e72214717..814ab190e1 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.error/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.error/client.rpt @@ -41,6 +41,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-479f2c3fb58bc3f04bbe15440a657670") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} write ${grpc:protobuf() @@ -60,6 +62,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-479f2c3fb58bc3f04bbe15440a657670") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} @@ -97,6 +101,7 @@ read zilla:data.ext ${kafka:matchDataEx() .progress(1, 1) .key("test") .header("zilla:status", "9") + .header("meta:custom", "value") .build() .build()} read zilla:data.null diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.error/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.error/server.rpt index ee7639472e..d38e6b81b5 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.error/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.error/server.rpt @@ -43,6 +43,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-479f2c3fb58bc3f04bbe15440a657670") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} @@ -62,6 +64,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-479f2c3fb58bc3f04bbe15440a657670") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read zilla:data.null @@ -95,6 +99,7 @@ write zilla:data.ext ${kafka:dataEx() .progress(1, 1) .key("test") .header("zilla:status", "9") + .header("meta:custom", "value") .build() .build()} diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.message.value.100k/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.message.value.100k/client.rpt index 6aa0fee10e..2758f74348 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.message.value.100k/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.message.value.100k/client.rpt @@ -43,6 +43,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-479f2c3fb58bc3f04bbe15440a657670") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} write ${grpc:protobuf() @@ -62,6 +64,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-479f2c3fb58bc3f04bbe15440a657670") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} @@ -99,6 +103,7 @@ read zilla:data.ext ${kafka:matchDataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") .build() .build()} read ${grpc:protobuf() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.message.value.100k/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.message.value.100k/server.rpt index 4417660509..d1c7cbf242 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.message.value.100k/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.message.value.100k/server.rpt @@ -43,6 +43,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-479f2c3fb58bc3f04bbe15440a657670") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} @@ -62,6 +64,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-479f2c3fb58bc3f04bbe15440a657670") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read zilla:data.null @@ -95,6 +99,7 @@ write zilla:data.ext ${kafka:dataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") .build() .build()} write ${grpc:protobuf() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.sent.write.abort/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.sent.write.abort/client.rpt index 6c84ae591b..f71481de68 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.sent.write.abort/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.sent.write.abort/client.rpt @@ -41,6 +41,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-479f2c3fb58bc3f04bbe15440a657670") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.sent.write.abort/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.sent.write.abort/server.rpt index d76aa21ab0..d6d4fff808 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.sent.write.abort/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc.sent.write.abort/server.rpt @@ -43,6 +43,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-479f2c3fb58bc3f04bbe15440a657670") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read zilla:data.null diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc/client.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc/client.rpt index 18487e21af..2357a488d1 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc/client.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc/client.rpt @@ -41,6 +41,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-479f2c3fb58bc3f04bbe15440a657670") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} write ${grpc:protobuf() @@ -60,6 +62,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-479f2c3fb58bc3f04bbe15440a657670") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} @@ -96,6 +100,8 @@ read zilla:data.ext ${kafka:matchDataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} read ${grpc:protobuf() diff --git a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc/server.rpt b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc/server.rpt index 7040d097a8..404987e85b 100644 --- a/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc/server.rpt +++ b/specs/binding-grpc-kafka.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/kafka/streams/kafka/produce/unary.rpc/server.rpt @@ -43,6 +43,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-479f2c3fb58bc3f04bbe15440a657670") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} @@ -62,6 +64,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-479f2c3fb58bc3f04bbe15440a657670") + .header("meta:custom-bin", "dGVzdA==") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read zilla:data.null @@ -94,6 +98,8 @@ write zilla:data.ext ${kafka:dataEx() .progress(0, 2) .progress(1, 1) .key("test") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() diff --git a/specs/binding-grpc.spec/src/main/java/io/aklivity/zilla/specs/binding/grpc/internal/GrpcFunctions.java b/specs/binding-grpc.spec/src/main/java/io/aklivity/zilla/specs/binding/grpc/internal/GrpcFunctions.java index f31186e95b..bffa60a0b2 100644 --- a/specs/binding-grpc.spec/src/main/java/io/aklivity/zilla/specs/binding/grpc/internal/GrpcFunctions.java +++ b/specs/binding-grpc.spec/src/main/java/io/aklivity/zilla/specs/binding/grpc/internal/GrpcFunctions.java @@ -92,13 +92,9 @@ public static GrpcDataExBuilder dataEx() public static final class GrpcBeginExBuilder { private final GrpcBeginExFW.Builder beginExRW; - private final OctetsFW.Builder nameBuilder; - private final OctetsFW.Builder valueBuilder; private GrpcBeginExBuilder() { - nameBuilder = new OctetsFW.Builder().wrap(new UnsafeBuffer(new byte[1024 * 8]), 0, 1024 * 8); - valueBuilder = new OctetsFW.Builder().wrap(new UnsafeBuffer(new byte[1024 * 8]), 0, 1024 * 8); MutableDirectBuffer writeBuffer = new UnsafeBuffer(new byte[1024 * 8]); this.beginExRW = new GrpcBeginExFW.Builder().wrap(writeBuffer, 0, writeBuffer.capacity()); } @@ -145,16 +141,28 @@ public GrpcBeginExBuilder metadata( return metadata("TEXT", name, value); } - public GrpcBeginExBuilder metadata( + public GrpcBeginExBuilder metadataBase64( + String name, + String value) + { + return metadata("BASE64", name, value); + } + + private GrpcBeginExBuilder metadata( String type, String name, String value) { + DirectBuffer nameBuffer = new UnsafeBuffer(name.getBytes()); + OctetsFW nameOctets = new OctetsFW().wrap(nameBuffer, 0, nameBuffer.capacity()); + DirectBuffer valueBuffer = new UnsafeBuffer(value.getBytes()); + OctetsFW valueOctets = new OctetsFW().wrap(valueBuffer, 0, valueBuffer.capacity()); + beginExRW.metadataItem(b -> b.type(t -> t.set(GrpcType.valueOf(type))) .nameLen(name.length()) - .name(nameBuilder.set(name.getBytes()).build()) + .name(nameOctets) .valueLen(value.length()) - .value(valueBuilder.set(value.getBytes()).build())); + .value(valueOctets)); return this; } @@ -172,10 +180,6 @@ public static final class GrpcBeginExMatcherBuilder private final DirectBuffer bufferRO = new UnsafeBuffer(); private final GrpcBeginExFW beginExRO = new GrpcBeginExFW(); - private final OctetsFW.Builder nameBuilder = - new OctetsFW.Builder().wrap(new UnsafeBuffer(new byte[1024 * 8]), 0, 1024 * 8); - private final OctetsFW.Builder valueBuilder = - new OctetsFW.Builder().wrap(new UnsafeBuffer(new byte[1024 * 8]), 0, 1024 * 8); private final Map metadata = new LinkedHashMap<>(); @@ -227,19 +231,29 @@ public GrpcBeginExMatcherBuilder metadata( return metadata("TEXT", name, value); } - public GrpcBeginExMatcherBuilder metadata( + public GrpcBeginExMatcherBuilder metadataBase64( + String name, + String value) + { + return metadata("BASE64", name, value); + } + + private GrpcBeginExMatcherBuilder metadata( String type, String name, String value) { - metadata.put(nameBuilder.set(name.getBytes()).build(), - new MetadataValue(GrpcType.valueOf(type), valueBuilder.set(value.getBytes()).build()::equals)); + DirectBuffer nameBuffer = new UnsafeBuffer(name.getBytes()); + OctetsFW nameOctets = new OctetsFW().wrap(nameBuffer, 0, nameBuffer.capacity()); + DirectBuffer valueBuffer = new UnsafeBuffer(value.getBytes()); + OctetsFW valueOctets = new OctetsFW().wrap(valueBuffer, 0, valueBuffer.capacity()); + metadata.put(nameOctets, new MetadataValue(GrpcType.valueOf(type), valueOctets::equals)); return this; } public BytesMatcher build() { - return method != null ? this::match : buf -> null; + return this::match; } private GrpcBeginExFW match( @@ -280,25 +294,25 @@ private boolean matchMetadata( private boolean matchMethod( GrpcBeginExFW beginEx) { - return method.equals(beginEx.method().asString()); + return method == null || method.equals(beginEx.method().asString()); } private boolean matchScheme( GrpcBeginExFW beginEx) { - return scheme.equals(beginEx.scheme().asString()); + return scheme == null || scheme.equals(beginEx.scheme().asString()); } private boolean matchAuthority( GrpcBeginExFW beginEx) { - return authority.equals(beginEx.authority().asString()); + return authority == null || authority.equals(beginEx.authority().asString()); } private boolean matchService( GrpcBeginExFW beginEx) { - return service.equals(beginEx.service().asString()); + return service == null || service.equals(beginEx.service().asString()); } private boolean matchTypeId( diff --git a/specs/binding-grpc.spec/src/main/resources/META-INF/zilla/grpc.idl b/specs/binding-grpc.spec/src/main/resources/META-INF/zilla/grpc.idl index 9d6ce62d4d..9f7471c7eb 100644 --- a/specs/binding-grpc.spec/src/main/resources/META-INF/zilla/grpc.idl +++ b/specs/binding-grpc.spec/src/main/resources/META-INF/zilla/grpc.idl @@ -33,10 +33,10 @@ scope grpc struct GrpcBeginEx extends core::stream::Extension { - string16 scheme; - string16 authority; - string16 service; - string16 method; + string16 scheme = null; + string16 authority = null; + string16 service = null; + string16 method = null; GrpcMetadata[] metadata; } diff --git a/specs/binding-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/streams/application/unary.rpc/binary.metadata/client.rpt b/specs/binding-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/streams/application/unary.rpc/binary.metadata/client.rpt index 48a87dcdd5..d4c4b41bd3 100644 --- a/specs/binding-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/streams/application/unary.rpc/binary.metadata/client.rpt +++ b/specs/binding-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/streams/application/unary.rpc/binary.metadata/client.rpt @@ -23,7 +23,7 @@ write zilla:begin.ext ${grpc:beginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoUnary") - .metadata("BASE64", "custom", "dGVzdA==") + .metadataBase64("custom", "dGVzdA==") .build()} connected diff --git a/specs/binding-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/streams/application/unary.rpc/binary.metadata/server.rpt b/specs/binding-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/streams/application/unary.rpc/binary.metadata/server.rpt index a6d0681938..7f23d80391 100644 --- a/specs/binding-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/streams/application/unary.rpc/binary.metadata/server.rpt +++ b/specs/binding-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/grpc/streams/application/unary.rpc/binary.metadata/server.rpt @@ -24,7 +24,7 @@ read zilla:begin.ext ${grpc:matchBeginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoUnary") - .metadata("BASE64", "custom", "dGVzdA==") + .metadataBase64("custom", "dGVzdA==") .build()} connected diff --git a/specs/binding-grpc.spec/src/test/java/io/aklivity/zilla/specs/binding/grpc/internal/GrpcFunctionsTest.java b/specs/binding-grpc.spec/src/test/java/io/aklivity/zilla/specs/binding/grpc/internal/GrpcFunctionsTest.java index 5295818147..909475f72e 100644 --- a/specs/binding-grpc.spec/src/test/java/io/aklivity/zilla/specs/binding/grpc/internal/GrpcFunctionsTest.java +++ b/specs/binding-grpc.spec/src/test/java/io/aklivity/zilla/specs/binding/grpc/internal/GrpcFunctionsTest.java @@ -92,6 +92,23 @@ public void shouldGenerateBeginExtension() assertTrue(beginEx.metadata().sizeof() > 0); } + @Test + public void shouldGenerateBeginExtensionWithMetadata() + { + byte[] build = GrpcFunctions.beginEx() + .typeId(0x01) + .metadata("custom", "test") + .build(); + DirectBuffer buffer = new UnsafeBuffer(build); + GrpcBeginExFW beginEx = new GrpcBeginExFW().wrap(buffer, 0, buffer.capacity()); + beginEx.metadata().forEach(h -> + { + assertTrue(nameBuilder.set("custom".getBytes()).build().equals(h.name())); + assertTrue(valueBuilder.set("test".getBytes()).build().equals(h.value())); + }); + assertTrue(beginEx.metadata().sizeof() > 0); + } + @Test public void shouldMatchBeginExtension() throws Exception { @@ -122,6 +139,28 @@ public void shouldMatchBeginExtension() throws Exception assertNotNull(matcher.match(byteBuf)); } + @Test + public void shouldMatchBeginExtensionWithMetadata() throws Exception + { + String value = "value"; + String custom = "custom"; + BytesMatcher matcher = GrpcFunctions.matchBeginEx() + .typeId(0x01) + .metadata(custom, value) + .build(); + + ByteBuffer byteBuf = ByteBuffer.allocate(1024); + + new GrpcBeginExFW.Builder().wrap(new UnsafeBuffer(byteBuf), 0, byteBuf.capacity()) + .typeId(0x01) + .metadataItem(h -> h.type(t -> t.set(TEXT).build()).nameLen(custom.length()) + .name(nameBuilder.set(custom.getBytes()).build()) + .valueLen(value.length()).value(valueBuilder.set(value.getBytes()).build())) + .build(); + + assertNotNull(matcher.match(byteBuf)); + } + @Test public void shouldGenerateResetExtension() { diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/bidi.stream.rpc/client.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/bidi.stream.rpc/client.rpt index 5c68875bef..1526309cd2 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/bidi.stream.rpc/client.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/bidi.stream.rpc/client.rpt @@ -23,8 +23,8 @@ write zilla:begin.ext ${grpc:beginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoBidiStream") - .metadata("custom", "test") .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .metadataBase64("custom", "dGVzdA==") .build()} connected @@ -38,6 +38,12 @@ write ${grpc:protobuf() .build()} write flush +read zilla:begin.ext ${grpc:matchBeginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + read ${grpc:protobuf() .string(1, "Hello World1") .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/bidi.stream.rpc/server.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/bidi.stream.rpc/server.rpt index 3edecf506f..d5c3d17ad7 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/bidi.stream.rpc/server.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/bidi.stream.rpc/server.rpt @@ -24,6 +24,8 @@ read zilla:begin.ext ${grpc:matchBeginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoBidiStream") + .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .metadataBase64("custom", "dGVzdA==") .build()} connected @@ -35,6 +37,13 @@ read ${grpc:protobuf() .string(1, "Hello World2") .build()} +write zilla:begin.ext ${grpc:beginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} +write flush + write ${grpc:protobuf() .string(1, "Hello World1") .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.sent.write.abort/client.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.sent.write.abort/client.rpt index 625553053f..6ede234069 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.sent.write.abort/client.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.sent.write.abort/client.rpt @@ -23,6 +23,7 @@ write zilla:begin.ext ${grpc:beginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoUnary") + .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .metadata("custom", "test") .build()} connected @@ -34,6 +35,11 @@ write flush write close +read zilla:begin.ext ${grpc:matchBeginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .build()} + read ${grpc:protobuf() .string(1, "Hello World") .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.sent.write.abort/server.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.sent.write.abort/server.rpt index 7ac5cde045..999c25ded6 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.sent.write.abort/server.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.sent.write.abort/server.rpt @@ -24,6 +24,8 @@ read zilla:begin.ext ${grpc:matchBeginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoUnary") + .metadata("custom", "test") + .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build()} connected @@ -32,6 +34,12 @@ read ${grpc:protobuf() .build()} read closed +write zilla:begin.ext ${grpc:beginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .build()} +write flush + write ${grpc:protobuf() .string(1, "Hello World") .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.stream.rpc/client.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.stream.rpc/client.rpt index 113e5a2b48..61319aa562 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.stream.rpc/client.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.stream.rpc/client.rpt @@ -23,6 +23,8 @@ write zilla:begin.ext ${grpc:beginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoClientStream") + .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .metadataBase64("custom", "dGVzdA==") .build()} connected @@ -38,6 +40,12 @@ write flush write close +read zilla:begin.ext ${grpc:matchBeginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + read ${grpc:protobuf() .string(1, "Hello World") .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.stream.rpc/server.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.stream.rpc/server.rpt index 80ecbd27bb..e45f74cbbc 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.stream.rpc/server.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/client.stream.rpc/server.rpt @@ -24,6 +24,8 @@ read zilla:begin.ext ${grpc:matchBeginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoClientStream") + .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .metadataBase64("custom", "dGVzdA==") .build()} connected @@ -37,6 +39,13 @@ read ${grpc:protobuf() read closed +write zilla:begin.ext ${grpc:beginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} +write flush + write ${grpc:protobuf() .string(1, "Hello World") .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/retry.on.unavailable.server/client.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/retry.on.unavailable.server/client.rpt index 6ad4a356e1..ba2d5bf73e 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/retry.on.unavailable.server/client.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/retry.on.unavailable.server/client.rpt @@ -32,6 +32,8 @@ write zilla:begin.ext ${grpc:beginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoUnary") + .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .metadataBase64("custom", "dGVzdA==") .build()} connected @@ -42,6 +44,12 @@ write flush write close +read zilla:begin.ext ${grpc:matchBeginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + read ${grpc:protobuf() .string(1, "Hello World") .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/retry.on.unavailable.server/server.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/retry.on.unavailable.server/server.rpt index 175a5e3c7b..0bd20d226d 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/retry.on.unavailable.server/server.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/retry.on.unavailable.server/server.rpt @@ -27,6 +27,8 @@ read zilla:begin.ext ${grpc:matchBeginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoUnary") + .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .metadataBase64("custom", "dGVzdA==") .build()} connected @@ -36,6 +38,13 @@ read ${grpc:protobuf() read closed +write zilla:begin.ext ${grpc:beginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} +write flush + write ${grpc:protobuf() .string(1, "Hello World") .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/server.stream.rpc/client.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/server.stream.rpc/client.rpt index 79c8b6aa9c..75592c73f0 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/server.stream.rpc/client.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/server.stream.rpc/client.rpt @@ -23,6 +23,8 @@ write zilla:begin.ext ${grpc:beginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoServerStream") + .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .metadataBase64("custom", "dGVzdA==") .build()} connected @@ -34,6 +36,12 @@ write flush write close +read zilla:begin.ext ${grpc:matchBeginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + read ${grpc:protobuf() .string(1, "Hello World1") .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/server.stream.rpc/server.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/server.stream.rpc/server.rpt index 420481872a..cbc435aff7 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/server.stream.rpc/server.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/server.stream.rpc/server.rpt @@ -24,6 +24,8 @@ read zilla:begin.ext ${grpc:matchBeginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoServerStream") + .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .metadataBase64("custom", "dGVzdA==") .build()} connected @@ -33,6 +35,13 @@ read ${grpc:protobuf() read closed +write zilla:begin.ext ${grpc:beginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} +write flush + write ${grpc:protobuf() .string(1, "Hello World1") .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc.message.value.100k/client.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc.message.value.100k/client.rpt index 3698254892..88ed425829 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc.message.value.100k/client.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc.message.value.100k/client.rpt @@ -23,6 +23,8 @@ write zilla:begin.ext ${grpc:beginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoUnary") + .metadata("custom", "test") + .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build()} connected @@ -37,6 +39,11 @@ write flush write close +read zilla:begin.ext ${grpc:matchBeginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .build()} + read zilla:data.ext ${grpc:dataEx() .typeId(zilla:id("grpc")) .deferred(94217) diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc.message.value.100k/server.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc.message.value.100k/server.rpt index b280d3bdd1..77fc7f0f2b 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc.message.value.100k/server.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc.message.value.100k/server.rpt @@ -26,6 +26,8 @@ read zilla:begin.ext ${grpc:matchBeginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoUnary") + .metadata("custom", "test") + .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build()} connected @@ -39,6 +41,12 @@ read ${grpc:protobuf() read closed +write zilla:begin.ext ${grpc:beginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .build()} +write flush + write zilla:data.ext ${grpc:dataEx() .typeId(zilla:id("grpc")) .deferred(94217) diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc/client.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc/client.rpt index 667e3f0070..fe37ab077a 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc/client.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc/client.rpt @@ -23,6 +23,8 @@ write zilla:begin.ext ${grpc:beginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoUnary") + .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .metadataBase64("custom", "dGVzdA==") .build()} connected @@ -33,6 +35,12 @@ write flush write close +read zilla:begin.ext ${grpc:matchBeginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} + read ${grpc:protobuf() .string(1, "Hello World") .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc/server.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc/server.rpt index 035e65267e..08ceffd283 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc/server.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/grpc/unary.rpc/server.rpt @@ -24,6 +24,8 @@ read zilla:begin.ext ${grpc:matchBeginEx() .authority("localhost:8080") .service("example.EchoService") .method("EchoUnary") + .metadata("idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .metadataBase64("custom", "dGVzdA==") .build()} connected @@ -33,6 +35,13 @@ read ${grpc:protobuf() read closed +write zilla:begin.ext ${grpc:beginEx() + .typeId(zilla:id("grpc")) + .metadata("custom", "value") + .metadataBase64("customProperty", "dGVzdA==") + .build()} +write flush + write ${grpc:protobuf() .string(1, "Hello World") .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/bidi.stream.rpc/client.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/bidi.stream.rpc/client.rpt index a5d878ef13..703de00865 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/bidi.stream.rpc/client.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/bidi.stream.rpc/client.rpt @@ -47,6 +47,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoBidiStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .header("meta:custom-bin", "dGVzdA==") .build() .build()} read ${grpc:protobuf() @@ -138,6 +140,8 @@ write zilla:data.ext ${kafka:dataEx() .deferred(0) .partition(-1, -1) .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() @@ -152,6 +156,8 @@ write zilla:data.ext ${kafka:dataEx() .deferred(0) .partition(-1, -1) .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/bidi.stream.rpc/server.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/bidi.stream.rpc/server.rpt index 4f1fed4136..bb68140864 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/bidi.stream.rpc/server.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/bidi.stream.rpc/server.rpt @@ -50,6 +50,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoBidiStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .header("meta:custom-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() @@ -141,6 +143,8 @@ read zilla:data.ext ${kafka:matchDataEx() .deferred(0) .partition(-1, -1) .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} @@ -155,6 +159,8 @@ read zilla:data.ext ${kafka:matchDataEx() .deferred(0) .partition(-1, -1) .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.sent.write.abort/client.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.sent.write.abort/client.rpt index 8299007a8e..6bb128e5d5 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.sent.write.abort/client.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.sent.write.abort/client.rpt @@ -47,6 +47,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read ${grpc:protobuf() @@ -113,6 +115,7 @@ write zilla:data.ext ${kafka:dataEx() .partition(-1, -1) .key("59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") .build() .build()} write ${grpc:protobuf() diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.sent.write.abort/server.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.sent.write.abort/server.rpt index 5d45201cdc..03b0286bb4 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.sent.write.abort/server.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.sent.write.abort/server.rpt @@ -50,6 +50,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} write ${grpc:protobuf() @@ -113,6 +115,7 @@ read zilla:data.ext ${kafka:matchDataEx() .partition(-1, -1) .key("59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") .build() .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.stream.rpc/client.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.stream.rpc/client.rpt index 40600f7621..bb02da2dc3 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.stream.rpc/client.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.stream.rpc/client.rpt @@ -47,6 +47,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoClientStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .header("meta:custom-bin", "dGVzdA==") .build() .build()} read ${grpc:protobuf() @@ -139,6 +141,8 @@ write zilla:data.ext ${kafka:dataEx() .partition(-1, -1) .key("59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.stream.rpc/server.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.stream.rpc/server.rpt index 9555157a3c..5bd8e7aab8 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.stream.rpc/server.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/client.stream.rpc/server.rpt @@ -50,6 +50,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoClientStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .header("meta:custom-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() @@ -142,6 +144,8 @@ read zilla:data.ext ${kafka:matchDataEx() .deferred(0) .partition(-1, -1) .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/server.stream.rpc/client.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/server.stream.rpc/client.rpt index af55281d58..4fdbd83f01 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/server.stream.rpc/client.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/server.stream.rpc/client.rpt @@ -47,6 +47,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoServerStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .header("meta:custom-bin", "dGVzdA==") .build() .build()} read ${grpc:protobuf() @@ -110,6 +112,8 @@ write zilla:data.ext ${kafka:dataEx() .deferred(0) .partition(-1, -1) .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() @@ -124,6 +128,8 @@ write zilla:data.ext ${kafka:dataEx() .deferred(0) .partition(-1, -1) .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/server.stream.rpc/server.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/server.stream.rpc/server.rpt index 13130ecdb4..6b7afef49c 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/server.stream.rpc/server.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/server.stream.rpc/server.rpt @@ -50,6 +50,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoServerStream") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .header("meta:custom-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() @@ -111,6 +113,8 @@ read zilla:data.ext ${kafka:matchDataEx() .deferred(0) .partition(-1, -1) .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} @@ -125,6 +129,8 @@ read zilla:data.ext ${kafka:matchDataEx() .deferred(0) .partition(-1, -1) .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc.message.value.100k/client.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc.message.value.100k/client.rpt index 6ebe12df95..d3fe1402ea 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc.message.value.100k/client.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc.message.value.100k/client.rpt @@ -48,6 +48,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} read ${grpc:protobuf() @@ -113,6 +115,7 @@ write zilla:data.ext ${kafka:dataEx() .partition(-1, -1) .key("59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") .build() .build()} write ${grpc:protobuf() diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc.message.value.100k/server.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc.message.value.100k/server.rpt index 43a83ee736..c40e88821b 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc.message.value.100k/server.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc.message.value.100k/server.rpt @@ -53,6 +53,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "test") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") .build() .build()} write ${grpc:protobuf() @@ -118,6 +120,7 @@ read zilla:data.ext ${kafka:matchDataEx() .partition(-1, -1) .key("59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") .build() .build()} diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc/client.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc/client.rpt index 710f3a4cf7..9708ea0c01 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc/client.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc/client.rpt @@ -47,6 +47,8 @@ read zilla:data.ext ${kafka:matchDataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .header("meta:custom-bin", "dGVzdA==") .build() .build()} read ${grpc:protobuf() @@ -112,6 +114,8 @@ write zilla:data.ext ${kafka:dataEx() .partition(-1, -1) .key("59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() diff --git a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc/server.rpt b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc/server.rpt index 19af1d1734..b8d38ad0b2 100644 --- a/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc/server.rpt +++ b/specs/binding-kafka-grpc.spec/src/main/scripts/io/aklivity/zilla/specs/binding/kafka/grpc/streams/kafka/unary.rpc/server.rpt @@ -50,6 +50,8 @@ write zilla:data.ext ${kafka:dataEx() .header("zilla:method", "EchoUnary") .header("zilla:reply-to", "responses") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:idempotency-key", "59410e57-3e0f-4b61-9328-f645a7968ac8") + .header("meta:custom-bin", "dGVzdA==") .build() .build()} write ${grpc:protobuf() @@ -115,6 +117,8 @@ read zilla:data.ext ${kafka:matchDataEx() .partition(-1, -1) .key("59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") .header("zilla:correlation-id", "59410e57-3e0f-4b61-9328-f645a7968ac8-d41d8cd98f00b204e9800998ecf8427e") + .header("meta:custom", "value") + .header("meta:customProperty-bin", "dGVzdA==") .build() .build()}