135 lines
3.5 KiB
Elm
135 lines
3.5 KiB
Elm
module Internal.Values.Vault exposing (..)
|
|
|
|
{-| The IVault (Internal Vault) type is the keychain of the Matrix SDK.
|
|
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)
|
|
import Internal.Values.Room as Room exposing (IRoom)
|
|
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
|
|
, 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 }
|
|
|
|
|
|
{-| 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.
|
|
-}
|
|
getRoomById : String -> IVault -> Maybe IRoom
|
|
getRoomById roomId (IVault cred) =
|
|
Hashdict.get roomId cred.rooms
|
|
|
|
|
|
{-| Get a list of all synchronised rooms.
|
|
-}
|
|
getRooms : IVault -> List IRoom
|
|
getRooms (IVault { rooms }) =
|
|
Hashdict.values rooms
|
|
|
|
|
|
{-| Get the latest `since` token.
|
|
-}
|
|
getSince : IVault -> Maybe String
|
|
getSince (IVault { since }) =
|
|
since
|
|
|
|
|
|
{-| Create new empty IVault.
|
|
-}
|
|
init : IVault
|
|
init =
|
|
IVault
|
|
{ accountData = Dict.empty
|
|
, invites = []
|
|
, latestUpdate = L.originServerTs
|
|
, rooms = Hashdict.empty Room.roomId
|
|
, 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.
|
|
|
|
This function can hence also be used as an update function for rooms.
|
|
|
|
-}
|
|
insertRoom : IRoom -> IVault -> IVault
|
|
insertRoom room (IVault data) =
|
|
IVault
|
|
{ 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
|
|
|
|
|
|
{-| 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 }
|