github.com/mdaxf/iac@v0.0.0-20240519030858-58a061660378/integration/messagebus/msgbus.go (about)

     1  package messagebus
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  
     7  	"github.com/mdaxf/iac/integration/messagebus/glue"
     8  	"github.com/mdaxf/iac/logger"
     9  )
    10  
    11  type MessageBus struct {
    12  	// Set the http file server.
    13  	Port      int
    14  	ChannelID string
    15  	Server    *glue.Server
    16  	Channel   *glue.Channel
    17  	iLog      logger.Log
    18  }
    19  
    20  func NewMessageBus(port int, channel string) *MessageBus {
    21  	iLog := logger.Log{ModuleName: logger.Framework, User: "System", ControllerName: "MessageBus"}
    22  
    23  	iLog.Debug(fmt.Sprintf(("Create new MessageBus with port %d and channel : %s"), port, channel))
    24  
    25  	mb := &MessageBus{
    26  		Port:      port,
    27  		ChannelID: channel,
    28  		iLog:      iLog,
    29  	}
    30  	mb.Server = mb.CreateServer()
    31  
    32  	mb.iLog.Debug(fmt.Sprintf("MessageBus created: %v", mb))
    33  
    34  	mb.Server.OnNewSocket(mb.CreateChannel)
    35  	mb.iLog.Debug(fmt.Sprintf("MessageBus Server OnNewSocket: %v", mb.Server.OnNewSocket))
    36  
    37  	// Run the glue server.
    38  
    39  	http.Handle("/", http.StripPrefix("/", http.FileServer(http.Dir("public"))))
    40  	http.Handle("/dist/", http.StripPrefix("/dist/", http.FileServer(http.Dir("../../client/dist"))))
    41  
    42  	err := mb.Server.Run()
    43  	if err != nil {
    44  		mb.iLog.Error(fmt.Sprintf("Message Bus Server Run error: %v", err))
    45  	}
    46  	mb.iLog.Debug(fmt.Sprintf("Message Bus Server in port %d with channel%s Run", mb.Port, mb.ChannelID))
    47  
    48  	return mb
    49  }
    50  
    51  func (mb *MessageBus) CreateServer() *glue.Server {
    52  
    53  	// Create a new glue server.
    54  	port := fmt.Sprintf(":%d", mb.Port)
    55  
    56  	mb.iLog.Info(fmt.Sprintf("Starting MessageBus on port %s", port))
    57  
    58  	server := glue.NewServer(glue.Options{
    59  		HTTPListenAddress: port,
    60  		HTTPSocketType:    glue.HTTPSocketTypeTCP,
    61  	})
    62  	return server
    63  }
    64  
    65  func (mb *MessageBus) CreateChannel(s *glue.Socket) {
    66  	// We won't read any data from the socket itself.
    67  	// Discard received data!
    68  	s.DiscardRead()
    69  
    70  	// Set a function which is triggered as soon as the socket is closed.
    71  	s.OnClose(func() {
    72  		mb.iLog.Info(fmt.Sprintf("socket closed with remote address: %s", s.RemoteAddr()))
    73  	})
    74  
    75  	// Create a channel.
    76  	mb.Channel = s.Channel(mb.ChannelID)
    77  
    78  	/*
    79  		// Set the channel on read event function.
    80  		c.OnRead(func(data string) {
    81  			// Echo the received data back to the client.
    82  			c.Write("channel golang: " + data)
    83  		})
    84  
    85  		// Write to the channel.
    86  		c.Write("Hello Gophers!") */
    87  
    88  }