this repo has no description

knotserver/jetstream: start jetstream watcher from last time_us

If last time_us is older than a week, we discard it and start over.
This also refreshes the saved last time_us in the database.

Changed files
+48 -11
knotserver
+4 -7
knotserver/db/init.go
··· 20 create table if not exists known_dids ( 21 did text primary key 22 ); 23 create table if not exists public_keys ( 24 id integer primary key autoincrement, 25 did text not null, ··· 37 created timestamp default current_timestamp, 38 unique(did, name) 39 ); 40 - create table if not exists access_levels ( 41 id integer primary key autoincrement, 42 - repo_id integer not null, 43 - did text not null, 44 - access text not null check (access in ('OWNER', 'WRITER')), 45 - created timestamp default current_timestamp, 46 - unique(repo_id, did), 47 - foreign key (repo_id) references repos(id) on delete cascade 48 ); 49 `) 50 if err != nil {
··· 20 create table if not exists known_dids ( 21 did text primary key 22 ); 23 + 24 create table if not exists public_keys ( 25 id integer primary key autoincrement, 26 did text not null, ··· 38 created timestamp default current_timestamp, 39 unique(did, name) 40 ); 41 + 42 + create table if not exists _jetstream ( 43 id integer primary key autoincrement, 44 + last_time_us integer not null 45 ); 46 `) 47 if err != nil {
+13
knotserver/db/jetstream.go
···
··· 1 + package db 2 + 3 + func (d *DB) SaveLastTimeUs(lastTimeUs int64) error { 4 + _, err := d.db.Exec(`insert into _jetstream (last_time_us) values (?)`, lastTimeUs) 5 + return err 6 + } 7 + 8 + func (d *DB) GetLastTimeUs() (int64, error) { 9 + var lastTimeUs int64 10 + row := d.db.QueryRow(`select last_time_us from _jetstream`) 11 + err := row.Scan(&lastTimeUs) 12 + return lastTimeUs, err 13 + }
+26 -1
knotserver/handler.go
··· 6 "fmt" 7 "log" 8 "net/http" 9 10 "github.com/go-chi/chi/v5" 11 tangled "github.com/sotangled/tangled/api/tangled" ··· 109 collections := []string{tangled.PublicKeyNSID, tangled.KnotMemberNSID} 110 dids := []string{} 111 112 h.js = jsclient.NewJetstreamClient(collections, dids) 113 - messages, err := h.js.ReadJetstream(ctx) 114 if err != nil { 115 return fmt.Errorf("failed to read from jetstream: %w", err) 116 } ··· 150 h.e.AddMember(ThisServer, record["member"].(string)) 151 } 152 default: 153 } 154 } 155
··· 6 "fmt" 7 "log" 8 "net/http" 9 + "time" 10 11 "github.com/go-chi/chi/v5" 12 tangled "github.com/sotangled/tangled/api/tangled" ··· 110 collections := []string{tangled.PublicKeyNSID, tangled.KnotMemberNSID} 111 dids := []string{} 112 113 + var lastTimeUs int64 114 + var err error 115 + lastTimeUs, err = h.db.GetLastTimeUs() 116 + if err != nil { 117 + log.Println("couldn't get last time us, starting from now") 118 + lastTimeUs = time.Now().UnixMicro() 119 + } 120 + // If last time is older than a week, start from now 121 + if time.Now().UnixMicro()-lastTimeUs > 7*24*60*60*1000*1000 { 122 + lastTimeUs = time.Now().UnixMicro() 123 + log.Printf("last time us is older than a week. discarding that and starting from now.") 124 + err = h.db.SaveLastTimeUs(lastTimeUs) 125 + if err != nil { 126 + log.Println("failed to save last time us") 127 + } 128 + } 129 + 130 + log.Printf("found last time_us %d", lastTimeUs) 131 + 132 h.js = jsclient.NewJetstreamClient(collections, dids) 133 + messages, err := h.js.ReadJetstream(ctx, lastTimeUs) 134 if err != nil { 135 return fmt.Errorf("failed to read from jetstream: %w", err) 136 } ··· 170 h.e.AddMember(ThisServer, record["member"].(string)) 171 } 172 default: 173 + } 174 + 175 + lastTimeUs := int64(data["time_us"].(float64)) 176 + if err := h.db.SaveLastTimeUs(lastTimeUs); err != nil { 177 + log.Printf("failed to save last time us: %v", err) 178 } 179 } 180
+5 -3
knotserver/jsclient/jetstream.go
··· 153 } 154 } 155 156 - func (j *JetstreamClient) ReadJetstream(ctx context.Context) (chan []byte, error) { 157 - fiveSecondsAgo := time.Now().Add(-5 * time.Second).UnixMicro() 158 159 - if err := j.connect(fiveSecondsAgo); err != nil { 160 log.Printf("error connecting to jetstream: %v", err) 161 return nil, err 162 }
··· 153 } 154 } 155 156 + func (j *JetstreamClient) ReadJetstream(ctx context.Context, lastTimestamp int64) (chan []byte, error) { 157 + if lastTimestamp == 0 { 158 + lastTimestamp = time.Now().Add(-5 * time.Second).UnixMicro() 159 + } 160 161 + if err := j.connect(lastTimestamp); err != nil { 162 log.Printf("error connecting to jetstream: %v", err) 163 return nil, err 164 }