8784: Fix test for latest firefox.
[arvados.git] / services / ws / server.go
1 package main
2
3 import (
4         "net"
5         "net/http"
6         "sync"
7         "time"
8
9         "github.com/coreos/go-systemd/daemon"
10 )
11
12 type server struct {
13         httpServer  *http.Server
14         listener    net.Listener
15         wsConfig    *wsConfig
16         eventSource *pgEventSource
17         setupOnce   sync.Once
18 }
19
20 func (srv *server) Close() {
21         srv.WaitReady()
22         srv.eventSource.Close()
23         srv.listener.Close()
24 }
25
26 func (srv *server) WaitReady() {
27         srv.setupOnce.Do(srv.setup)
28         srv.eventSource.WaitReady()
29 }
30
31 func (srv *server) Run() error {
32         srv.setupOnce.Do(srv.setup)
33         return srv.httpServer.Serve(srv.listener)
34 }
35
36 func (srv *server) setup() {
37         log := logger(nil)
38
39         ln, err := net.Listen("tcp", srv.wsConfig.Listen)
40         if err != nil {
41                 log.WithField("Listen", srv.wsConfig.Listen).Fatal(err)
42         }
43         log.WithField("Listen", ln.Addr().String()).Info("listening")
44
45         srv.listener = ln
46         srv.eventSource = &pgEventSource{
47                 DataSource:   srv.wsConfig.Postgres.ConnectionString(),
48                 MaxOpenConns: srv.wsConfig.PostgresPool,
49                 QueueSize:    srv.wsConfig.ServerEventQueue,
50         }
51         srv.httpServer = &http.Server{
52                 Addr:           srv.wsConfig.Listen,
53                 ReadTimeout:    time.Minute,
54                 WriteTimeout:   time.Minute,
55                 MaxHeaderBytes: 1 << 20,
56                 Handler: &router{
57                         Config:         srv.wsConfig,
58                         eventSource:    srv.eventSource,
59                         newPermChecker: func() permChecker { return newPermChecker(srv.wsConfig.Client) },
60                 },
61         }
62
63         go func() {
64                 srv.eventSource.Run()
65                 log.Info("event source stopped")
66                 srv.Close()
67         }()
68
69         if _, err := daemon.SdNotify(false, "READY=1"); err != nil {
70                 log.WithError(err).Warn("error notifying init daemon")
71         }
72 }