Skip to content

Commit 5f16037

Browse files
9999yearsjkachmar
authored andcommitted
Support base64-1.0
1 parent 049a839 commit 5f16037

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

sdk/src/Temporal/Payload.hs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,10 @@ import Control.Monad
7171
import Control.Monad.IO.Class
7272
import Data.Aeson hiding (decode, encode)
7373
import qualified Data.Aeson as Aeson
74+
import Data.Base64.Types (extractBase64)
7475
import Data.ByteString (ByteString)
7576
import qualified Data.ByteString as BS
76-
import Data.ByteString.Base64 (decodeBase64, encodeBase64)
77+
import Data.ByteString.Base64 (decodeBase64Untyped, encodeBase64)
7778
import qualified Data.ByteString.Char8 as C
7879
import qualified Data.ByteString.Lazy as BL
7980
import Data.Kind
@@ -441,12 +442,21 @@ data Payload = Payload
441442
deriving stock (Show, Eq, Ord, Lift)
442443

443444

445+
-- Note: You'd think `decodeBase64Untyped` is the wrong function to use, but
446+
-- there's actually no way to check the invariants that the typed versions
447+
-- encode.
448+
--
449+
-- See: https://github.com/emilypi/base64/issues/65#issuecomment-2960385097
444450
base64DecodeFromText :: MonadFail m => T.Text -> m ByteString
445-
base64DecodeFromText txt = case decodeBase64 $ Text.encodeUtf8 txt of
451+
base64DecodeFromText txt = case decodeBase64Untyped $ Text.encodeUtf8 txt of
446452
Left err -> fail $ Text.unpack err
447453
Right ok -> pure ok
448454

449455

456+
base64EncodeToText :: ByteString -> T.Text
457+
base64EncodeToText = extractBase64 . encodeBase64
458+
459+
450460
instance FromJSON Payload where
451461
parseJSON = withObject "Payload" $ \o -> do
452462
rawPayloadData <- o .:? "data"
@@ -459,13 +469,13 @@ instance FromJSON Payload where
459469
instance ToJSON Payload where
460470
toJSON Payload {..} =
461471
object $
462-
(if payloadData == "" then id else (("data" .= encodeBase64 payloadData) :)) $
463-
(if Map.null payloadMetadata then id else (("metadata" .= fmap encodeBase64 payloadMetadata) :))
472+
(if payloadData == "" then id else (("data" .= base64EncodeToText payloadData) :)) $
473+
(if Map.null payloadMetadata then id else (("metadata" .= fmap base64EncodeToText payloadMetadata) :))
464474
[]
465475
toEncoding Payload {..} =
466476
pairs $
467-
(if payloadData == "" then mempty else "data" .= encodeBase64 payloadData)
468-
<> (if Map.null payloadMetadata then mempty else "metadata" .= fmap encodeBase64 payloadMetadata)
477+
(if payloadData == "" then mempty else "data" .= base64EncodeToText payloadData)
478+
<> (if Map.null payloadMetadata then mempty else "metadata" .= fmap base64EncodeToText payloadMetadata)
469479

470480

471481
convertFromProtoPayload :: Proto.Payload -> Payload

0 commit comments

Comments
 (0)