mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-22 10:28:27 +00:00
Encode ws messages as JSON
This commit is contained in:
@ -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
|
||||
|
||||
|
||||
|
@ -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 ->
|
||||
|
@ -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)
|
||||
|
@ -93,5 +93,5 @@ subscriptions model =
|
||||
Sub.batch
|
||||
[ model.subs
|
||||
, Ports.receiveUiSettings ReceiveBrowserSettings
|
||||
, Ports.receiveWsMessage ReceiveWsMessage
|
||||
, Ports.receiveServerEvent ReceiveWsMessage
|
||||
]
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
Reference in New Issue
Block a user