Skip to content

Commit

Permalink
refactor(enr): added waku2 capabilities accessor
Browse files Browse the repository at this point in the history
  • Loading branch information
Lorenzo Delgado committed Mar 22, 2023
1 parent d920b97 commit 157724d
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 35 deletions.
66 changes: 42 additions & 24 deletions tests/v2/test_waku_enr.nim
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,13 @@ suite "Waku ENR - Capabilities bitfield":
check recordRes.isOk()
let record = recordRes.tryGet()

let bitfieldRes = record.getCapabilitiesField()
check bitfieldRes.isOk()
let typedRecord = record.toTyped()
require typedRecord.isOk()

let bitfield = bitfieldRes.tryGet()
let bitfieldOpt = typedRecord.value.waku2
check bitfieldOpt.isSome()

let bitfield = bitfieldOpt.get()
check:
bitfield.toCapabilities() == @[Capabilities.Relay, Capabilities.Store]

Expand All @@ -69,12 +72,15 @@ suite "Waku ENR - Capabilities bitfield":
let record = Record.init(1, enrkey, wakuFlags=some(caps))

## When
let bitfieldRes = record.getCapabilitiesField()
let typedRecord = record.toTyped()
require typedRecord.isOk()

let bitfieldOpt = typedRecord.value.waku2

## Then
check bitfieldRes.isOk()
check bitfieldOpt.isSome()

let bitfield = bitfieldRes.tryGet()
let bitfield = bitfieldOpt.get()
check:
bitfield.toCapabilities() == @[Capabilities.Relay, Capabilities.Store]

Expand All @@ -87,14 +93,13 @@ suite "Waku ENR - Capabilities bitfield":
let record = EnrBuilder.init(enrPrivKey, enrSeqNum).build().tryGet()

## When
let bitfieldRes = record.getCapabilitiesField()
let typedRecord = record.toTyped()
require typedRecord.isOk()

## Then
check bitfieldRes.isErr()
let bitfieldOpt = typedRecord.value.waku2

let err = bitfieldRes.tryError()
check:
err == "Key not found in ENR"
## Then
check bitfieldOpt.isNone()

test "check capabilities on a waku node record":
## Given
Expand All @@ -107,12 +112,19 @@ suite "Waku ENR - Capabilities bitfield":
require waku_enr.fromBase64(record, wakuRecord)

## Then
let typedRecordRes = record.toTyped()
require typedRecordRes.isOk()

let bitfieldOpt = typedRecordRes.value.waku2
require bitfieldOpt.isSome()

let bitfield = bitfieldOpt.get()
check:
record.supportsCapability(Relay) == true
record.supportsCapability(Store) == true
record.supportsCapability(Filter) == false
record.supportsCapability(Lightpush) == false
record.getCapabilities() == @[Capabilities.Relay, Capabilities.Store]
bitfield.supportsCapability(Capabilities.Relay) == true
bitfield.supportsCapability(Capabilities.Store) == true
bitfield.supportsCapability(Capabilities.Filter) == false
bitfield.supportsCapability(Capabilities.Lightpush) == false
bitfield.toCapabilities() == @[Capabilities.Relay, Capabilities.Store]

test "check capabilities on a non-waku node record":
## Given
Expand All @@ -122,16 +134,22 @@ suite "Waku ENR - Capabilities bitfield":
"Y3AyNTZrMaEDhpehBDbZjM_L9ek699Y7vhUJ-eAdMyQW_Fil522Y0fODdGNwgiMog3VkcIIjKA"

## When
var nonWakuEnrRecord: Record
require waku_enr.fromURI(nonWakuEnrRecord, nonWakuEnr)
var record: Record
require waku_enr.fromURI(record, nonWakuEnr)

## Then
let typedRecordRes = record.toTyped()
require typedRecordRes.isOk()

let bitfieldOpt = typedRecordRes.value.waku2
check bitfieldOpt.isNone()

check:
nonWakuEnrRecord.getCapabilities() == []
nonWakuEnrRecord.supportsCapability(Relay) == false
nonWakuEnrRecord.supportsCapability(Store) == false
nonWakuEnrRecord.supportsCapability(Filter) == false
nonWakuEnrRecord.supportsCapability(Lightpush) == false
record.getCapabilities() == []
record.supportsCapability(Capabilities.Relay) == false
record.supportsCapability(Capabilities.Store) == false
record.supportsCapability(Capabilities.Filter) == false
record.supportsCapability(Capabilities.Lightpush) == false


suite "Waku ENR - Multiaddresses":
Expand Down
33 changes: 22 additions & 11 deletions waku/v2/protocol/waku_enr.nim
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ type

## See: https://rfc.vac.dev/spec/31/#waku2-enr-key
## each enum numbers maps to a bit (where 0 is the LSB)
# TODO: Make this enum {.pure.}
Capabilities* = enum
Capabilities*{.pure.} = enum
Relay = 0,
Store = 1,
Filter = 2,
Expand Down Expand Up @@ -82,24 +81,36 @@ proc withWakuCapabilities*(builder: var EnrBuilder, caps: openArray[Capabilities

# ENR record accessors (e.g., Record, TypedRecord, etc.)

proc getCapabilitiesField*(r: Record): EnrResult[CapabilitiesBitfield] =
let field = ?r.get(CapabilitiesEnrField, seq[uint8])
ok(CapabilitiesBitfield(field[0]))
func waku2*(record: TypedRecord): Option[CapabilitiesBitfield] =
let field = record.tryGet(CapabilitiesEnrField, seq[uint8])
if field.isNone():
return none(CapabilitiesBitfield)

some(CapabilitiesBitfield(field.get()[0]))

proc supportsCapability*(r: Record, cap: Capabilities): bool =
let bitfield = getCapabilitiesField(r)
if bitfield.isErr():
let recordRes = r.toTyped()
if recordRes.isErr():
return false

bitfield.value.supportsCapability(cap)
let bitfieldOpt = recordRes.value.waku2
if bitfieldOpt.isNone():
return false

let bitfield = bitfieldOpt.get()
bitfield.supportsCapability(cap)

proc getCapabilities*(r: Record): seq[Capabilities] =
let bitfield = getCapabilitiesField(r)
if bitfield.isErr():
let recordRes = r.toTyped()
if recordRes.isErr():
return @[]

let bitfieldOpt = recordRes.value.waku2
if bitfieldOpt.isNone():
return @[]

bitfield.value.toCapabilities()
let bitfield = bitfieldOpt.get()
bitfield.toCapabilities()


## Multiaddress
Expand Down

0 comments on commit 157724d

Please sign in to comment.