Как заставить websockets работать в Elm 0.19 - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь перейти с версии 0.18 до 0.19 вяза. Мой проект зависит от elm-lang/websocket в 0,18? Я не могу найти эквивалентный пакет в 0.19. Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Вот минимальный рабочий пример интерактивной формы для вывода ввода с echo.websocket.org с использованием 2 простых портов ввода / вывода для связи с объектом JavaScript WebSocket, внешним по отношению к модулю elm 0.19:

Файл: echo.elm. Компилировать с: elm make echo.elm --output=echo.js

port module Main exposing (main)

import Browser
import Html exposing (Html)
import Html.Attributes as HA
import Html.Events as HE
import Json.Encode as JE

-- JavaScript usage: app.ports.websocketIn.send(response);
port websocketIn : (String -> msg) -> Sub msg
-- JavaScript usage: app.ports.websocketOut.subscribe(handler);
port websocketOut : String -> Cmd msg

main = Browser.element
    { init = init
    , update = update
    , view = view
    , subscriptions = subscriptions
    }

{- MODEL -}

type alias Model =
    { responses : List String
    , input : String
    }

init : () -> (Model, Cmd Msg)
init _ =
    ( { responses = []
      , input = ""
      }
    , Cmd.none
    )

{- UPDATE -}

type Msg = Change String
    | Submit String
    | WebsocketIn String

update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  case msg of
    Change input ->
      ( { model | input = input }
      , Cmd.none
      )
    Submit value ->
      ( model
      , websocketOut value
      )
    WebsocketIn value ->
      ( { model | responses = value :: model.responses }
      , Cmd.none
      )

{- SUBSCRIPTIONS -}

subscriptions : Model -> Sub Msg
subscriptions model =
    websocketIn WebsocketIn

{- VIEW -}

li : String -> Html Msg
li string = Html.li [] [Html.text string]

view : Model -> Html Msg
view model = Html.div []
    --[ Html.form [HE.onSubmit (WebsocketIn model.input)] -- Short circuit to test without ports
    [ Html.form [HE.onSubmit (Submit model.input)]
      [ Html.input [HA.placeholder "Enter some text.", HA.value model.input, HE.onInput Change] []
      , model.responses |> List.map li |> Html.ol []
      ]
    ]

Вставить скомпилированный echo.js в echo.html:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Echo</title>
  <script src="echo.js"></script>
</head>
<body>
  <div id="elm-node"></div>
  <script>
    var app = Elm.Main.init({node: document.getElementById("elm-node")});
    var ws = new WebSocket("wss://echo.websocket.org");
    ws.onmessage = function(message)
    {
        console.log(message);
        app.ports.websocketIn.send(JSON.stringify({data:message.data,timeStamp:message.timeStamp}));
    };
    app.ports.websocketOut.subscribe(function(msg) { ws.send(msg); });
  </script>
</body>
</html>

Это работает на Firefox 60.2.0esr в Linux, но не тестировалось на других платформах.

Опять же, это только минимальный пример, демонстрирующий, как использовать порты с WebSockets для Elm 0.19. Он не включает закрытие WebSocket, обработку ошибок и т. Д., Но, надеюсь, этот пример поможет вам начать работу в этом направлении. Ожидается, что в скором времени WebSockets будет напрямую поддерживаться Elm, так что это всего лишь временное решение. Если вам не нужно повышать до 0,19, тогда подумайте о том, чтобы остаться с 0,18.

0 голосов
/ 25 августа 2018

Пакет websocket в настоящее время переработан для Elm 0.19, см. этот выпуск :

Этот пакет еще не обновлялся для версии 0.19. Я слышал, как многие люди говорили, что им нужно больше возможностей из этого пакета, поэтому я предпочел бы принять это во внимание в обновлении, а не делать то же самое. Я рекомендую использовать порты или 0,18, если вам абсолютно необходимо это право в эту секунду.

...