···
···
26
+
events []jetstream.Event
29
+
func NewQueue(capacity int) *Queue {
31
+
events: make([]jetstream.Event, 0, capacity),
35
+
func (q *Queue) Enqueue(event jetstream.Event) {
39
+
q.events = append(q.events, event)
42
+
func (q *Queue) Dequeue() (jetstream.Event, bool) {
46
+
if len(q.events) == 0 {
47
+
var e jetstream.Event
51
+
event := q.events[0]
52
+
q.events = q.events[1:]
56
+
func (q *Queue) Size() int {
60
+
return len(q.events)
var AppBskyAllowlist = map[string]bool{
"app.bsky.actor.profile": true,
"app.bsky.feed.generator": true,
···
49
-
func handler(ctx context.Context, events <-chan []byte, dbCnx *sql.DB) {
88
+
func handler(ctx context.Context, queue *Queue, dbCnx *sql.DB) {
if _, err := dbCnx.ExecContext(ctx, ddl); err != nil {
log.Printf("could not create tables: %v\n", err)
···
63
-
for evt := range events {
103
+
event, ok := queue.Dequeue()
105
+
time.Sleep(100 * time.Millisecond)
dbTx, err = dbCnx.BeginTx(ctx, nil)
···
71
-
var event jetstream.Event
72
-
if err := json.Unmarshal(evt, &event); err != nil {
if event.Kind != jetstream.EventKindCommit {
···
dbTx.ExecContext(ctx, userTimestampUpdate, did, ts, ts)
96
-
if eventCount%1000 == 0 {
97
-
if err := dbTx.Commit(); err != nil {
98
-
log.Printf("commit failed: %v\n")
136
+
if eventCount%2500 == 0 {
137
+
if err = dbTx.Commit(); err != nil {
138
+
log.Printf("commit failed: %v\n", err)
140
+
log.Printf("commit successful\n")
101
-
var results CheckpointResults
102
-
err := dbCnx.QueryRowContext(ctx, "PRAGMA wal_checkpoint(RESTART)").Scan(&results.Blocked, &results.Pages, &results.Transferred)
105
-
log.Printf("failed checkpoint: %v\n", err)
106
-
case results.Blocked == 1:
107
-
log.Printf("checkpoint: blocked\n")
108
-
case results.Pages == results.Transferred:
109
-
log.Printf("checkpoint: %d pages transferred\n", results.Transferred)
110
-
case results.Pages != results.Transferred:
111
-
log.Printf("checkpoint: %d pages, %d transferred\n", results.Pages, results.Transferred)
143
+
if eventCount%25_000 == 0 {
144
+
var results CheckpointResults
145
+
err = dbCnx.QueryRowContext(ctx, "PRAGMA wal_checkpoint(RESTART)").Scan(&results.Blocked, &results.Pages, &results.Transferred)
148
+
log.Printf("failed checkpoint: %v\n", err)
149
+
case results.Blocked == 1:
150
+
log.Printf("checkpoint: blocked\n")
151
+
case results.Pages == results.Transferred:
152
+
log.Printf("checkpoint: %d pages transferred\n", results.Transferred)
153
+
case results.Pages != results.Transferred:
154
+
log.Printf("checkpoint: %d pages, %d transferred\n", results.Pages, results.Transferred)
dbTx, err = dbCnx.BeginTx(ctx, nil)
log.Printf("failed to begin transaction: %v\n", err)
163
+
log.Printf("queue size: %d\n", queue.Size())
···
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
126
-
conn, _, err := websocket.DefaultDialer.Dial(JetstreamUrl, nil)
172
+
conn, _, err := websocket.DefaultDialer.DialContext(ctx, JetstreamUrl, nil)
log.Fatalf("failed to open websocket: %v\n", err)
···
log.Printf("db closed\n")
152
-
jetstreamEvents := make(chan []byte)
153
-
go handler(ctx, jetstreamEvents, dbCnx)
198
+
queue := NewQueue(100_000)
199
+
go handler(ctx, queue, dbCnx)
log.Printf("starting up\n")
158
-
_, message, err := conn.ReadMessage()
204
+
var event jetstream.Event
205
+
err := conn.ReadJSON(&event)
207
+
log.Printf("ReadJSON error: %v\n", err)
162
-
jetstreamEvents <- message
211
+
queue.Enqueue(event)