mirror of https://github.com/waku-org/nwaku.git
62 lines
1.7 KiB
Nim
62 lines
1.7 KiB
Nim
## Contains types and utilities for pagination.
|
|
##
|
|
## Used by both message store and store protocol.
|
|
|
|
{.push raises: [Defect].}
|
|
|
|
import
|
|
./time,
|
|
nimcrypto/hash,
|
|
stew/byteutils
|
|
|
|
export hash
|
|
|
|
type
|
|
Index* = object
|
|
## This type contains the description of an Index used in the pagination of WakuMessages
|
|
digest*: MDigest[256] # calculated over payload and content topic
|
|
receiverTime*: Timestamp
|
|
senderTime*: Timestamp # the time at which the message is generated
|
|
pubsubTopic*: string
|
|
|
|
proc `==`*(x, y: Index): bool =
|
|
## receiverTime plays no role in index equality
|
|
(x.senderTime == y.senderTime) and
|
|
(x.digest == y.digest) and
|
|
(x.pubsubTopic == y.pubsubTopic)
|
|
|
|
proc cmp*(x, y: Index): int =
|
|
## compares x and y
|
|
## returns 0 if they are equal
|
|
## returns -1 if x < y
|
|
## returns 1 if x > y
|
|
##
|
|
## Default sorting order priority is:
|
|
## 1. senderTimestamp
|
|
## 2. receiverTimestamp (a fallback only if senderTimestamp unset on either side, and all other fields unequal)
|
|
## 3. message digest
|
|
## 4. pubsubTopic
|
|
|
|
if x == y:
|
|
# Quick exit ensures receiver time does not affect index equality
|
|
return 0
|
|
|
|
# Timestamp has a higher priority for comparison
|
|
let
|
|
# Use receiverTime where senderTime is unset
|
|
xTimestamp = if x.senderTime == 0: x.receiverTime
|
|
else: x.senderTime
|
|
yTimestamp = if y.senderTime == 0: y.receiverTime
|
|
else: y.senderTime
|
|
|
|
let timecmp = cmp(xTimestamp, yTimestamp)
|
|
if timecmp != 0:
|
|
return timecmp
|
|
|
|
# Continue only when timestamps are equal
|
|
let digestcmp = cmp(x.digest.data, y.digest.data)
|
|
if digestcmp != 0:
|
|
return digestcmp
|
|
|
|
return cmp(x.pubsubTopic, y.pubsubTopic)
|