11package pulse
22
33import (
4- "errors "
4+ "context "
55 "fmt"
66 "github.com/common-nighthawk/go-figure"
77 "net"
88 "net/http"
9- "sync "
9+ "time "
1010)
1111
1212type (
1313 Pulse struct {
1414 config * Config
1515 server * http.Server
1616 Router * Router
17- mx sync.Mutex
1817 }
1918
2019 Config struct {
@@ -38,6 +37,7 @@ func New(config ...Config) *Pulse {
3837 app := & Pulse {
3938 config : & Config {},
4039 server : & http.Server {},
40+ Router : NewRouter (),
4141 }
4242
4343 if len (config ) > 0 {
@@ -55,51 +55,58 @@ func New(config ...Config) *Pulse {
5555 return app
5656}
5757
58- func (f * Pulse ) Run (address string ) {
59- f .mx .Lock ()
60- defer f .mx .Unlock ()
58+ func (p * Pulse ) Run (address string ) {
6159 // setup handler
62- handler := RouterHandler (f .Router )
63- f .server .Handler = handler
60+ handler := RouterHandler (p .Router )
61+ p .server .Handler = handler
6462
6563 // setup listener
66- listener , err := net .Listen (f .config .Network , address )
64+ listener , err := net .Listen (p .config .Network , address )
6765 if err != nil {
6866 panic (fmt .Errorf ("failed to listen: %v" , err ))
6967 }
7068
7169 // print startup message
72- fmt .Println (f .startupMessage (listener .Addr ().String ()))
70+ fmt .Println (p .startupMessage (listener .Addr ().String ()))
7371
7472 // start server
75- err = f .server .Serve (listener )
73+ err = p .server .Serve (listener )
7674 if err != nil {
7775 fmt .Errorf ("failed to start server on %s: %v" , listener .Addr ().String (), err )
7876 }
7977}
8078
81- func (f * Pulse ) Stop () error {
82- f .mx .Lock ()
83- defer f .mx .Unlock ()
84-
85- if f .server == nil {
86- return errors .New ("server not running" )
79+ func (p * Pulse ) Stop () error {
80+ // Check if the server is already stopped.
81+ if p .server == nil {
82+ return nil
8783 }
88- err := f .server .Shutdown (nil )
84+
85+ // Disable HTTP keep-alive connections to prevent the server from
86+ // accepting any new requests.
87+ p .server .SetKeepAlivesEnabled (false )
88+
89+ // Shutdown the server gracefully to allow existing connections to finish.
90+ ctx , cancel := context .WithTimeout (context .Background (), 5 * time .Second )
91+ defer cancel ()
92+ err := p .server .Shutdown (ctx )
8993 if err != nil {
90- return fmt .Errorf ("failed to stop server: %v" , err )
94+ return fmt .Errorf ("failed to shut down server: %v" , err )
9195 }
92- f .server = nil
96+
97+ // Set the server to a new instance of http.Server to allow starting it again.
98+ p .server = & http.Server {}
99+
93100 return nil
94101}
95102
96- func (f * Pulse ) startupMessage (addr string ) string {
103+ func (p * Pulse ) startupMessage (addr string ) string {
97104 myFigure := figure .NewFigure ("PULSE" , "" , true )
98105 myFigure .Print ()
99106
100107 var textOne = "=> Server started on <%s>" + "\n "
101108 var textTwo = "=> App Name: %s" + "\n "
102109 var textThree = "=> Press CTRL+C to stop" + "\n "
103110
104- return fmt .Sprintf (textOne , addr ) + fmt .Sprintf (textTwo , f .config .AppName ) + fmt .Sprintf (textThree )
111+ return fmt .Sprintf (textOne , addr ) + fmt .Sprintf (textTwo , p .config .AppName ) + fmt .Sprintf (textThree )
105112}
0 commit comments