mirror of
https://github.com/waku-org/nwaku.git
synced 2025-02-05 19:43:41 +00:00
f54ba10bc7
* queue driver refactor (#2753) * chore(archive): archive refactor (#2752) * chore(archive): sqlite driver refactor (#2754) * chore(archive): postgres driver refactor (#2755) * chore(archive): renaming & copies (#2751) * posgres legacy: stop using the storedAt field * migration script 6: we still need the id column The id column is needed because it contains the message digest which is used in store v2, and we need to keep support to store v2 for a while * legacy archive: set target migration version to 6 * waku_node: try to use wakuLegacyArchive if wakuArchive is nil * node_factory, waku_node: mount legacy and future store simultaneously We want the nwaku node to simultaneously support store-v2 requests and store-v3 requests. Only the legacy archive is in charge of archiving messages, and the archived information is suitable to fulfill both store-v2 and store-v3 needs. * postgres_driver: adding temporary code until store-v2 is removed --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> Co-authored-by: gabrielmer <101006718+gabrielmer@users.noreply.github.com> Co-authored-by: Ivan Folgueira Bande <ivansete@status.im>
88 lines
2.2 KiB
Nim
88 lines
2.2 KiB
Nim
when (NimMajor, NimMinor) < (1, 4):
|
|
{.push raises: [Defect].}
|
|
else:
|
|
{.push raises: [].}
|
|
|
|
import std/options, results, stew/byteutils, stew/arrayops, nimcrypto/sha2
|
|
import ../waku_core, ../common/paging
|
|
|
|
## Waku message digest
|
|
|
|
type MessageDigest* = MDigest[256]
|
|
|
|
proc fromBytes*(T: type MessageDigest, src: seq[byte]): T =
|
|
var data: array[32, byte]
|
|
|
|
let byteCount = copyFrom[byte](data, src)
|
|
|
|
assert byteCount == 32
|
|
|
|
return MessageDigest(data: data)
|
|
|
|
proc computeDigest*(msg: WakuMessage): MessageDigest =
|
|
var ctx: sha256
|
|
ctx.init()
|
|
defer:
|
|
ctx.clear()
|
|
|
|
ctx.update(msg.contentTopic.toBytes())
|
|
ctx.update(msg.payload)
|
|
|
|
# Computes the hash
|
|
return ctx.finish()
|
|
|
|
## Public API types
|
|
|
|
type
|
|
#TODO Once Store v2 is removed, the cursor becomes the hash of the last message
|
|
ArchiveCursor* = object
|
|
digest*: MessageDigest
|
|
storeTime*: Timestamp
|
|
senderTime*: Timestamp
|
|
pubsubTopic*: PubsubTopic
|
|
hash*: WakuMessageHash
|
|
|
|
ArchiveQuery* = object
|
|
includeData*: bool # indicate if messages should be returned in addition to hashes.
|
|
pubsubTopic*: Option[PubsubTopic]
|
|
contentTopics*: seq[ContentTopic]
|
|
cursor*: Option[ArchiveCursor]
|
|
startTime*: Option[Timestamp]
|
|
endTime*: Option[Timestamp]
|
|
hashes*: seq[WakuMessageHash]
|
|
pageSize*: uint
|
|
direction*: PagingDirection
|
|
|
|
ArchiveResponse* = object
|
|
hashes*: seq[WakuMessageHash]
|
|
messages*: seq[WakuMessage]
|
|
topics*: seq[PubsubTopic]
|
|
cursor*: Option[ArchiveCursor]
|
|
|
|
ArchiveErrorKind* {.pure.} = enum
|
|
UNKNOWN = uint32(0)
|
|
DRIVER_ERROR = uint32(1)
|
|
INVALID_QUERY = uint32(2)
|
|
|
|
ArchiveError* = object
|
|
case kind*: ArchiveErrorKind
|
|
of DRIVER_ERROR, INVALID_QUERY:
|
|
# TODO: Add an enum to be able to distinguish between error causes
|
|
cause*: string
|
|
else:
|
|
discard
|
|
|
|
ArchiveResult* = Result[ArchiveResponse, ArchiveError]
|
|
|
|
proc `$`*(err: ArchiveError): string =
|
|
case err.kind
|
|
of ArchiveErrorKind.DRIVER_ERROR:
|
|
"DIRVER_ERROR: " & err.cause
|
|
of ArchiveErrorKind.INVALID_QUERY:
|
|
"INVALID_QUERY: " & err.cause
|
|
of ArchiveErrorKind.UNKNOWN:
|
|
"UNKNOWN"
|
|
|
|
proc invalidQuery*(T: type ArchiveError, cause: string): T =
|
|
ArchiveError(kind: ArchiveErrorKind.INVALID_QUERY, cause: cause)
|