choonkeat / elm-webapp / 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
, Platform.Cmd.Cmd msg )
, update : msg -> model -> ( model
, Platform.Cmd.Cmd msg )
, subscriptions : model -> Platform.Sub.Sub msg 
}

This is the input to create a Platform.worker


type alias Ports msg x serverMsg =
{ writeResponse : HTTP.Request -> HTTP.Response -> Platform.Cmd.Cmd (FrameworkMsg msg x serverMsg)
, onHttpRequest : (Json.Encode.Value -> FrameworkMsg msg x serverMsg) -> Platform.Sub.Sub (FrameworkMsg msg x serverMsg)
, onWebsocketEvent : (Json.Encode.Value -> FrameworkMsg msg x serverMsg) -> Platform.Sub.Sub (FrameworkMsg msg x serverMsg)
, writeWebsocketMessage : Websocket.Connection -> Websocket.Key -> String -> Platform.Cmd.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 : Time.Posix -> model -> Json.Decode.Decoder header
, clientMsgDecoder : Json.Decode.Decoder clientMsg
, updateFromClient : header -> Time.Posix -> clientMsg -> model -> ( model
, Platform.Task x serverMsg )
, serverMsgEncoder : serverMsg -> Json.Encode.Value
, errorEncoder : x -> Json.Encode.Value
, routeDecoder : Url -> Maybe route
, httpEndpoint : String
, updateFromRoute : ( HTTP.Method
, header
, Maybe route ) -> Time.Posix -> HTTP.Request -> model -> ( model
, Platform.Cmd.Cmd msg ) 
}

A set of required protocols.


type alias Program flags model header msg x serverMsg =
Platform.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 : { worker : PlatformWorker flags model msg, ports : Ports msg x serverMsg, protocol : Protocol msg x serverMsg clientMsg endpoint header model } -> Platform.Program flags (FrameworkModel model header) (FrameworkMsg msg x serverMsg)

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

writeResponse : (Json.Encode.Value -> Platform.Cmd.Cmd msg) -> HTTP.Request -> HTTP.Response -> Platform.Cmd.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 : (Json.Encode.Value -> Platform.Cmd.Cmd msg) -> Websocket.Connection -> Websocket.Key -> String -> Platform.Cmd.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