@@ -111,6 +111,8 @@ async def encode(
111111 """
112112 payloads = self .payload_converter .to_payloads (values )
113113 payloads = await self ._encode_payload_sequence (payloads )
114+ payloads = await self ._external_store_payload_sequence (payloads )
115+ self ._validate_payload_limits (payloads )
114116 return payloads
115117
116118 async def decode (
@@ -128,6 +130,7 @@ async def decode(
128130 Returns:
129131 Decoded and converted values.
130132 """
133+ payloads = await self ._external_retrieve_payload_sequence (payloads )
131134 payloads = await self ._decode_payload_sequence (payloads )
132135 return self .payload_converter .from_payloads (payloads , type_hints )
133136
@@ -156,13 +159,13 @@ async def encode_failure(
156159 ) -> None :
157160 """Convert and encode failure."""
158161 self .failure_converter .to_failure (exception , self .payload_converter , failure )
159- await _apply_to_failure_payloads (failure , self ._encode_payloads )
162+ await _apply_to_failure_payloads (failure , self ._transform_outbound_payloads )
160163
161164 async def decode_failure (
162165 self , failure : temporalio .api .failure .v1 .Failure
163166 ) -> BaseException :
164167 """Decode and convert failure."""
165- await _apply_to_failure_payloads (failure , self ._decode_payloads )
168+ await _apply_to_failure_payloads (failure , self ._transform_inbound_payloads )
166169 return self .failure_converter .from_failure (failure , self .payload_converter )
167170
168171 def with_context (self , context : SerializationContext ) -> Self :
@@ -250,7 +253,7 @@ async def _encode_memo_existing(
250253 "[TMPRL1103] Attempted to upload memo with size that exceeded the warning limit." ,
251254 )
252255
253- async def _encode_payload (
256+ async def _transform_outbound_payload (
254257 self , payload : temporalio .api .common .v1 .Payload
255258 ) -> temporalio .api .common .v1 .Payload :
256259 if self .payload_codec :
@@ -260,27 +263,16 @@ async def _encode_payload(
260263 self ._validate_payload_limits ([payload ])
261264 return payload
262265
263- async def _encode_payloads (self , payloads : temporalio .api .common .v1 .Payloads ):
266+ async def _transform_outbound_payloads (
267+ self , payloads : temporalio .api .common .v1 .Payloads
268+ ):
264269 if self .payload_codec :
265270 await self .payload_codec .encode_wrapper (payloads )
266271 if self .external_storage :
267272 await self .external_storage ._store_payloads (payloads )
268273 self ._validate_payload_limits (payloads .payloads )
269274
270- async def _encode_payload_sequence (
271- self , payloads : Sequence [temporalio .api .common .v1 .Payload ]
272- ) -> list [temporalio .api .common .v1 .Payload ]:
273- encoded_payloads = list (payloads )
274- if self .payload_codec :
275- encoded_payloads = await self .payload_codec .encode (encoded_payloads )
276- if self .external_storage :
277- encoded_payloads = await self .external_storage ._store_payload_sequence (
278- encoded_payloads
279- )
280- self ._validate_payload_limits (encoded_payloads )
281- return encoded_payloads
282-
283- async def _decode_payload (
275+ async def _transform_inbound_payload (
284276 self , payload : temporalio .api .common .v1 .Payload
285277 ) -> temporalio .api .common .v1 .Payload :
286278 if self .external_storage :
@@ -289,7 +281,9 @@ async def _decode_payload(
289281 payload = (await self .payload_codec .decode ([payload ]))[0 ]
290282 return payload
291283
292- async def _decode_payloads (self , payloads : temporalio .api .common .v1 .Payloads ):
284+ async def _transform_inbound_payloads (
285+ self , payloads : temporalio .api .common .v1 .Payloads
286+ ):
293287 if self .external_storage :
294288 await self .external_storage ._retrieve_payloads (payloads )
295289 else :
@@ -304,23 +298,51 @@ async def _decode_payloads(self, payloads: temporalio.api.common.v1.Payloads):
304298 if self .payload_codec :
305299 await self .payload_codec .decode_wrapper (payloads )
306300
307- async def _decode_payload_sequence (
301+ async def _encode_payload_sequence (
308302 self , payloads : Sequence [temporalio .api .common .v1 .Payload ]
309303 ) -> list [temporalio .api .common .v1 .Payload ]:
310- decoded_payloads = list (payloads )
304+ """Codec encode only."""
305+ encoded_payloads = list (payloads )
306+ if self .payload_codec :
307+ encoded_payloads = await self .payload_codec .encode (encoded_payloads )
308+ return encoded_payloads
309+
310+ async def _external_store_payload_sequence (
311+ self , payloads : Sequence [temporalio .api .common .v1 .Payload ]
312+ ) -> list [temporalio .api .common .v1 .Payload ]:
313+ """External storage store, then validate payload limits."""
314+ stored_payloads = list (payloads )
315+ if self .external_storage :
316+ stored_payloads = await self .external_storage ._store_payload_sequence (
317+ stored_payloads
318+ )
319+ return stored_payloads
320+
321+ async def _external_retrieve_payload_sequence (
322+ self , payloads : Sequence [temporalio .api .common .v1 .Payload ]
323+ ) -> list [temporalio .api .common .v1 .Payload ]:
324+ """External storage retrieve only."""
325+ retrieved_payloads = list (payloads )
311326 if self .external_storage :
312- decoded_payloads = await self .external_storage ._retrieve_payload_sequence (
313- decoded_payloads
327+ retrieved_payloads = await self .external_storage ._retrieve_payload_sequence (
328+ retrieved_payloads
314329 )
315330 else :
316331 if any (
317332 p .metadata .get ("encoding" ) == _REFERENCE_ENCODING
318- for p in decoded_payloads
333+ for p in retrieved_payloads
319334 ):
320335 warnings .warn (
321336 "[TMPRL1105] Detected externally stored payload(s) but external storage is not configured." ,
322337 StorageWarning ,
323338 )
339+ return retrieved_payloads
340+
341+ async def _decode_payload_sequence (
342+ self , payloads : Sequence [temporalio .api .common .v1 .Payload ]
343+ ) -> list [temporalio .api .common .v1 .Payload ]:
344+ """Codec decode only."""
345+ decoded_payloads = list (payloads )
324346 if self .payload_codec :
325347 decoded_payloads = await self .payload_codec .decode (decoded_payloads )
326348 return decoded_payloads
0 commit comments