this repo has no description

Add FirehoseManager

Changed files
+29 -10
+7 -10
feedgen.py
···
import asyncio
import dag_cbor
-
import redis
import sys
import websockets
from atproto import CAR
···
from feeds.rapidfire import RapidFireFeed
from feeds.popular import PopularFeed
+
from firehose_utils import FirehoseManager
+
async def firehose_events():
-
redis_cnx = redis.Redis()
+
firehose_manager = FirehoseManager()
+
relay_url = 'wss://bsky.network/xrpc/com.atproto.sync.subscribeRepos'
-
firehose_seq = redis_cnx.get('dev.edavis.feedgen.seq')
-
if firehose_seq:
-
relay_url += f'?cursor={firehose_seq.decode()}'
+
seq = firehose_manager.get_sequence_number()
+
if seq:
+
relay_url += f'?cursor={seq}'
sys.stdout.write(f'opening websocket connection to {relay_url}\n')
sys.stdout.flush()
async with websockets.connect(relay_url, ping_timeout=None) as firehose:
-
op_count = 0
while True:
frame = BytesIO(await firehose.recv())
header = dag_cbor.decode(frame, allow_concat=True)
···
repo_op['record'] = car_parsed.blocks[repo_op['cid']]
message['op'] = repo_op
yield message
-
-
op_count += 1
-
if op_count % 500 == 0:
-
redis_cnx.set('dev.edavis.feedgen.seq', payload['seq'])
async def main():
manager = Manager()
+22
firehose_utils.py
···
+
import apsw
import dag_cbor
import redis
import sys
import websockets
from atproto import CAR
from io import BytesIO
+
+
class FirehoseManager:
+
def __init__(self, fname='firehose.db'):
+
self.db_cnx = apsw.Connection(fname)
+
with self.db_cnx:
+
self.db_cnx.execute("create table if not exists firehose(key text unique, value text)")
+
+
def get_sequence_number(self):
+
cur = self.db_cnx.execute("select * from firehose where key = 'seq'")
+
row = cur.fetchone()
+
if row is None:
+
return None
+
(key, value) = row
+
return int(value)
+
+
def set_sequence_number(self, value):
+
with self.db_cnx:
+
self.db_cnx.execute(
+
"insert into firehose (key, value) values ('seq', :value) on conflict(key) do update set value = :value",
+
dict(value=value)
+
)
async def bsky_activity():
redis_cnx = redis.Redis()