@@ -111,6 +111,8 @@ var decryptDatabase DecryptDatabase
111111
112112var parser = flags .NewParser (nil , flags .Default )
113113
114+ var ErrNoGateways = errors .New ("No gateway addresses configured" )
115+
114116func main () {
115117 c := make (chan os.Signal , 1 )
116118 signal .Notify (c , os .Interrupt )
@@ -505,46 +507,40 @@ func (x *Start) Execute(args []string) error {
505507 UserAgent : USERAGENT ,
506508 }
507509
508- var gwErrc <- chan error
509- var cb <- chan bool
510- if len (cfg .Addresses .Gateway ) > 0 {
511- if (apiConfig .SSL && apiConfig .SSLCert == "" ) || (apiConfig .SSL && apiConfig .SSLKey == "" ) {
512- return errors .New ("SSL cert and key files must be set when SSL is enabled" )
513- }
514- err , cb , gwErrc = serveHTTPGateway (core .Node , authCookie , * apiConfig )
515- if err != nil {
516- log .Error (err )
517- return err
518- }
510+ if len (cfg .Addresses .Gateway ) <= 0 {
511+ return ErrNoGateways
512+ }
513+ if (apiConfig .SSL && apiConfig .SSLCert == "" ) || (apiConfig .SSL && apiConfig .SSLKey == "" ) {
514+ return errors .New ("SSL cert and key files must be set when SSL is enabled" )
519515 }
520516
521- /* Wait for gateway to start before starting the network service.
522- This way the websocket channel we pass into the service gets created first.
523- FIXME: There has to be a better way */
524- for b := range cb {
525- if b == true {
526- core .Node .Service = service .New (core .Node , ctx , sqliteDB )
527- MR := ret .NewMessageRetriever (sqliteDB , ctx , nd , core .Node .Service , 16 , core .Node .SendOfflineAck )
528- go MR .Run ()
529- core .Node .MessageRetriever = MR
530- PR := rep .NewPointerRepublisher (nd , sqliteDB )
531- go PR .Run ()
532- core .Node .PointerRepublisher = PR
533- if ! x .DisableWallet {
534- MR .Wait ()
535- TL := lis .NewTransactionListener (core .Node .Datastore , core .Node .Broadcast , core .Node .Wallet .Params ())
536- wallet .AddTransactionListener (TL .OnTransactionReceived )
537- log .Info ("Starting bitcoin wallet..." )
538- go wallet .Start ()
539- }
540- core .Node .UpdateFollow ()
541- core .Node .SeedNode ()
542- }
543- break
517+ gateway , err := newHTTPGateway (core .Node , authCookie , * apiConfig )
518+ if err != nil {
519+ log .Error (err )
520+ return err
544521 }
545522
546- for err := range gwErrc {
547- fmt .Println (err )
523+ core .Node .Service = service .New (core .Node , ctx , sqliteDB )
524+ MR := ret .NewMessageRetriever (sqliteDB , ctx , nd , core .Node .Service , 16 , core .Node .SendOfflineAck )
525+ go MR .Run ()
526+ core .Node .MessageRetriever = MR
527+ PR := rep .NewPointerRepublisher (nd , sqliteDB )
528+ go PR .Run ()
529+ core .Node .PointerRepublisher = PR
530+ if ! x .DisableWallet {
531+ MR .Wait ()
532+ TL := lis .NewTransactionListener (core .Node .Datastore , core .Node .Broadcast , core .Node .Wallet .Params ())
533+ wallet .AddTransactionListener (TL .OnTransactionReceived )
534+ log .Info ("Starting bitcoin wallet..." )
535+ go wallet .Start ()
536+ }
537+ core .Node .UpdateFollow ()
538+ core .Node .SeedNode ()
539+
540+ // Start gateway
541+ err = gateway .Serve ()
542+ if err != nil {
543+ log .Error (err )
548544 }
549545
550546 return nil
@@ -596,37 +592,40 @@ func (d *DummyListener) Close() error {
596592}
597593
598594// Collects options, creates listener, prints status message and starts serving requests
599- func serveHTTPGateway (node * core.OpenBazaarNode , authCookie http.Cookie , config repo.APIConfig ) (error , <- chan bool , <- chan error ) {
595+ func newHTTPGateway (node * core.OpenBazaarNode , authCookie http.Cookie , config repo.APIConfig ) (* api.Gateway , error ) {
596+ // Get API configuration
600597 cfg , err := node .Context .GetConfig ()
601598 if err != nil {
602- return err , nil , nil
599+ return nil , err
603600 }
604601
602+ // Create a network listener
605603 gatewayMaddr , err := ma .NewMultiaddr (cfg .Addresses .Gateway )
606604 if err != nil {
607- return fmt .Errorf ("serveHTTPGateway : invalid gateway address: %q (err: %s)" , cfg .Addresses .Gateway , err ), nil , nil
605+ return nil , fmt .Errorf ("newHTTPGateway : invalid gateway address: %q (err: %s)" , cfg .Addresses .Gateway , err )
608606 }
609607 var gwLis manet.Listener
610608 if config .SSL {
611609 netAddr , err := manet .ToNetAddr (gatewayMaddr )
612610 if err != nil {
613- return err , nil , nil
611+ return nil , err
614612 }
615613 gwLis , err = manet .WrapNetListener (& DummyListener {netAddr })
616614 if err != nil {
617- return err , nil , nil
615+ return nil , err
618616 }
619617 } else {
620618 gwLis , err = manet .Listen (gatewayMaddr )
621619 if err != nil {
622- return fmt .Errorf ("serveHTTPGateway : manet.Listen(%s) failed: %s" , gatewayMaddr , err ), nil , nil
620+ return nil , fmt .Errorf ("newHTTPGateway : manet.Listen(%s) failed: %s" , gatewayMaddr , err )
623621 }
624622 }
623+
625624 // We might have listened to /tcp/0 - let's see what we are listing on
626625 gatewayMaddr = gwLis .Multiaddr ()
627-
628626 log .Infof ("Gateway/API server listening on %s\n " , gatewayMaddr )
629627
628+ // Setup an options slice
630629 var opts = []corehttp.ServeOption {
631630 corehttp .MetricsCollectionOption ("gateway" ),
632631 corehttp .CommandsROOption (node .Context ),
@@ -640,15 +639,11 @@ func serveHTTPGateway(node *core.OpenBazaarNode, authCookie http.Cookie, config
640639 }
641640
642641 if err != nil {
643- return fmt .Errorf ("serveHTTPGateway : ConstructNode() failed: %s" , err ), nil , nil
642+ return nil , fmt .Errorf ("newHTTPGateway : ConstructNode() failed: %s" , err )
644643 }
645- errc := make (chan error )
646- cb := make (chan bool )
647- go func () {
648- errc <- api .Serve (cb , node , node .Context , authCookie , gwLis .NetListener (), config , opts ... )
649- close (errc )
650- }()
651- return nil , cb , errc
644+
645+ // Create and return an API gateway
646+ return api .NewGateway (node , authCookie , gwLis .NetListener (), config , opts ... )
652647}
653648
654649/* Returns the directory to store repo data in.
0 commit comments