func NewNode()

in swim/node.go [231:283]


func NewNode(app, address string, channel shared.SubChannel, opts *Options) *Node {
	// use defaults for options that are unspecified
	opts = mergeDefaultOptions(opts)

	node := &Node{
		address: address,
		app:     app,
		channel: channel,
		logger:  logging.Logger("node").WithField("local", address),

		joinTimeout:        opts.JoinTimeout,
		pingTimeout:        opts.PingTimeout,
		pingRequestTimeout: opts.PingRequestTimeout,

		pingRequestSize: opts.PingRequestSize,

		maxReverseFullSyncJobs: opts.MaxReverseFullSyncJobs,

		clientRate: metrics.NewMeter(),
		serverRate: metrics.NewMeter(),
		totalRate:  metrics.NewMeter(),
		clock:      opts.Clock,
	}
	node.selfEvict = newSelfEvict(node, opts.SelfEvict)
	node.requiresAppInPing = opts.RequiresAppInPing

	node.labelLimits = opts.LabelLimits

	node.memberlist = newMemberlist(node, opts.InitialLabels)
	node.memberiter = newMemberlistIter(node.memberlist)
	node.stateTransitions = newStateTransitions(node, opts.StateTimeouts)

	node.healer = newDiscoverProviderHealer(
		node,
		opts.PartitionHealBaseProbabillity,
		opts.PartitionHealPeriod,
	)
	node.gossip = newGossip(node, opts.MinProtocolPeriod)
	node.disseminator = newDisseminator(node)

	for _, member := range node.memberlist.GetMembers() {
		change := Change{}
		change.populateSubject(&member)
		node.disseminator.RecordChange(change)
	}

	if node.channel != nil {
		node.registerHandlers()
		node.service = node.channel.ServiceName()
	}

	return node
}