logos-messaging-nim/waku/factory/conf_builder/web_socket_conf_builder.nim
Fabiana Cecin 71a369ffad
feat: allow a port value of zero for service ports (auto-assign port) (#3828)
* any port set to 0 on conf results in a random port bound
* Debug API MyBoundPorts reports actually bound ports for all services, reports 0 if disabled
* write back bound values to both WakuConf and WakuNode.ports
* setupDiscoveryV5 returns Result and errors out on port 0
* rename setupAndStartDiscv5WithAutoPort to setupAndStartDiscv5
* updateWaku ENR rebuild now runs after discv5 startup
* Add DefaultP2pTcpPort, DefaultDiscv5UdpPort, DefaultWebSocketPort, DefaultRestPort, DefaultMetricsHttpPort
* add tests
2026-05-11 15:22:22 -03:00

71 lines
2.0 KiB
Nim

import chronicles, std/[net, options], results
import waku/factory/waku_conf
logScope:
topics = "waku conf builder websocket"
const DefaultWebSocketPort*: Port = Port(8000)
##############################
## WebSocket Config Builder ##
##############################
type WebSocketConfBuilder* = object
enabled*: Option[bool]
webSocketPort*: Option[Port]
secureEnabled*: Option[bool]
keyPath*: Option[string]
certPath*: Option[string]
proc init*(T: type WebSocketConfBuilder): WebSocketConfBuilder =
WebSocketConfBuilder()
proc withEnabled*(b: var WebSocketConfBuilder, enabled: bool) =
b.enabled = some(enabled)
proc withSecureEnabled*(b: var WebSocketConfBuilder, secureEnabled: bool) =
b.secureEnabled = some(secureEnabled)
if b.secureEnabled.get():
b.enabled = some(true) # ws must be enabled to use wss
proc withWebSocketPort*(b: var WebSocketConfBuilder, webSocketPort: Port) =
b.webSocketPort = some(webSocketPort)
proc withWebSocketPort*(b: var WebSocketConfBuilder, webSocketPort: uint16) =
b.webSocketPort = some(Port(webSocketPort))
proc withKeyPath*(b: var WebSocketConfBuilder, keyPath: string) =
b.keyPath = some(keyPath)
proc withCertPath*(b: var WebSocketConfBuilder, certPath: string) =
b.certPath = some(certPath)
proc build*(b: WebSocketConfBuilder): Result[Option[WebSocketConf], string] =
if not b.enabled.get(false):
return ok(none(WebSocketConf))
if not b.secureEnabled.get(false):
return ok(
some(
WebSocketConf(
port: b.webSocketPort.get(DefaultWebSocketPort),
secureConf: none(WebSocketSecureConf),
)
)
)
if b.keyPath.get("") == "":
return err("WebSocketSecure enabled but key path is not specified")
if b.certPath.get("") == "":
return err("WebSocketSecure enabled but cert path is not specified")
return ok(
some(
WebSocketConf(
port: b.webSocketPort.get(DefaultWebSocketPort),
secureConf: some(
WebSocketSecureConf(keyPath: b.keyPath.get(), certPath: b.certPath.get())
),
)
)
)