elm-port-funnel
elm-port-funnel copied to clipboard
Funnel ALL your port modules through a single pair of ports
Funneling Your Ports
billstclair/elm-port-funnel allows you to use a single outgoing/incoming pair of port
s to communicate with the JavaScript for any number of PortFunnel
-aware modules, which I'm going to call "funnels".
On the JavaScript side, you pick a directory for PortFunnel.js
and the JavaScript files for the funnels. Some boilerplate JS in your index.html
file loads PortFunnel.js
, and tells it the names of the funnels. It takes care of loading them and wiring them up.
On the Elm side, you create the two ports, tell the PortFunnel
module about them with a ModuleDesc
instance, call the action functions in the funnel modules, in response to events, and dispatch off of the name
field in the GenericMessage
you get from your subscription port, to process
that message in each specific module, and handle its Result
. This is illustrated by three top-level applications in the example directory.
DEVELOPERS-GUIDE.md has details for people who want to write funnels. For simple examples, see the files Echo.elm
and AddXY.elm
in the src/PortFunnel
directory, and the corresponding Echo.js
and AddXY.js
files in the example/site/js/PortFunnel
directory.
The README in the example directory tells you how to configure the JavaScript for your own funnels. The main example is live at billstclair.github.io/elm-port-funnel.
Existing PortFunnel Modules
PortFunnel.Echo
and PortFunnel.AddXY
, which ship with billstclair/elm-port-funnel
, are the simple, canonical example modules. Below is a list of other funnel modules. If you write one, please add it to this list by submitting a pull request on this README file.
-
An interface to
window.crypto.getRandomValues()
for generating cryptographically secure random numbers. -
An interface to the
localStorage
mechanism, for persistent storage. -
billstclair/elm-websocket-client
A port-based replacement for the Elm 0.18
elm-lang/websocket
package, which has not yet been upgraded to Elm 0.19. -
A port-based replacement for the Elm 0.18
elm-lang/geolocation
package, which was not upgraded when Elm 0.19 shipped, and may never be.
Credit
Thank you to Murphy Randall (@splodingsocks on Twitter and Elm Slack), whose elm-conf 2017 talk introduced me to the idea that billstclair/elm-port-funnel
takes to its logical extreme.