choonkeat/elm-webapp/1.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

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
-> { statusCode : StatusCode
, headers : List ( String, Value )
, body : String
}
-> 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

(Value -> Cmd msg)
-> Request
-> { statusCode : StatusCode
, headers : List ( String, Value )
, body : String
}
-> 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