choonkeat/elm-webapp/3.0.1

NOTE: the latest version is 3.0.2

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

Rerouted (regenerated, verified). Same repository and tag, but GitHub now builds the zip with different bytes, so it no longer matches the SHA-1 package.elm-lang.org recorded. The Lamdera package server serves a copy recovered from https://github.com/choonkeat/elm-webapp.

What we checked: Tag 3.0.1 is still on github.com/choonkeat/elm-webapp; its commit 97b0974d1edb is from 2021-10-10 01:51 UTC, before the version was published (2021-10-10 01:52 UTC); elm.json is byte-identical to package.elm-lang.org's; the exposed modules match docs.json; the zip's SHA-1 is not the published one (GitHub's zip no longer comes out byte for byte the same), so the contents were checked instead.

The Lamdera compiler uses this copy and prints a one-line notice saying so. elm itself fails to download this version.

Details · package.elm-lang.org's zip: https://github.com/choonkeat/elm-webapp/zipball/3.0.1/

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 : Posix -> 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
, httpEndpoint : String
, 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