Encode ws messages as JSON

This commit is contained in:
eikek
2021-11-11 21:55:31 +01:00
parent d0f3d54060
commit cf933b60a7
10 changed files with 99 additions and 46 deletions

View File

@ -19,6 +19,7 @@ import Api.Model.VersionInfo exposing (VersionInfo)
import Browser exposing (UrlRequest)
import Browser.Navigation exposing (Key)
import Data.Flags exposing (Flags)
import Data.ServerEvent exposing (ServerEvent)
import Data.UiSettings exposing (StoredUiSettings, UiSettings)
import Data.UiTheme exposing (UiTheme)
import Http
@ -192,7 +193,7 @@ type Msg
| SetLanguage UiLanguage
| ClientSettingsSaveResp UiSettings (Result Http.Error BasicResult)
| ReceiveBrowserSettings StoredUiSettings
| ReceiveWsMessage String
| ReceiveWsMessage (Result String ServerEvent)
| ToggleShowNewItemsArrived

View File

@ -310,12 +310,8 @@ updateWithSub msg model =
updateUserSettings texts lm model
ReceiveWsMessage data ->
let
se =
Data.ServerEvent.fromString data
in
case se of
Just ItemProcessed ->
case data of
Ok ItemProcessed ->
let
newModel =
{ model | showNewItemsArrived = True }
@ -327,7 +323,10 @@ updateWithSub msg model =
_ ->
( newModel, Cmd.none, Sub.none )
Nothing ->
Ok (JobsWaiting n) ->
( model, Cmd.none, Sub.none )
Err err ->
( model, Cmd.none, Sub.none )
ToggleShowNewItemsArrived ->

View File

@ -5,18 +5,37 @@
-}
module Data.ServerEvent exposing (ServerEvent(..), fromString)
module Data.ServerEvent exposing (ServerEvent(..), decode)
import Json.Decode as D
type ServerEvent
= ItemProcessed
| JobsWaiting Int
fromString : String -> Maybe ServerEvent
fromString str =
case String.toLower str of
decoder : D.Decoder ServerEvent
decoder =
D.field "tag" D.string
|> D.andThen decodeTag
decode : D.Value -> Result String ServerEvent
decode json =
D.decodeValue decoder json
|> Result.mapError D.errorToString
decodeTag : String -> D.Decoder ServerEvent
decodeTag tag =
case tag of
"item-processed" ->
Just ItemProcessed
D.succeed ItemProcessed
"jobs-waiting" ->
D.field "content" D.int
|> D.map JobsWaiting
_ ->
Nothing
D.fail ("Unknown tag: " ++ tag)

View File

@ -93,5 +93,5 @@ subscriptions model =
Sub.batch
[ model.subs
, Ports.receiveUiSettings ReceiveBrowserSettings
, Ports.receiveWsMessage ReceiveWsMessage
, Ports.receiveServerEvent ReceiveWsMessage
]

View File

@ -10,8 +10,8 @@ port module Ports exposing
, initClipboard
, printElement
, receiveCheckQueryResult
, receiveServerEvent
, receiveUiSettings
, receiveWsMessage
, removeAccount
, requestUiSettings
, setAccount
@ -20,8 +20,10 @@ port module Ports exposing
import Api.Model.AuthResult exposing (AuthResult)
import Data.QueryParseResult exposing (QueryParseResult)
import Data.ServerEvent exposing (ServerEvent)
import Data.UiSettings exposing (StoredUiSettings)
import Data.UiTheme exposing (UiTheme)
import Json.Decode as D
{-| Save the result of authentication to local storage.
@ -58,7 +60,7 @@ port printElement : String -> Cmd msg
{-| Receives messages from the websocket.
-}
port receiveWsMessage : (String -> msg) -> Sub msg
port receiveWsMessage : (D.Value -> msg) -> Sub msg
@ -68,3 +70,8 @@ port receiveWsMessage : (String -> msg) -> Sub msg
setUiTheme : UiTheme -> Cmd msg
setUiTheme theme =
internalSetUiTheme (Data.UiTheme.toString theme)
receiveServerEvent : (Result String ServerEvent -> msg) -> Sub msg
receiveServerEvent tagger =
receiveWsMessage (Data.ServerEvent.decode >> tagger)

View File

@ -157,8 +157,12 @@ function initWS() {
console.log("Initialize websocket at " + url);
dsWebSocket = new WebSocket(url);
dsWebSocket.addEventListener("message", function(event) {
if (event.data != "keep-alive" && event.data) {
elmApp.ports.receiveWsMessage.send(event.data);
if (event.data) {
var dataJSON = JSON.parse(event.data);
if (dataJSON.tag !== "keep-alive") {
elmApp.ports.receiveWsMessage.send(dataJSON);
}
}
});
}