···1010 Rkey string `json:"rkey"`1111 Nsid string `json:"nsid"`1212 EventJson string `json:"event"`1313+ Created int64 `json:"created"`1314}14151516func (d *DB) InsertEvent(event Event, notifier *notifier.Notifier) error {1717+1618 _, err := d.db.Exec(1719 `insert into events (rkey, nsid, event) values (?, ?, ?)`,1820 event.Rkey,···2725 return err2826}29273030-func (d *DB) GetEvents(cursor string) ([]Event, error) {2828+func (d *DB) GetEvents(cursor int64) ([]Event, error) {3129 whereClause := ""3230 args := []any{}3333- if cursor != "" {3434- whereClause = "where rkey > ?"3131+ if cursor > 0 {3232+ whereClause = "where created > ?"3533 args = append(args, cursor)3634 }37353836 query := fmt.Sprintf(`3939- select rkey, nsid, event3737+ select rkey, nsid, event, created4038 from events4139 %s4242- order by rkey asc4040+ order by created asc4341 limit 1004442 `, whereClause)4543···5250 var evts []Event5351 for rows.Next() {5452 var ev Event5555- rows.Scan(&ev.Rkey, &ev.Nsid, &ev.EventJson)5353+ if err := rows.Scan(&ev.Rkey, &ev.Nsid, &ev.EventJson, &ev.Created); err != nil {5454+ return nil, err5555+ }5656 evts = append(evts, ev)5757 }5858
+1
knotserver/db/init.go
···4848 rkey text not null,4949 nsid text not null,5050 event text not null, -- json5151+ created integer not null default (strftime('%s', 'now')),5152 primary key (rkey, nsid)5253 );5354 `)
+8-3
knotserver/events.go
···44 "context"55 "encoding/json"66 "net/http"77+ "strconv"78 "time"89910 "github.com/gorilla/websocket"···4342 }4443 }()45444646- cursor := r.URL.Query().Get("cursor")4545+ cursorStr := r.URL.Query().Get("cursor")4646+ cursor, err := strconv.ParseInt(cursorStr, 10, 64)4747+ if err != nil {4848+ l.Error("empty or invalid cursor, defaulting to zero", "invalidCursor", cursorStr)4949+ }47504851 // complete backfill first before going to live data4952 l.Debug("going through backfill", "cursor", cursor)···7974 }8075}81768282-func (h *Handle) streamOps(conn *websocket.Conn, cursor *string) error {7777+func (h *Handle) streamOps(conn *websocket.Conn, cursor *int64) error {8378 events, err := h.db.GetEvents(*cursor)8479 if err != nil {8580 h.l.Error("failed to fetch events from db", "err", err, "cursor", cursor)···110105 h.l.Debug("err", "err", err)111106 return err112107 }113113- *cursor = event.Rkey108108+ *cursor = event.Created114109 }115110116111 return nil