diff --git a/waku/common/config.go b/waku/common/config.go index 5026ab0..6c00f84 100644 --- a/waku/common/config.go +++ b/waku/common/config.go @@ -1,5 +1,7 @@ package common +type ExtraOptions map[string]interface{} + type WakuConfig struct { Host string `json:"host,omitempty"` Nodekey string `json:"nodekey,omitempty"` diff --git a/waku/nwaku.go b/waku/nwaku.go index 03133da..a20b4e4 100644 --- a/waku/nwaku.go +++ b/waku/nwaku.go @@ -346,19 +346,24 @@ func GoCallback(ret C.int, msg *C.char, len C.size_t, resp unsafe.Pointer) { type WakuNode struct { wakuCtx unsafe.Pointer config *common.WakuConfig + extraOptions common.ExtraOptions MsgChan chan common.Envelope TopicHealthChan chan topicHealth ConnectionChangeChan chan connectionChange nodeName string } -func NewWakuNode(config *common.WakuConfig, nodeName string) (*WakuNode, error) { +func NewWakuNode(config *common.WakuConfig, nodeName string, opts ...WakuNodeOption) (*WakuNode, error) { Debug("Creating new WakuNode: %v", nodeName) n := &WakuNode{ config: config, nodeName: nodeName, } + for _, o := range opts { + o(n) + } + wg := sync.WaitGroup{} jsonConfig, err := json.Marshal(config) @@ -366,6 +371,22 @@ func NewWakuNode(config *common.WakuConfig, nodeName string) (*WakuNode, error) return nil, err } + if len(n.extraOptions) > 0 { + configMap := make(common.ExtraOptions) + err = json.Unmarshal(jsonConfig, &configMap) + if err != nil { + return nil, err + } + + for k, v := range n.extraOptions { + configMap[k] = v + } + jsonConfig, err = json.Marshal(configMap) + if err != nil { + return nil, err + } + } + var cJsonConfig = C.CString(string(jsonConfig)) var resp = C.allocResp(unsafe.Pointer(&wg)) @@ -1314,7 +1335,7 @@ func GetFreePortIfNeeded(tcpPort int, discV5UDPPort int) (int, int, error) { } // Create & start node -func StartWakuNode(nodeName string, customCfg *common.WakuConfig) (*WakuNode, error) { +func StartWakuNode(nodeName string, customCfg *common.WakuConfig, opts ...WakuNodeOption) (*WakuNode, error) { Debug("Initializing %s", nodeName) @@ -1339,7 +1360,7 @@ func StartWakuNode(nodeName string, customCfg *common.WakuConfig) (*WakuNode, er } Debug("Creating %s", nodeName) - node, err := NewWakuNode(&nodeCfg, nodeName) + node, err := NewWakuNode(&nodeCfg, nodeName, opts...) if err != nil { Error("Failed to create %s: %v", nodeName, err) return nil, err diff --git a/waku/options.go b/waku/options.go new file mode 100644 index 0000000..74eaaf2 --- /dev/null +++ b/waku/options.go @@ -0,0 +1,13 @@ +package waku + +import "github.com/waku-org/waku-go-bindings/waku/common" + +type WakuNodeOption func(*WakuNode) + +// This allows you to pass arbitrary valid config options to Nwaku based on https://github.com/waku-org/nwaku/blob/master/waku/factory/external_config.nim +// It is mostly for development and experimental purposes and will be removed in the future. +func WithExtraOptions(extraOptions common.ExtraOptions) WakuNodeOption { + return func(wn *WakuNode) { + wn.extraOptions = extraOptions + } +}