···
appbsky "github.com/bluesky-social/indigo/api/bsky"
jetstream "github.com/bluesky-social/jetstream/pkg/models"
···
"github.com/redis/go-redis/v9"
22
+
events []jetstream.Event
25
+
func NewQueue(capacity int) *Queue {
27
+
events: make([]jetstream.Event, 0, capacity),
31
+
func (q *Queue) Enqueue(event jetstream.Event) {
35
+
q.events = append(q.events, event)
38
+
func (q *Queue) Dequeue() (jetstream.Event, bool) {
42
+
var event jetstream.Event
44
+
if len(q.events) == 0 {
49
+
q.events = q.events[1:]
53
+
func (q *Queue) Size() int {
57
+
return len(q.events)
const JetstreamUrl = `wss://jetstream1.us-west.bsky.network/subscribe`
var AppBskyAllowlist = map[string]bool{
···
62
-
func handler(ctx context.Context, events <-chan jetstream.Event) {
104
+
func handler(ctx context.Context, queue *Queue) {
rdb := redis.NewClient(&redis.Options{
···
72
-
for event := range events {
121
+
event, ok := queue.Dequeue()
123
+
time.Sleep(100 * time.Millisecond)
if event.Kind != jetstream.EventKindCommit {
···
if _, err := pipe.Exec(ctx); err != nil {
log.Printf("failed to exec pipe\n")
196
+
log.Printf("queue size: %d\n", queue.Size())
···
log.Printf("websocket closed\n")
167
-
jetstreamEvents := make(chan jetstream.Event)
168
-
go handler(ctx, jetstreamEvents)
216
+
queue := NewQueue(100_000)
217
+
go handler(ctx, queue)
log.Printf("starting up\n")
171
-
var event jetstream.Event
174
-
event = jetstream.Event{}
222
+
var event jetstream.Event
err := conn.ReadJSON(&event)
log.Printf("ReadJSON error: %v\n", err)
181
-
jetstreamEvents <- event
229
+
queue.Enqueue(event)