···
"github.com/bluesky-social/indigo/api/atproto"
-
comatproto "github.com/bluesky-social/indigo/api/atproto"
"github.com/bluesky-social/indigo/backfill"
"github.com/bluesky-social/indigo/events"
"github.com/bluesky-social/indigo/events/schedulers/parallel"
···
func handleCreate(ctx context.Context, repo, rev, path string, rec *[]byte, cid *cid.Cid) error {
···
log.New(os.Stdout, "\n", log.LstdFlags),
-
SlowThreshold: 5*time.Second,
db, err := gorm.Open(sqlite.Open("state.db"), &gorm.Config{
···
sl.Error("failed to connect to database", "err", err)
db.AutoMigrate(&backfill.GormDBJob{})
store := backfill.NewGormstore(db)
-
// connect to the relay
-
con, _, err := websocket.DefaultDialer.Dial("wss://bsky.network/xrpc/com.atproto.sync.subscribeRepos", http.Header{
-
"User-Agent": []string{"backfiller/0.1 (@edavis.dev)"},
-
sl.Error("failed to connect to relay", "err", err)
opts := &backfill.BackfillOptions{
ParallelRecordCreates: 100,
···
bf := backfill.NewBackfiller("backfills", store, handleCreate, handleUpdate, handleDelete, opts)
go func(ctx context.Context, bf *backfill.Backfiller) {
if err := pumpRepos(ctx, bf); err != nil {
···
// read from the firehose
rsc := events.RepoStreamCallbacks{
-
RepoCommit: func(evt *comatproto.SyncSubscribeRepos_Commit) error {
-
job, err := bf.Store.GetJob(ctx, evt.Repo)
-
if errors.Is(err, backfill.ErrJobNotFound) {
-
return fmt.Errorf("error getting job: %w", err)
-
return bf.HandleEvent(ctx, evt)
sched := parallel.NewScheduler(16, 100, "firehose", rsc.EventHandler)
···
"github.com/bluesky-social/indigo/api/atproto"
"github.com/bluesky-social/indigo/backfill"
"github.com/bluesky-social/indigo/events"
"github.com/bluesky-social/indigo/events/schedulers/parallel"
···
+
type cursorRecord struct {
+
ID uint `gorm:"primaryKey"`
func handleCreate(ctx context.Context, repo, rev, path string, rec *[]byte, cid *cid.Cid) error {
···
log.New(os.Stdout, "\n", log.LstdFlags),
+
SlowThreshold: 5 * time.Second,
db, err := gorm.Open(sqlite.Open("state.db"), &gorm.Config{
···
sl.Error("failed to connect to database", "err", err)
db.AutoMigrate(&backfill.GormDBJob{})
+
db.AutoMigrate(&cursorRecord{})
store := backfill.NewGormstore(db)
+
// create and start the backfiller
opts := &backfill.BackfillOptions{
ParallelRecordCreates: 100,
···
bf := backfill.NewBackfiller("backfills", store, handleCreate, handleUpdate, handleDelete, opts)
+
// set up the backend service
+
backend := NewBackend(db, bf)
+
go backend.syncCursorRoutine()
+
// connect to the relay
+
subscribeUrl := "wss://bsky.network/xrpc/com.atproto.sync.subscribeRepos"
+
curs, err := backend.LoadCursor()
+
sl.Error("error loading firehose cursor", "err", err)
+
subscribeUrl += "?cursor=" + strconv.Itoa(curs)
+
con, _, err := websocket.DefaultDialer.Dial(subscribeUrl, http.Header{
+
"User-Agent": []string{"backfiller/0.1 (@edavis.dev)"},
+
sl.Error("failed to connect to relay", "err", err)
go func(ctx context.Context, bf *backfill.Backfiller) {
if err := pumpRepos(ctx, bf); err != nil {
···
// read from the firehose
rsc := events.RepoStreamCallbacks{
+
RepoCommit: func(evt *atproto.SyncSubscribeRepos_Commit) error {
+
return backend.RepoCommitHandler(ctx, evt)
sched := parallel.NewScheduler(16, 100, "firehose", rsc.EventHandler)