choonkeat/elm-webapp/2.0.0

NOTE: the latest version is 3.0.2

Formerly choonkeat/create-elm-server, choonkeat/elm-fullstack. Search finds this package by either name.

Webapp.Server

The README is better for getting an understanding and for getting started. In general we'd just use the code generated by elm-webapp cli without the need to reference here.

However, the documentation for Webapp.Server.HTTP is useful esp for functions available to work with Request values.

Definition

type alias PlatformWorker flags model msg =
{ init : flags -> ( model, Cmd msg )
, update : msg -> model -> ( model, Cmd msg )
, subscriptions : model -> Sub msg
}

This is the input to create a Platform.worker

type alias Ports msg x serverMsg =
{ writeResponse :
Request -> Response -> Cmd (FrameworkMsg msg x serverMsg)
, onHttpRequest :
(Value -> FrameworkMsg msg x serverMsg)
-> Sub (FrameworkMsg msg x serverMsg)
, onWebsocketEvent :
(Value -> FrameworkMsg msg x serverMsg)
-> Sub (FrameworkMsg msg x serverMsg)
, writeWebsocketMessage :
Connection -> Key -> String -> Cmd (FrameworkMsg msg x serverMsg)
}

A set of required ports

- `writeResponse` is your function created with your port `onHttpResponse`


    port onHttpResponse : Json.Encode.Value -> Cmd msg


    writeResponse =
        Webapp.Server.writeResponse onHttpResponse






- `onHttpRequest` is a port defined in your `Server.elm`


    port onHttpRequest : (Json.Encode.Value -> msg) -> Sub msg
type alias Protocol msg x serverMsg clientMsg route header model =
{ headerDecoder : model -> Decoder header
, clientMsgDecoder : Decoder clientMsg
, updateFromClient :
header -> Posix -> clientMsg -> model -> ( model, Task x serverMsg )
, serverMsgEncoder : serverMsg -> Value
, errorEncoder : x -> Value
, routeDecoder : Url -> Maybe route
, updateFromRoute :
( Method, header, Maybe route )
-> Posix
-> Request
-> model
-> ( model, Cmd msg )
}

A set of required protocols.

  • headerDecoder decoded value will be made available to updateFromRoute and updateFromClient
  • clientMsgDecoder decodes the request body IF request was sent from Client sendToServer
    • updateFromClient is called if clientMsgDecoder succeeds
    • serverMsgEncoder encodes the response body for a successful clientMsgDecoder
    • errorEncoder encodes the response body for a failed clientMsgDecoder
  • routeDecoder decodes a Url.Url; if successful, updateFromRoute will be called
    • updateFromRoute is called as long as headerDecoder succeeds
    • otherwise Webapp.Server will respond with error 500
type alias Program flags model header msg x serverMsg =
Program
flags
(FrameworkModel model header)
(FrameworkMsg msg x serverMsg)

Exported type to enable apps to write their type signature of main, e.g.

main : Webapp.Server.Program Flags ServerState RequestContext Msg Error MsgFromServer
main =
    Webapp.Server.worker { ... }

Common Helpers

{ worker : PlatformWorker flags model msg
, ports : Ports msg x serverMsg
, protocol :
Protocol msg x serverMsg clientMsg endpoint header model
}
-> Program
flags
(FrameworkModel model header)
(FrameworkMsg msg x serverMsg)

Returns a Webapp.Server program, capable of communicating with Webapp.Client program

writeResponse : (Value -> Cmd msg) -> Request -> Response -> Cmd msg

Use this to wire up your port in your own Server.elm

port onHttpResponse : Json.Encode.Value -> Cmd msg


writeResponse =
    Webapp.Server.writeResponse onHttpResponse
writeWebsocketMessage : (Value -> Cmd msg) -> Connection -> Key -> String -> Cmd msg

Use this to wire up your port in your own Server.elm via websocket

port writeWs : Json.Encode.Value -> Cmd msg


writeWebsocketMessage =
    Webapp.Server.writeWebsocketMessage writeWs