@@ -71,9 +71,10 @@ import Control.Monad
71
71
import Control.Monad.IO.Class
72
72
import Data.Aeson hiding (decode , encode )
73
73
import qualified Data.Aeson as Aeson
74
+ import Data.Base64.Types (extractBase64 )
74
75
import Data.ByteString (ByteString )
75
76
import qualified Data.ByteString as BS
76
- import Data.ByteString.Base64 (decodeBase64 , encodeBase64 )
77
+ import Data.ByteString.Base64 (decodeBase64Untyped , encodeBase64 )
77
78
import qualified Data.ByteString.Char8 as C
78
79
import qualified Data.ByteString.Lazy as BL
79
80
import Data.Kind
@@ -441,12 +442,21 @@ data Payload = Payload
441
442
deriving stock (Show , Eq , Ord , Lift )
442
443
443
444
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
444
450
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
446
452
Left err -> fail $ Text. unpack err
447
453
Right ok -> pure ok
448
454
449
455
456
+ base64EncodeToText :: ByteString -> T. Text
457
+ base64EncodeToText = extractBase64 . encodeBase64
458
+
459
+
450
460
instance FromJSON Payload where
451
461
parseJSON = withObject " Payload" $ \ o -> do
452
462
rawPayloadData <- o .:? " data"
@@ -459,13 +469,13 @@ instance FromJSON Payload where
459
469
instance ToJSON Payload where
460
470
toJSON Payload {.. } =
461
471
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) : ))
464
474
[]
465
475
toEncoding Payload {.. } =
466
476
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)
469
479
470
480
471
481
convertFromProtoPayload :: Proto. Payload -> Payload
0 commit comments