NewModuleService wraps a module service, and makes sure that dependencies are started/stopped before module service starts or stops. If any dependency fails to start, this service fails as well. On stop, errors from failed dependencies are ignored.
(name string, logger log.Logger, service services.Service, startDeps, stopDeps func(string) map[string]services.Service)
| 41 | // If any dependency fails to start, this service fails as well. |
| 42 | // On stop, errors from failed dependencies are ignored. |
| 43 | func NewModuleService(name string, logger log.Logger, service services.Service, startDeps, stopDeps func(string) map[string]services.Service) services.Service { |
| 44 | w := &moduleService{ |
| 45 | name: name, |
| 46 | logger: logger, |
| 47 | service: service, |
| 48 | startDeps: startDeps, |
| 49 | stopDeps: stopDeps, |
| 50 | } |
| 51 | |
| 52 | w.Service = services.NewBasicService(w.start, w.run, w.stop) |
| 53 | |
| 54 | if namedService, isNamed := service.(services.NamedService); isNamed { |
| 55 | // return a value that implements services.NamedService only if the wrapped service implements services.NamedService |
| 56 | return delegatedNamedService{ |
| 57 | Service: w, |
| 58 | delegate: namedService, |
| 59 | } |
| 60 | } |
| 61 | return w |
| 62 | } |
| 63 | |
| 64 | func (w *moduleService) start(serviceContext context.Context) error { |
| 65 | // wait until all startDeps are running |