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/
A fairly ergonomic elm websockets implementation.
See example/ for a simple Websocket chat demo
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 msgThen 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
)
-- ...