Skip to content

Commit d7c23fe

Browse files
committed
refactor: simplify WireFrameDecoder payload decoding logic, introduce decodeSinglePayload for improved readability and fallback handling
1 parent 2fdd3c2 commit d7c23fe

1 file changed

Lines changed: 26 additions & 12 deletions

File tree

testing/src/Transcript/WireFrameDecoder.php

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212
use Temporal\Api\Common\V1\Payloads;
1313
use Temporal\DataConverter\DataConverter;
1414
use Temporal\DataConverter\DataConverterInterface;
15-
use Temporal\DataConverter\EncodedCollection;
16-
use Temporal\DataConverter\EncodedValues;
15+
use Temporal\DataConverter\EncodingKeys;
1716

1817
final class WireFrameDecoder
1918
{
@@ -89,28 +88,43 @@ private static function decodeMessage(Message $message, DataConverterInterface $
8988
*/
9089
private static function decodePayloads(Payloads $payloads, DataConverterInterface $converter): array
9190
{
92-
try {
93-
return \array_values(EncodedValues::fromPayloads($payloads, $converter)->getValues());
94-
} catch (\Throwable) {
95-
return \array_map(self::payloadFallback(...), \iterator_to_array($payloads->getPayloads(), false));
91+
$out = [];
92+
foreach ($payloads->getPayloads() as $payload) {
93+
$out[] = self::decodeSinglePayload($payload, $converter);
9694
}
95+
return $out;
9796
}
9897

9998
/**
10099
* @return array<string, mixed>
101100
*/
102101
private static function decodeHeader(Header $header, DataConverterInterface $converter): array
103102
{
103+
$out = [];
104104
/** @var MapField<string, Payload> $fields */
105105
$fields = $header->getFields();
106+
foreach ($fields as $name => $payload) {
107+
$out[$name] = self::decodeSinglePayload($payload, $converter);
108+
}
109+
return $out;
110+
}
111+
112+
/**
113+
* Decodes a single payload using its own `metadata.encoding`. Falls back to a raw
114+
* representation when encoding is absent (e.g., {@see \Temporal\DataConverter\RawValue})
115+
* or when the converter cannot interpret the bytes.
116+
*/
117+
private static function decodeSinglePayload(Payload $payload, DataConverterInterface $converter): mixed
118+
{
119+
/** @var MapField<string, string> $meta */
120+
$meta = $payload->getMetadata();
121+
if (!isset($meta[EncodingKeys::METADATA_ENCODING_KEY])) {
122+
return self::payloadFallback($payload);
123+
}
106124
try {
107-
return EncodedCollection::fromPayloadCollection($fields, $converter)->getValues();
125+
return $converter->fromPayload($payload, null);
108126
} catch (\Throwable) {
109-
$out = [];
110-
foreach ($fields as $name => $payload) {
111-
$out[$name] = self::payloadFallback($payload);
112-
}
113-
return $out;
127+
return self::payloadFallback($payload);
114128
}
115129
}
116130

0 commit comments

Comments
 (0)