@@ -57,6 +57,8 @@ type GossipEvent = {eventType: Text, pubkey: Text, server: Text, timestamp: Int,
5757
5858*forwards : [{messageId: Text, toServer: Text, createdAt: Int}]
5959
60+*ackedIds : [{messageId: Text, toKey: Text, ackedAt: Int}]
61+
6062-- ============================================
6163-- Routes
6264-- ============================================
@@ -256,6 +258,7 @@ containsLocalhostSuffix = \s ->
256258isBadServerName = \s ->
257259 let sn = toLower (stripTrailingDot s)
258260 sn == ""
261+ || take 1 sn == "."
259262 || containsBadUrlChar sn
260263 || sn == "localhost" || take 10 sn == "localhost:"
261264 || sn == "localhost.localdomain" || take 22 sn == "localhost.localdomain:"
@@ -364,6 +367,11 @@ pruneExpired = \t -> do
364367 f <- forwards
365368 where f.createdAt >= t - messageMaxAge
366369 yield f
370+ ackedIds <- *ackedIds
371+ set *ackedIds = do
372+ a <- ackedIds
373+ where a.ackedAt >= t - messageMaxAge
374+ yield a
367375 yield {expiredLocal: (do
368376 p <- presenceBefore
369377 where p.expiresAt <= t
@@ -692,6 +700,13 @@ serve = \req -> case req of
692700 set *messages = case session of
693701 Nothing {} -> messages
694702 Just {value: _} -> diff messages ackedMessages
703+ let ackedFederated = do
704+ m <- ackedMessages
705+ where not (m.originServer == "")
706+ where not (m.originServer == serverHost)
707+ yield {messageId: m.messageId, toKey: m.toKey, ackedAt: t}
708+ ackedIds <- *ackedIds
709+ set *ackedIds = union ackedIds ackedFederated
695710 let ok = case session of
696711 Nothing {} -> False {}
697712 _ -> True {}
@@ -966,7 +981,7 @@ serve = \req -> case req of
966981 let effectiveEvents = do
967982 e <- validEvents
968983 where count (do a <- gossipResult.appliedKeys; where a.pubkey == normalizeHex e.pubkey; where a.server == normalizeServerName e.server; yield a) > 0
969− yield {eventType: e.eventType, pubkey: normalizeHex e.pubkey, server: normalizeServerName e.server, timestamp: e.timestamp, ttl: e.ttl}
984+ yield {eventType: e.eventType, pubkey: normalizeHex e.pubkey, server: normalizeServerName e.server, timestamp: e.timestamp, ttl: clampTtl e.ttl}
970985 respond {ok: validRequest}
971986 if not gossipResult.withinCapacity
972987 then println ("gossip: presence at capacity (" ++ show maxPresenceEntries ++ "), limiting new entries from " ++ fromServer)
@@ -1008,12 +1023,19 @@ serve = \req -> case req of
10081023 where m.toKey == toKey
10091024 where m.receivedAt >= t - messageMaxAge
10101025 yield m)
1011− let exists = count (do
1026+ let existsInMessages = count (do
10121027 m <- messages
10131028 where m.messageId == messageId
10141029 where m.toKey == toKey
10151030 where m.receivedAt >= t - messageMaxAge
10161031 yield m) > 0
1032+ ackedIds <- *ackedIds
1033+ let existsInAcked = count (do
1034+ a <- ackedIds
1035+ where a.messageId == messageId
1036+ where a.toKey == toKey
1037+ yield a) > 0
1038+ let exists = existsInMessages || existsInAcked
10171039 let shouldInsert = authorized && validOrigin && validFields && not exists && recipientMsgCount < maxMessagesPerRecipient
10181040 set *seqCounter = if shouldInsert then seqTs else seqCounter
10191041 set *messages = if shouldInsert