NativeMessage.purs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. module ExampleWebExt.NativeMessage where
  2. import Prelude
  3. import Browser.WebExt.Listener (mkListener)
  4. import Browser.WebExt.Message (Message, mkMessage, unwrapMessage)
  5. import Browser.WebExt.Port (Port, onMessageAddListener)
  6. import Browser.WebExt.Port as Port
  7. import Browser.WebExt.Runtime (Application, connectNative)
  8. import Data.Argonaut.Core (Json)
  9. import Data.Argonaut.Decode (class DecodeJson, JsonDecodeError, decodeJson, printJsonDecodeError)
  10. import Data.Argonaut.Decode.Generic (genericDecodeJson)
  11. import Data.Argonaut.Encode (class EncodeJson)
  12. import Data.Argonaut.Encode.Generic (genericEncodeJson)
  13. import Data.Either (Either(..))
  14. import Data.Generic.Rep (class Generic)
  15. import Data.Show.Generic (genericShow)
  16. import Effect (Effect)
  17. import Effect.Class.Console (log)
  18. data NativeMessage =
  19. NativeMessageBackground String
  20. | NativeMessageLog {level :: String, content :: String}
  21. type NativePythonMessage m = {tag :: String | m}
  22. type NativePythonMessageLog = NativePythonMessage (level :: String, content :: String)
  23. derive instance Generic NativeMessage _
  24. instance Show NativeMessage where show = genericShow
  25. instance EncodeJson NativeMessage where encodeJson a = genericEncodeJson a
  26. instance DecodeJson NativeMessage where
  27. decodeJson json = case decodeNative json of
  28. Right {level, content} -> Right (NativeMessageLog {level, content})
  29. Left _ -> genericDecodeJson json
  30. where
  31. decodeNative :: Json -> Either JsonDecodeError NativePythonMessageLog
  32. decodeNative = decodeJson
  33. connectToNativeApplication ∷ Application → Effect Port
  34. connectToNativeApplication = connectNative
  35. decodeNativeMessage ∷ Message → Either String NativeMessage
  36. decodeNativeMessage m =
  37. case unwrapMessage m of
  38. Left err -> Left $ printJsonDecodeError err
  39. Right m' -> Right m'
  40. onNativeMessageAddListener ∷ Port → (NativeMessage → Effect Unit) → Effect Unit
  41. onNativeMessageAddListener port f = onMessageAddListener port $ runtimeMessageHandler
  42. where
  43. runtimeMessageHandler = mkListener \m -> do
  44. case decodeNativeMessage m of
  45. Left err -> log err
  46. Right m' -> f m'
  47. sendMessageToNative :: Port -> NativeMessage -> Effect Unit
  48. sendMessageToNative port msg = do
  49. _ <- Port.postMessage port $ mkMessage msg
  50. pure unit