From caacccec562121d13a68cccc5f247e6347714c32 Mon Sep 17 00:00:00 2001 From: Kirillkriv Date: Fri, 9 Oct 2026 11:17:21 +0300 Subject: [PATCH] feat: added dispatcher lifecycle hooks --- v1/core/dispatcher.go | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/v1/core/dispatcher.go b/v1/core/dispatcher.go index ddda2e2..6ddf25a 100644 --- a/v1/core/dispatcher.go +++ b/v1/core/dispatcher.go @@ -51,6 +51,8 @@ type Dispatcher struct { poller Poller fsmStorage FSMStorage eventIsolation EventIsolation + onStart func(ctx context.Context) error + onStop func(ctx context.Context) error rt *Router logger zerolog.Logger wg sync.WaitGroup @@ -81,6 +83,7 @@ func NewDispatcher(api *maxbot.Api, options ...DispatcherOption) *Dispatcher { d.poller = opts.poller d.fsmStorage = opts.fsmStorage d.eventIsolation = opts.eventIsolation + d.logger = opts.logger return d } @@ -107,13 +110,47 @@ func (d *Dispatcher) Start(ctx context.Context) error { return err } + if d.onStart != nil { + if err := d.onStart(ctx); err != nil { + return err + } + } + d.handleUpdates(ch) - d.wg.Wait() return nil } func (d *Dispatcher) Stop(ctx context.Context) error { - return d.poller.Stop(ctx) + if err := d.poller.Stop(ctx); err != nil { + return err + } + + done := make(chan struct{}) + + go func() { + d.wg.Wait() + done <- struct{}{} + }() + + select { + case <-ctx.Done(): + return ctx.Err() + case <-done: + } + + if d.onStop != nil { + return d.onStop(ctx) + } + + return nil +} + +func (d *Dispatcher) OnStart(f func(ctx context.Context) error) { + d.onStart = f +} + +func (d *Dispatcher) OnStop(f func(ctx context.Context) error) { + d.onStop = f } func (d *Dispatcher) handleUpdates(ch <-chan model.Update) {