check / check (push) Waiting to run
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 the new test can queue a message just after the first read finds nothing and check that it comes back at once. Model: opus-5-5
20 lines
387 B
Go
20 lines
387 B
Go
package handlers
|
|
|
|
import (
|
|
"context"
|
|
|
|
"sneak.berlin/go/neoirc/internal/db"
|
|
)
|
|
|
|
// SetPollMessages makes HandleGetMessages read the client
|
|
// output queue with poll in place of Database.PollMessages.
|
|
func (hdlr *Handlers) SetPollMessages(
|
|
poll func(
|
|
ctx context.Context,
|
|
clientID, afterQueueID int64,
|
|
limit int,
|
|
) ([]db.IRCMessage, int64, error),
|
|
) {
|
|
hdlr.pollMessages = poll
|
|
}
|