elm-matrix-sdk-alpha/src/Internal/Values/Vault.elm

135 lines
3.5 KiB
Elm
Raw Normal View History

module Internal.Values.Vault exposing (..)
{-| The IVault (Internal Vault) type is the keychain of the Matrix SDK.
2023-02-17 10:30:59 +00:00
It handles all communication with the homeserver.
-}
import Dict exposing (Dict)
import Internal.Config.Leaking as L
import Internal.Tools.Hashdict as Hashdict exposing (Hashdict)
import Internal.Tools.Timestamp exposing (Timestamp)
2023-03-03 15:07:37 +00:00
import Internal.Values.Room as Room exposing (IRoom)
2023-03-15 14:32:02 +00:00
import Internal.Values.RoomInvite as Invite exposing (IRoomInvite)
import Json.Encode as E
type IVault
= IVault
{ accountData : Dict String E.Value
, invites : List IRoomInvite
, latestUpdate : Timestamp
2023-03-15 14:32:02 +00:00
, rooms : Hashdict IRoom
, since : Maybe String
}
{-| Get an account data value.
-}
accountData : String -> IVault -> Maybe E.Value
accountData key (IVault data) =
Dict.get key data.accountData
{-| Add a new `since` token to sync from.
-}
addSince : String -> IVault -> IVault
addSince since (IVault data) =
IVault { data | since = Just since }
2023-02-17 10:20:54 +00:00
2023-03-15 14:32:02 +00:00
{-| Add a new invite.
-}
addInvite : IRoomInvite -> IVault -> IVault
addInvite invite (IVault data) =
IVault { data | invites = List.append data.invites [ invite ] }
{-| Get all the invited rooms of a user.
-}
getInvites : IVault -> List IRoomInvite
getInvites (IVault data) =
data.invites
{-| Get a room from the IVault type by the room's id.
2023-03-01 11:06:01 +00:00
-}
getRoomById : String -> IVault -> Maybe IRoom
getRoomById roomId (IVault cred) =
2023-03-03 15:07:37 +00:00
Hashdict.get roomId cred.rooms
2023-02-17 10:30:59 +00:00
2023-03-03 15:07:37 +00:00
{-| Get a list of all synchronised rooms.
2023-02-17 10:30:59 +00:00
-}
getRooms : IVault -> List IRoom
getRooms (IVault { rooms }) =
2023-03-03 15:07:37 +00:00
Hashdict.values rooms
2023-02-17 10:20:54 +00:00
{-| Get the latest `since` token.
-}
getSince : IVault -> Maybe String
getSince (IVault { since }) =
since
{-| Create new empty IVault.
2023-02-17 10:30:59 +00:00
-}
init : IVault
2023-03-03 15:07:37 +00:00
init =
IVault
{ accountData = Dict.empty
, invites = []
, latestUpdate = L.originServerTs
2023-03-15 14:32:02 +00:00
, rooms = Hashdict.empty Room.roomId
2023-03-03 15:07:37 +00:00
, since = Nothing
}
insertAccountData : { content : E.Value, eventType : String, roomId : Maybe String } -> IVault -> IVault
insertAccountData { content, eventType, roomId } (IVault data) =
case roomId of
Just rId ->
getRoomById rId (IVault data)
|> Maybe.map
(Room.insertAccountData (Dict.singleton eventType content)
>> Hashdict.insert
>> (|>) data.rooms
>> (\rooms -> IVault { data | rooms = rooms })
)
|> Maybe.withDefault (IVault data)
Nothing ->
IVault { data | accountData = Dict.insert eventType content data.accountData }
{-| Add a new room to the IVault type. If a room with this id already exists, it is overwritten.
2023-02-17 10:30:59 +00:00
This function can hence also be used as an update function for rooms.
-}
insertRoom : IRoom -> IVault -> IVault
2023-03-15 14:32:02 +00:00
insertRoom room (IVault data) =
IVault
2023-03-15 14:32:02 +00:00
{ data | rooms = Hashdict.insert room data.rooms }
{-| Insert a timestamp of when a timestamp was last delivered.
-}
insertTimestamp : Timestamp -> IVault -> IVault
insertTimestamp time (IVault data) =
IVault { data | latestUpdate = time }
{-| Last time the vault was updated. Often used as an approximation.
-}
lastUpdate : IVault -> Timestamp
lastUpdate (IVault { latestUpdate }) =
latestUpdate
2023-03-15 14:32:02 +00:00
{-| Remove an invite. This is usually done when the invite has been accepted or rejected.
-}
removeInvite : String -> IVault -> IVault
removeInvite roomId (IVault data) =
IVault { data | invites = List.filter (\i -> Invite.roomId i /= roomId) data.invites }