kageurufu/elm-websockets/1.0.0

NOTE: the latest version is 1.0.1

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/kageurufu/elm-websockets.

What we checked: Tag 1.0.0 is still on github.com/kageurufu/elm-websockets; its commit be3d79f38887 is from 2024-02-19 19:14 UTC, before the version was published (2024-02-19 19:16 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/kageurufu/elm-websockets/zipball/1.0.0/

frank/websockets

A fairly ergonomic elm websockets implementation.

See example/ for a simple Websocket chat demo

Getting started

Reference ports.websocket.js in your html (For deployment, you copy this somewhere into your application).

<script src="//raw.githubusercontent.com/kageurufu/elm-websockets/master/dist/ports.websocket.js"></script>
<script>
  var app = Elm.Main.init();
  initWebsockets(app);
</script>

Define the two necessary ports

-- src/Ports.elm
port module Ports exposing (socket)

import Websockets


port webSocketCommand : Websockets.CommandPort msg


port webSocketEvent : Websockets.EventPort msg

Then get your Command and Event methods

socket : Websockets.Methods msg
socket =
    Websockets.withPorts
        { command = webSocketCommand
        , event = webSocketEvent
        }

Define your messages and subscriptions

type Msg
    = -- ...
    | SocketOpened Websockets.WebsocketOpened
    | SocketMessage Websockets.WebsocketMessage
    | SocketClosed Websockets.WebsocketClosed
    | SocketError Websockets.WebsocketError
    | NoOp

subscriptions model =
    socket.onEvent
        { onOpened = SocketOpened
        , onClosed = SocketClosed
        , onError = SocketError
        , onMessage = SocketMessage
        , onDecodeError = always NoOp
        }

And start using Websockets!


encodeMessage = Encode.string
decodeMessage = Decode.decodeString Decode.String

init flags =
    ({ messages : List String }
    , socket.open "chat" "wss://my-socket-url/ws" [("metadata","chat")])

update msg model =
    case msg of
        SocketOpened { name } ->
            (model, socket.send name (encodeMessage "I opened a socket!"))
        SocketMessage { name, data } ->
            case decodeMessage of
                Ok message ->
                    ( { model | messages = model.messages ++ [message] }
                    , Cmd.none
                    )
        -- ...