Message from JS system is used to listen for messages from JS and decode them to Elm messages.
It's an example usage of Effects package.
A system may subscribe for messages from JS with subscribe
function
module ChildSystemA exposing (Msg, msgFromJsEffects)
import Effects.MsgFromJs
type Msg
= ReceivedMessageForSystemA Int
| ReceivedSharedMessage
msgFromJsEffects : Effects.MsgFromJs.Effects Msg
msgFromJsEffects =
MsgFromJs.subscribe "System A"
[ ( "MessageForSystemA"
, MsgFromJs.decode ReceivedMessageForSystemA Decode.int
)
, ( "SharedMessage"
, MsgFromJs.succeed ReceivedSharedMessage
)
]
module ChildSystemB exposing (Msg, msgFromJsEffects)
import Effects.MsgFromJs
type Msg
= ReceivedMessageForSystemB String
| ReceivedSharedMessage
msgFromJsEffects : Effects.MsgFromJs.Effects Msg
msgFromJsEffects =
MsgFromJs.subscribe "System B"
[ ( "MessageForSystemB"
, MsgFromJs.decode ReceivedMessageForSystemB Decode.string
)
, ( "SharedMessage"
, MsgFromJs.succeed ReceivedSharedMessage
)
]
Another system may process message from JS effects
module MainSystem exposing (processMsgFromJs)
import ChildSystemA
import ChildSystemB
import Effects
import Effects.MsgFromJs
type Msg
= ChildSystemAMsg ChildSystemA.Msg
| ChildSystemBMsg ChildSystemB.Msg
| MsgFromJs (List Msg) -- In update function each message can be dispatched with `Task.perform identity (Task.succeed msg)`
| LogError String -- Error can be logged somewhere
{-| This function can be used with ports subscription
-}
processMsgFromJs : JsData.JsData -> Msg
processMsgFromJs =
MsgFromJs.decodeJsData MsgFromJs LogError <|
Effects.batch
[ Effects.MsgFromJs.map ChildSystemAMsg ChildSystemA.msgFromJsEffects
, Effects.MsgFromJs.map ChildSystemBMsg ChildSystemB.msgFromJsEffects
]
In some situations it make sense to limit system subscriptions. E.g. when one wants to make sure a system works only with messages from JS and no other subscriptions used.