nim-mvds/mvds/Message.nim
Luke Parker 1539076cd8 Add support for protobuf-serialization 0.2.0.
Does not break support for 0.1.0 thanks to a provided shim.
2020-07-23 20:23:29 -05:00

48 lines
1.3 KiB
Nim

import times
import stew/endians2
import nimcrypto
import protobuf_serialization
#Shim until https://github.com/status-im/nim-protobuf-serialization/pull/5 is merged.
when not defined(protobuf3):
template protobuf3() {.pragma.}
type
Message* {.protobuf3.} = ref object
group* {.fieldNumber: 1.}: seq[byte] #Assigned into a group by developer, not protocol.
time* {.pint, fieldNumber: 2.}: int64
body* {.fieldNumber: 3.}: seq[byte]
id {.dontSerialize.}: seq[byte]
Payload* {.protobuf3.} = object
acks* {.fieldNumber: 1.}: seq[seq[byte]]
offers* {.fieldNumber: 2.}: seq[seq[byte]]
requests* {.fieldNumber: 3.}: seq[seq[byte]]
messages* {.fieldNumber: 4.}: seq[Message]
proc id*(msg: Message): seq[byte] =
if msg.id.len == 0:
msg.id = @(
sha256.digest(
cast[seq[byte]]("MESSAGE_ID") &
msg.group &
@(uint64(msg.time).toBytesLE()) &
msg.body
).data
)
result = msg.id
proc newMessage*(group: seq[byte], body: seq[byte], time: int64 = getTime().toUnix()): Message {.inline.} =
Message(
group: group,
time: time,
body: body
)
when defined MVDS_TESTS:
proc `==`*(lhs: Message, rhs: Message): bool {.inline.} =
(lhs.group == rhs.group) and
(lhs.time == rhs.time) and
(lhs.body == rhs.body)