choonkeat/elm-fullstack/4.0.0

NOTE: the latest version is 4.0.1

Renamed to choonkeat/elm-webapp. It is published under that name, and new versions come out there.

Versions published as choonkeat/elm-fullstack still install under that name. 4 versions of 7 come from the new location (see their notes). 3 versions could not be recovered and cannot be installed.

Unavailable. Nobody can download this version any more, with elm or with the Lamdera compiler: github.com/choonkeat/elm-webapp exists but has no tag 4.0.0; Software Heritage has no tag 4.0.0 for it; no fork with tag 4.0.0 found (15 same-name repos checked); no cached copy. Use another version.

Details

Fullstack.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 =
        Fullstack.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 Fullstack.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 : Fullstack.Server.Program Flags ServerState RequestContext Msg Error MsgFromServer
main =
    Fullstack.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 Fullstack.Server program, capable of communicating with Fullstack.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 =
    Fullstack.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 =
    Fullstack.Server.writeWebsocketMessage writeWs