Register the broker wait before the first poll (closes #157)
check / check (push) Canceled after 0s
check / check (push) Canceled after 0s
GET /api/v1/messages read the client output queue and only then registered with the broker. Notify wakes only the channels registered at that moment, so a message queued between the empty read and the registration waited out the whole long-poll timeout. The handler now registers first and removes its channel on every exit path; the IRC relay loop registers before each drain in the same way. The handlers read the queue through a function field that defaults to Database.PollMessages, so tests can act just after a read: one checks that a message queued there comes back at once, others that no wait channel stays registered however a request ends. Model: opus-5-5
This commit is contained in:
@@ -64,6 +64,16 @@ type Handlers struct {
|
||||
loginLimiter *ratelimit.Limiter
|
||||
stats *stats.Tracker
|
||||
cancelCleanup context.CancelFunc
|
||||
|
||||
// pollMessages is Database.PollMessages, with which
|
||||
// HandleGetMessages reads the client output queue. Tests
|
||||
// replace it to act just after a read, or to make a read
|
||||
// fail.
|
||||
pollMessages func(
|
||||
ctx context.Context,
|
||||
clientID, afterQueueID int64,
|
||||
limit int,
|
||||
) ([]db.IRCMessage, int64, error)
|
||||
}
|
||||
|
||||
// New creates a new Handlers instance.
|
||||
@@ -95,6 +105,7 @@ func New(
|
||||
hashcashVal: hashcash.NewValidator(resource),
|
||||
loginLimiter: ratelimit.New(loginRate, loginBurst),
|
||||
stats: params.Stats,
|
||||
pollMessages: params.Database.PollMessages,
|
||||
}
|
||||
|
||||
lifecycle.Append(fx.Hook{
|
||||
|
||||
Reference in New Issue
Block a user