Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(store): simplify wakunode2 configuration options #1293

Merged
merged 1 commit into from
Oct 26, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 87 additions & 25 deletions apps/wakunode2/config.nim
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
import
std/strutils,
std/[strutils, nre],
stew/results,
chronicles,
chronos,
confutils,
confutils/defs,
confutils/std/net,
confutils/toml/defs as confTomlDefs,
confutils/toml/std/net as confTomlNet,
chronicles,
chronos,
libp2p/crypto/crypto,
libp2p/crypto/secp,
nimcrypto/utils

export
confTomlDefs,
confTomlNet


type ConfResult*[T] = Result[T, string]

type
WakuNodeConf* = object
Expand Down Expand Up @@ -63,25 +67,32 @@ type
defaultValue: 50
name: "max-connections" }: uint16

## Persistence config
peerPersistence* {.
desc: "Enable peer persistence.",
defaultValue: false,
name: "peer-persistence" }: bool

# TODO: Deprecated. Remove in next release
persistPeers* {.
desc: "DEPRECATED: Use '--peer-persistence' instead.",
defaultValue: false,
name: "persist-peers" }: bool

# TODO: Deprecated. Remove in next release
dbPath* {.
desc: "The database path for peristent storage",
defaultValue: ""
desc: "DEPRECATED: Use '--store-message-db-url' instead",
defaultValue: "",
name: "db-path" }: string


# TODO: Deprecated. Remove in next release
dbVacuum* {.
desc: "Enable database vacuuming at start: true|false",
defaultValue: false
desc: "DEPRECATED: Use '--store-message-db-vacuum' instead",
defaultValue: false,
name: "db-vacuum" }: bool

persistPeers* {.
desc: "Enable peer persistence: true|false",
defaultValue: false
name: "persist-peers" }: bool

# TODO: Deprecated. Remove in next release
persistMessages* {.
desc: "Enable message persistence: true|false",
desc: "DEPRECATED: Use '--store' instead",
defaultValue: false
name: "persist-messages" }: bool

Expand Down Expand Up @@ -154,9 +165,9 @@ type
defaultValue: ""
name: "rln-relay-id-commitment-key" }: string

# NOTE: This can be derived from the private key, but kept for future use
rlnRelayEthAccountAddress* {.
desc: "Account address for the Ethereum testnet Goerli",
# NOTE: This can be derived from the private key, but kept for future use
defaultValue: ""
name: "rln-relay-eth-account-address" }: string

Expand Down Expand Up @@ -189,34 +200,62 @@ type
defaultValue: "/waku/2/default-waku/proto"
name: "topics" .}: string

## Store config
## Store and message store config

store* {.
desc: "Enable store protocol: true|false",
desc: "Enable/disable waku store protocol",
defaultValue: true
name: "store" }: bool

storeMessageRetentionPolicy* {.
desc: "Message store retention policy. Time retention policy: 'time:<seconds>'. Capacity retention policy: 'capacity:<count>'",
defaultValue: "time:" & $2.days.seconds,
name: "store-message-retention-policy" }: string

storeMessageDbUrl* {.
desc: "The database connection URL for peristent storage.",
defaultValue: "sqlite://store.sqlite3",
name: "store-message-db-url" }: string

storeMessageDbVacuum* {.
desc: "Enable database vacuuming at start. Only supported by SQLite database engine.",
defaultValue: false,
name: "store-message-db-vacuum" }: bool

storeMessageDbMigration* {.
desc: "Enable database migration at start.",
defaultValue: true,
name: "store-message-db-migration" }: bool

storeResumePeer* {.
desc: "Peer multiaddress to resume the message store at boot.",
defaultValue: "",
name: "store-resume-peer" }: string

# TODO: Deprecated. Remove in next release
storenode* {.
desc: "Peer multiaddr to query for storage.",
desc: "DEPRECATED: Use '--store-resume-peer' instead.",
defaultValue: ""
name: "storenode" }: string

# TODO: Deprecated. Remove in next release
storeCapacity* {.
desc: "Maximum number of messages to keep in store.",
desc: "DEPRECATED: Use '--store-message-retention-policy=capacity:<count>' instead",
defaultValue: 50000
name: "store-capacity" }: int

# TODO: Deprecated. Remove in next release
sqliteStore* {.
desc: "Enable sqlite-only store: true|false",
desc: "DEPRECATED: SQLite is the default message store implementation.",
defaultValue: false
name: "sqlite-store" }: bool

## TODO: Rename this command-line option to `storeRetentionTime`
# TODO: Deprecated. Remove in next release
sqliteRetentionTime* {.
desc: "time the sqlite-only store keeps messages (in seconds)",
desc: "DEPRECATED: Use '--store-message-retention-policy=time:<seconds>' instead",
defaultValue: 30.days.seconds
name: "sqlite-retention-time" }: int64 # TODO: Duration

name: "sqlite-retention-time" }: int64
## Filter config

filter* {.
Expand Down Expand Up @@ -473,3 +512,26 @@ proc readValue*(r: var TomlReader, val: var crypto.PrivateKey)
except CatchableError as err:
raise newException(SerializationError, err.msg)


## Configuration validation

let DbUrlRegex = re"^[\w\+]+:\/\/[\w\/\\\.\:\@]+$"
rymnc marked this conversation as resolved.
Show resolved Hide resolved

proc validateDbUrl*(val: string): ConfResult[string] =
let val = val.strip()

if val == "" or val.match(DbUrlRegex).isSome():
return ok(val)
else:
return err("invalid 'db url' option format: " & val)


let StoreMessageRetentionPolicyRegex = re"^\w+:\w$"

proc validateStoreMessageRetentionPolicy*(val: string): ConfResult[string] =
let val = val.strip()

if val == "" or val.match(StoreMessageRetentionPolicyRegex).isSome():
return ok(val)
else:
return err("invalid 'store message retention policy' option format: " & val)
4 changes: 4 additions & 0 deletions shell.nix
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,8 @@ pkgs.mkShell {
libiconv
darwin.apple_sdk.frameworks.Security
];

LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath [
pkgs.pcre
];
}